0

我是Linux内核学习的新手。现在我正在阅读旧版本 2.4 的 Linux 内核代码。从书中,我知道在引导程序中激活了一个临时的 page_table,它将 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->node_bootmem_map,0xff,mapsize);” 在倒数第二行?

4

1 回答 1

0

我对 2.4 的引导过程不是很熟悉,但是此时页表可能已经初始化,但是内核实际上已经转换到保护模式了吗?在这种情况发生之前(至少在英特尔架构上),您处于 x86 实模式,您将直接寻址物理帧。

于 2013-11-04T03:30:30.540 回答