inno setup修改properties格式内容_linux内核修炼之setup

88639652610e0ff7b0235b3251588198.png

先讲一下代码在跑到setup之前的内存视图,有助于我们更好地理解setup中的操作。

在上电时,内存视图如下:

在内存的0x0位置是BIOS的中断向量表

13534517948e8c9eba6ed8f23328c131.png

执行Bootset之后,内存视图如下:

Bootset首先将自己本身读到了0x90000的位置,然后将4个区块的setup读入0x90200,然后打印出正在加载系统,然后将system读到0x10000的位置。

02a339d18c03599a62bbafc97f400b39.png

下面分析setup代码

代码在开头的一大部门是先通过BIOS中断读取一些硬件信息到0x90000~0x900A0的位置(覆盖了bootset)

然后接下来是将原来位于0x10000的system移动到0x0处,这样,BIOS的中断表都被覆盖了,因此中断不能用了。

a4cd8db859337ad618e301f22f002060.png
图 重复move的代码

移动完之后,需要安装GDT和IDT表,IDT表长度为0,地址也为0;GDT表长度0x800,地址为(0x0000 0000 0009 0000)+(0x200,里面有刚读入存储的硬件信息)+(gdt标号相对于setup程序头部的偏移),该地址是32位的线性地址。在setup中安装的GDT和IDT都是临时的,只是为了jmpi 0,8这一个保护模式指令用的,后续子啊head.s中会重新安装GDT和IDT,但是那时IDT的内容是空的,等到外设初始化的时候才会装入中断入口函数。

GDT表中有三个表项:空项、system内核段、system内核数据段

e6c4f0d6da897bee5be9e9fa8f759bde.png
图 move完之后要安装GDT和LDT

950b84774968ddfbf4ea37220394c1ad.png
图 存储IDT和GDT的长度与地址的标号

将下图与GDT表项格式进行对比看,可以发现,内核代码段描述符的基地址组合起来就是0x0,内核数据段基地址也是0x0.

0b96a6482efce3c8527c832a2f46ef3a.png
图 3个GDT表

接下来开启A20地址线并置位CR0,最后使用指令jmpi 0 , 8 ,则CS = 8 即GDT表中第八个字节往后,这是内核代码段,EIP=0,组合起来即0x0,这个地址正是move后的system地址。

48d65fcbcfef65f6a6c7faaa06612874.png

7da04ab8f6c5b662416d7d59b3feeb3f.png
图 开启A20地址线并置位CR0

Setup执行完后的内存视图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值