Linux 物理器内存,Linux如何为其物理分配器分配内存?

我最近正在深入研究Linux内存管理的细节,因为我想为自己的玩具内核实现类似的东西,所以我希望熟悉细节的人能帮助我理解一件事.显然,物理内存管理器是伙伴算法,它进一步专门用于返回特定顺序的页面块(0到9,其中0只是一个页面).对于每个订单,块都存储为链接列表.假设如果请求了一个5阶块但在5阶块列表中找不到,则该算法按顺序搜索一个块,将其分成两部分,给出所请求的一半并将另一半的顺序移动到较低的位置(如它的大小只有一半).

我没有得到的是内核如何存储这些结构,或者它如何为它们分配空间.因为对于订单0页面,您需要1M条目(每个是4KiB页面),这是否意味着内核分配1MiB * sizeof(结构页面)?订单1及以上的块怎么样?内核是否通过将它们标记为更高的顺序来重用已分配的块,并且当它需要将它分成两个时,只返回块并获得一个未使用的块?

解决方法:

What I don’t get is how the kernel stores these structures, or how it allocates space for them. Since for order 0 pages you would need 1M entries (each is a 4KiB page), does it mean that the kernel allocates 1MiB * sizeof(struct page)?

690 /*

691 * paging_init() sets up the page tables - note that the first 8MB are

692 * already mapped by head.S.

...*/

697 void __init paging_init(void)

698 {

699 pagetable_init();

...

711 zone_sizes_init();

712 }

pagetable_init()在1024 pgd_ts的swapper_pg_dir数组中创建内核页表.

> calculate_node_totalpages()打印dmesg中每个节点的页数

> alloc_node_mem_map()为该节点中的每个物理页面分配struct页面的实际工作;它们的内存由bootmem分配器doc1 doc2分配(您可以通过bootmem_debug = 1内核引导选项查看其调试):

4936 size =(end – start)* sizeof(struct page);

4937 map = alloc_remap(pgdat-> node_id,size);

if(!map)map = memblock_virt_alloc_node_nopanic(size,pgdat-> node_id);

free_area_init_core() The memory map is built, and the freelists and buddy bitmaps initialized, in free_area_init_core().

初始化每个区域中的免费订单列表,并将订单标记为没有任何免费页面:free_area_init_core() – > init_currently_empty_zone() – > zone_init_free_lists:

4147 static void __meminit zone_init_free_lists(struct zone *zone)

4148 {

4149 unsigned int order, t;

4150 for_each_migratetype_order(order, t) {

4151 INIT_LIST_HEAD(&zone->free_area[order].free_list[t]);

4152 zone->free_area[order].nr_free = 0;

4153 }

4154 }

PS:内核中有init(),名为start_kernel(),LXR(Linux交叉引用)将帮助您在函数之间导航(我发布了链接到lxr.free-electrons.com,但有几个在线LXR) :

501 asmlinkage __visible void __init start_kernel(void)

...

528 boot_cpu_init();

529 page_address_init();

530 pr_notice("%s", linux_banner);

531 setup_arch(&command_line);

标签:memory-management,c-3,linux,linux-kernel,kernel

来源: https://codeday.me/bug/20190623/1275132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值