漫长黑暗的史前时代终于到达安装。在安装Linux功能的汇编程序,完成对史前文明转型到现代文明通过设置CR0登记的PE(从实模式切换到保护模式),安装期间,Linux已经得知世界上可用的内存资源远远超过1MB。在这一点上,Linux的欲望开始扩张,以满足其欲望的第一步,并开始抢占内存资源的前8mb。



该临时内核页表的初始化是在startup_32汇编语言函数完成。在ULK,假设内核可以容纳的8MB RAM空间,然后在身份地图RAM 8mb(如用户0x00003000地址物理地址映射0x00003000,0xc0003000映射到物理地址,0x00003000)初始化临时页全局目录swapper_pg_dir和相应的页表映射8mb只需要填零,1, 768,和swapper_pg_dir.the前两项,769项是用户线性地址映射,和接下来的两项映射到内核的线性地址,在页全局目录的两项映射8MB的原因2倍;1024(页表有1024项)倍;4k(页面的大小)= 8m.it不是硬规则对RAM的预8mb映射初始化内核页表。它取决于你的内核配置(我认为大多数情况下都是8mb映射)。正如你所看到的startup_32,多少内存映射是通过PG0动态判断。



Linux / / /拱i386内核的 /头。



page_pde_offset =(__page_offset > 20);



/ * __page_offset是0xc0000000起始地址,内核的线性空间。



page_pde_offset = 0xc00(十进制的3072)。



movl $(PG0 - __page_offset),%的EDI



的 / * PG0线性地址中可以找到 /启动/ System.map文件。我0xc04f4000 ubuntu8.04机。



减去0xc0000000是PG0物理地址(004f4000)放入EDI。* /



movl $(swapper_pg_dir - __page_offset),íx



的 / * swapper_pg_dir线性地址也可以发现在 /启动/ System.map文件,我的机器是0xc047d000。



减去0xc0000000是swapper_pg_dir物理地址(0047d000)放入EDX。* /



0x007 movl美元,êx 0x007 =礼物+ RW +用户 / * * /



/ *页目录项页表和低12位是国旗,国旗在eax 0x007。* /



10:



法律0x007(% EDI)、ìx创建PDE进入 / * * /



在第一周期 / * EDI点PG0加0x007在ECX的物理地址。



第二周期,由EDI的物理地址0x4f5000添加到0x007到ecx。* /



movl ìx、店面识别PDE(íx) / * * /进入



*在零年swapper_pg_dir内容ECX第一周期。



第二周期,把ecx的内容在swapper_pg_dir第一项。* /



movl ìx page_pde_offset(íx)存储内核的PDE进入 / * * /



*在第七百六十八年的swapper_pg_dir内容ECX第一周期。因为page_pde_offset价值计算为3072,在前面,在swapper_pg_dir每个项目是4个字节,所以3072 / 4 = 768。



第二周期,把ecx的内容在swapper_pg_dir * /第七百六十九项。



附加4美元,íx



*第一周期,EDX对swapper_pg_dir第一。



在第二周期时间,EDX点的swapper_pg_dir二项。* /



movl 1024美元、ìx



1024 初始化页面表设置计数



11:



stosl



*中把内容分为物理地址所指向的EDI,然后EDI + 4。* /



附加为0x1000,êx



环11b



应该跳到11以上的循环。



经过1024次,第一次执行PG0,0x4f4000地址存放在0x007,0x1007,0x2007,0x3ff007,这是目前能从0x3fffff 0x000到物理地址的地图。此时EDI的值是0x4f5000。



在1024次执行后,物理地址(0x4f5000)开始储存0x400007,0x401007,0x402007,…,7ff007,即它可以映射到物理地址0x000到7fffff目前只是8MB。此时EDI的值是0x4f6000 / *。



莱阿尔(init_map_beyond_end + 0x007)(% EDI),EBP



/ * init_map_beyond_end是128K的值,此文件中的宏定义。添加EDI的物理地址到128K的加0x007放在EDP。* /



Cmpl EBP,êx



/ *在0x515007 EBP的值的第一个周期,0x400007 eax的值小于0x515007。最大的物理地址的映射,是目前0x3fffff不包含0x515007,所以没有映射。



第二周期,EBP的值是0x516007,在EAX值0x800007大于0x516007。最大的物理地址的映射,是目前0x7fffff包含0x516007,所以简单的物理地址的映射。* /



JB 10b



第一个循环完成时,跳转到10以上继续循环。



第二个循环在完成时退出循环。



movl íi,(init_pg_tables_end - __page_offset)



*最后把0x4f6000在init_pg_tables_end物理地址。这是 /启动/ / * System.map,太。



在这个时候,Linux的胃口越来越大,和8MB的资源不能满足它的胃口。黑色的手开始慢慢扩大到内存低于896mb。