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

loader需要做两件工作:加载到内核到内存,并且将控制权交给内核;跳入保护模式。

1.用loader加载elf

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


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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值