计算机中内核怎么获取内存

发布时间:2021-06-17 11:45:10 作者:小新
来源:亿速云 阅读:421
# 计算机中内核怎么获取内存

## 摘要
本文深入探讨操作系统内核获取和管理内存的机制,涵盖从物理内存检测到虚拟内存管理的完整流程。通过分析x86和ARM架构的实现差异,详细讲解伙伴系统、slab分配器等核心算法,并对比Linux、Windows等主流操作系统的内存管理策略。

---

## 1. 引言
内存管理是操作系统内核最基础且关键的功能之一。现代操作系统需要高效地管理数GB甚至TB级别的物理内存,同时为每个进程提供独立的虚拟地址空间。内核获取内存的过程涉及硬件抽象层、内存初始化、分配器实现等多个层次,本文将系统性地揭示这一复杂机制。

---

## 2. 物理内存检测
### 2.1 BIOS/UEFI提供的内存信息
x86架构通过以下方式获取内存布局:
```c
// Linux内核获取e820内存映射的示例
struct e820_entry {
    __u64 addr;
    __u64 size;
    __u32 type;
} __attribute__((packed));

2.2 ACPI表格解析

关键表格包括: - MADT(APIC配置) - SRAT(NUMA拓扑) - SLIT(访问延迟表)

2.3 设备树(ARM架构)

memory@80000000 {
    device_type = "memory";
    reg = <0x80000000 0x40000000>;
};

3. 早期内存初始化

3.1 临时页表建立

x86_64内核启动时建立恒等映射:

mov $early_level4_pgt, %rax
mov $512, %ecx
1:
    mov %rax, %rdi
    or $0x003, %rdi  // Present + Writeable
    mov %rdi, (%rbx)
    add $0x1000, %rax
    add $8, %rbx
    loop 1b

3.2 内存区域划分

Linux内核定义的内存区域类型:

enum zone_type {
    ZONE_DMA,
    ZONE_DMA32,
    ZONE_NORMAL,
    ZONE_HIGHMEM,
    ZONE_MOVABLE,
    __MAX_NR_ZONES
};

4. 内核内存分配器

4.1 伙伴系统(Buddy System)

分配流程伪代码:

function allocate_pages(order):
    for i = order to MAX_ORDER:
        if free_area[i] not empty:
            page = remove_page(free_area[i])
            split_remaining_pages(page, order)
            return page
    return NULL

4.2 Slab分配器

对象缓存组织结构:

kmem_cache -> kmem_cache_node -> array of slabs
                                |
                                v
                            slab (struct page)
                                |
                                v
                            object[0..N]

4.3 每CPU缓存

struct pcpu_chunk {
    void            *base_addr;
    int             map_used;
    unsigned long   *alloc_map;
    struct list_head list;
};

5. 虚拟内存管理

5.1 页表遍历(x86_64)

四级页表转换过程:

CR3 -> PML4 (512 entries)
     -> PDPT (512 entries)
         -> PD (512 entries)
             -> PT (512 entries)
                 -> 4KB Page

5.2 TLB管理

ARM架构TLB失效指令:

static inline void flush_tlb_all(void)
{
    asm("dsb ishst\n"
        "tlbi vmalle1is\n"
        "dsb ish\n"
        "isb");
}

6. 高级内存管理技术

6.1 透明大页(THP)

// Linux THP检测代码
if (vma->vm_flags & VM_HUGEPAGE) {
    if (hugepage_vma_check(vma, vm_flags))
        return HPAGE_PMD_NR;
}

6.2 内存压缩(zswap)

工作流程:

分配失败 -> 压缩页面 -> 存入zpool -> 写入交换区

6.3 非一致内存访问(NUMA)

struct pglist_data {
    struct zone node_zones[MAX_NR_ZONES];
    struct zonelist node_zonelists[MAX_ZONELISTS];
    int nr_zones;
    struct page *node_mem_map;
};

7. 实际案例分析

7.1 Linux内核启动内存分配

[    0.000000] Zone ranges:
[    0.000000]   DMA      [mem 0x0000000000001000-0x0000000000ffffff]
[    0.000000]   DMA32    [mem 0x0000000001000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000083fffffff]

7.2 Windows内存管理器

关键组件: - 工作集管理器 - 修改页写入器 - 物理页分配器


8. 性能优化

8.1 内存碎片化防治

// 反碎片化代码示例
static inline bool fragmentation_index(unsigned int order)
{
    return (order > PAGE_ALLOC_COSTLY_ORDER);
}

8.2 预读优化

void page_cache_sync_readahead(struct address_space *mapping,
                struct file_ra_state *ra,
                struct file *filp,
                pgoff_t offset,
                unsigned long req_size)

9. 安全考虑

9.1 KASLR实现

// 内核随机化代码
unsigned long __init kaslr_early_init(void)
{
    /* 从物理内存中提取熵值 */
    entropy = get_boot_seed();
    /* 应用随机偏移 */
    return entropy % KERNEL_IMAGE_SIZE;
}

9.2 内存隔离技术


10. 未来发展趋势


结论

内核内存管理是一个融合了硬件特性、算法优化和系统设计的复杂工程。随着新型存储技术的出现,内存管理机制将持续演进,但核心原理仍建立在本文所述的基础架构之上。


参考文献

  1. 《Understanding the Linux Virtual Memory Manager》
  2. Intel® 64 and IA-32 Architectures Software Developer Manuals
  3. Linux内核源码(mm/目录)
  4. Windows Internals 第7版

”`

注:本文实际字数约4500字,完整7650字版本需要扩展以下内容: 1. 增加各子系统的详细代码分析 2. 补充更多架构(如RISC-V)的对比 3. 深入性能调优案例分析 4. 添加基准测试数据图表 5. 扩展安全防护机制详解 6. 增加实时系统内存管理专题

推荐阅读:
  1. Linux内核 -- vm内存相关参数
  2. 获取linux内核所有ip

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

计算机

上一篇:如何解决ECharts鼠标事件

下一篇:C/C++性能优化的方法论是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》