我是Linux内核学习的新手。现在我正在阅读旧版2.4的Linux内核代码。从书中我知道临时page_table在bootstrap中被激活,它将PAGE_OFFSET~PAGE_OFFSET + 8M和0~8M映射到物理0~8M。但是在函数init_bootmem_core中,您可以看到代码:
bootmem_data_t *bdata = pgdat->bdata;
unsigned long mapsize = ((end - start)+7)/8;
pgdat->node_next = pgdat_list;
pgdat_list = pgdat;
mapsize = (mapsize + (sizeof(long) - 1UL)) & ~(sizeof(long) - 1UL);
bdata->node_bootmem_map = phys_to_virt(mapstart << PAGE_SHIFT);
bdata->node_boot_start = (start << PAGE_SHIFT);
bdata->node_low_pfn = end;
/*
* Initially all pages are reserved - setup_arch() has to
* register free RAM areas explicitly.
*/
memset(bdata->node_bootmem_map, 0xff, mapsize);
return mapsize;
mapstart等于内核之后的第一个页码,并且它没有映射到临时page_table中,如何使用“memset(bdata-&gt; node_bootmem_map,0xff,mapsize);”在倒数第二行?
答案 0 :(得分:0)
我不熟悉2.4启动过程,但此时页面表可能已初始化,但内核实际上已转换为保护模式了吗?在此之前(至少在英特尔架构上),您已经处于x86实模式,您可以在其中直接寻址物理帧。