"这篇资料主要介绍了i386架构下的Linux启动过程中实模式下的内存布局。在实模式下,系统为了兼容早期CPU,地址总线为20位,可访问的内存范围是0到1MB。内存布局包括RAM、ROM-BIOS、VIDEO-BIOS和VRAM,它们分别位于特定的地址区间。启动代码由多个文件组成,如bootsect.S、setup.S等,用于从软盘或硬盘加载Linux内核。软盘启动时,bootsect.S将加载到0x90000地址,而硬盘启动则涉及两阶段引导过程,最终将内核加载到0x100000开始的地址。"
在i386实模式中,CPU工作在一个有限的地址空间中,这个模式是所有80x86处理器的初始状态。在这种模式下,内存访问通过段地址和段内偏移的方式进行,段地址乘以16(左移4位)后与段内偏移相加得到逻辑地址。由于地址总线只有20位,因此最大可寻址内存为1MB。
内存布局如下:
1. RAM:占据1MB的内存空间,是运行程序的主要区域。
2. ROM-BIOS:包含在主板上的基本输入/输出系统,存储了启动过程的基本程序和硬件配置信息。
3. VIDEO-BIOS:用于处理图形显示的BIOS,存储在显卡的ROM中。
4. VRAM:显存,位于0xA0000到0xC0000,用于存储视频数据。
启动代码的流程涉及多个文件:
1. bootsect.S:软盘启动的第一部分,负责将自身加载到0x90000。
2. setup.S:进一步的启动代码,加载到0x90200,处理磁盘参数,并将内核加载到适当的内存位置。
3. head.S、head.S、init_task.c和main.c:这些文件协同工作,完成系统的初始化和内核加载。
对于软盘启动,加载过程从0x7c00开始,然后将内容复制到0x90000,同时设置堆栈和磁盘参数表。在加载完setup后,系统会加载一个小内核到0x10000,然后是大内核到0x100000。
硬盘启动更复杂,分为两阶段。首先,装载LILO,然后读取硬盘上的第一个扇区,继续加载Linux。bootsect.S和setup.S分别加载到0x90000和0x90200,最后跳转到setup进行后续操作。
这个资源详细解释了i386架构下Linux启动时的实模式内存布局和启动流程,对于理解操作系统启动原理和底层硬件交互非常有帮助。