计算机启动

计算机物理地址空间布局

物理地址空间布局
最开始的16位的Intel 8088处理器的物理地址空间只有1M=2^20,1024kb;
早期的PC的物理地址空间从0x00000000开始,在0x000FFFFF结束而不是0xFFFFFFFF结束。
最下面的640kb Low Memory区域是早期PC唯一可以使用的RAM;
上面的(1024kb-640kb)=384kb区域为硬件保留,像视频显示缓冲区,这个区域中的最重要的部分是Basic input/outpu System( BIOS),从0x000F0000到0x000FFFFF,总共64kb;早期存在ROM中,现在存在可以更新的**flash memory;**BIOS负责执行基础系统的初始化,比如激活Video card,检查安装了多少内存;
随着技术的发展,Intel 最终突破了1Mb的限制,出现了80286,80386,分别支持16MB,和4G的物理地址空间,为兼容之前的软件,架构师仍然保留了最初1MB的布局。
因此,在物理内存中有个"hole",从0x000A0000到0x00100000;RAM也被分割为两部分"low"or”conventional memory"(底部的640kb)和"extend memory";

The ROM BIOS

1)它设置中断描述符表并初始化各种设备,例如VGA显示器。在初始化pci bus后和BIOS知道的所有重要的设备。
2)它会寻找可启动设备,比如软盘,硬盘,或者光盘,最后它发现了一个bootable disk。
3)BIOS会从这个disk中读取boot loader,并且将控制转移给boot loader

The Boot Loader

PC硬盘被分割成512byte区域叫做扇区(sectors),扇区是硬盘转移的最小的颗粒度,每次读取都都必须是扇区的倍数;如果disk是bootable,那么它的第一个扇区就叫启动扇区(boot sector),因为boot loader code就在第一个扇区中。
boot loader程序主要做两件事:
1)boot loader会switches 处理器模式,从实模式到32位的保护模式。
2)boot loader会通过特殊的IO指令直接访问IDE disk device 寄存器从硬盘中读取Kernel.

加载完内核后,将控制转移给内核,开始进行操作系统的初始化。

The Kernel

boot loader的Elf文件头
我们可以看见,VMA(虚拟内存地址)和LMA(加载内存地址)的地址都是0x00007c00

Kernel Elf文件头
如上图,我们可以看到kernel的VMA和LMA分别为0xf0100000,0x00100000;虚拟内存地址跟加载内存地址不一样。
操作系统的内核通常被链接和运行再非常高的虚拟地址空间,比如0xf0100000,为了留下虚拟地址空间的低部分给用户程序使用。
许多的机器甚至没有物理内存地址 0xf0100000,(比如只有256MB的内存)所以更加谈不上将内核存储在那了。
所以我们会使用处理器内存管理硬件映射虚拟地址0xf0100000(内核代码期待运行的链接地址)到物理内存 0x00100000(引导程序将内核加载进这个物理内存);

现在,我们先需要map the first 4MB of 物理内存,我们通过手写,静态地初始化page directory 和一个page table,在进入内核设置CR0_PG标志之前,内存引用被视为物理内存,设置好了CR0_PG标志位后,内存引用就被当作虚拟内存需要被硬件翻译为物理地址。
任何对不在页目录中存在的虚拟内存的引用都会引发一个硬件异常。设置CR0_PG前后内存比较
我们可以看到设置CR0之前 ,地址0xf0100000的内存内容为00 00 00 00,地址0x00100000中有东西
设置CR0之后,两个地址对应的东西都是一样的,说明映射到来同一个物理内存地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值