操作系统的启动

来源:互联网 发布:淘宝买家喜好度 编辑:程序博客网 时间:2024/06/07 03:25

                                    bootsect.s


x86(inter)结构电脑刚开机时CPU处于实模式状态;cs<<4+ip
内存中有一段固化的代码(ROM bios)//基本输入输出,位于0xFFFF0


cs=0xFFFF//段寄存器   ip=0X0000//偏移


先检查硬件,如果不合格操作系统无法执行

start:

如果硬件通过则将磁盘中的0磁道的0扇区(操作系统的引导扇区)的内容读到0x07c00,紧接着cs=0x07c0,ip=0x0000

将bios读入的bootsect.s从0x7c00移到0x90000//留下这段空间留给操作系统使用

load_setup:

从磁盘的第二个扇区开始读四个扇区(setup)读入到内存0x90200处

ok_load_setup:

打印开机logo

read_it:

读入system模块 然后将控制权转交给setup去执行

                                              setup.s

start:

 完成OS启动前的设置

int 0x15(获得物理内存的大小)并保存//便于以后操作系统管理内存;
将得到的硬件设备的信息放到0x90000处;

do_move:

将system模块移到内存中的0地址处,跳到system的第一个模块开始执行(通过makefile来控制)


所有的源码通过MakeFile生成Image

setup最后:进入保护模式,临时建立一个GDT表并初始化

保护模式下的地址翻译:GDT(Global Describe Table),inter结构通过硬件产生32位地址cs(选择子)cs放的是查表的索引,利用下标查表得到基址+ip;

保护模式下的中段处理:IDT,找到中断处理函数的入口地址

                                                                          System


head.s->main.c





课后疑问:

10
单选(1分)

mem_init就是初始化一个数组,下面哪个论述不对?()

  • A.

    数组中的每个项表示固定大小的一段内存

  • B.

    初始化时将所有数组项中的内容都设置为0

  • C.

    mem_init调用之前可以不获得物理内存的大小

  • D.

    如果某个数组项中的内容为0,则表示对应的那一段内存空闲

    C为何正确????

0 0