首页 > 其他 > 详细

《自己动手写操作系统》第五章 从loader到内核

时间:2014-03-17 17:46:28      阅读:557      评论:0      收藏:0      [点我收藏+]
loader需要做两件工作:加载到内核到内存,并且将控制权交给内核;跳入保护模式。

1.用loader加载elf

    这个过程和用boot加载loader没有太大的区别,当然,其中有各种琐碎的细节和偏移,这个结合fat12文件格式和根目录项格式就可以明白。根目录中条目格式如下:
bubuko.com,布布扣


2.跳入保护模式,启动分页机制

    加载完成之后,我们需要进入保护模式,这里我们准备了代码段和数据段,然后是指向显存的段。
注意,我们从实模式和保护模式的切换边界,不要忘记初始化ds~fs;
对于段描述符的初始化,是放在实模式进行的;
进入保护模式之后,要迅速开启分页机制。

3.重新放置内核

    为了和elf格式兼容,所以必须要根据elf文件信息重新调整内核位置。对于elf文件中的每一个段,我们都要将它加载到对应的内核位置,这些信息都在elf文件之中。但是,不要急,这里有一个问题。ld生成的可执行文件中,p_vaddr的值总是类似于0x8048XXXX的值(为什么),而我们刚刚开启的线性映射,这个地址对应的物理地址在128M之外,显然这样是不行的。我们有两种选择 1)修改页表 2)修改加载地址。这里,我们采用后者进行处理,命令如下:
ld -s -Ttext 0x30400 -o kernel.bin kernel.o
    这样,程序的入口地址变成0x30400。我们来看一下kernel.bin的program Header.从中,我们可以看出,我们应该把从文件开头的40D字节的内容放到内存30000h的地方,由于程序入口在30400h的地方,所以代码只有0Dh+1字节。

4.向内核交出控制权利

    将内核重新放置以后,我们可以将控制权转交给内核了。而且,转交给内核之后,对Loader那部分的内存就可以重新利用了,等等,别忘了我们的esp和GDT等内容还保存在loader之中呢。所以,在下文对kernel进行扩充之前需要将这些内容挪到内核之中。

总结一下:BIOS——boot——loader——kernel

《自己动手写操作系统》第五章 从loader到内核,布布扣,bubuko.com

《自己动手写操作系统》第五章 从loader到内核

原文:http://blog.csdn.net/trochiluses/article/details/21399595

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!