笔记3-实模式与保护模式

1. 用freedos的缘由

读书不仔细,检讨。

列子chapter3.1-a,编译后,.bin大小为149bytes,将第2章中的a.img和bochsrc复制过来继续使用,可用。

因为代码量小于512字节,且末2字节仍然为0xAA55(没有被覆盖掉),所以引导扇区有效,可以作为引导磁盘使用。

 

看作者介绍freedos时没有仔细看,当时还疑问作者为什么要无故介绍这个。在学习3.2时,在经历一番痛苦后终于明了,读书不仔细是要吃亏的。

 

因为chapter3.2-b,编译后,.bin大小远远超过512bytes,将其写入a.img直接导致软盘的0面0道1扇区的512字节的末2字节被覆盖,于是运行bochs会提示找不到可引导盘。

 

经历几番折腾后,突然想起是不是0xAA55没有了,是不是代码量超过了512bytes,哦,明白了。

 

2. 关于“逻辑地址”、“线性地址”和“物理地址”

实模式下

一个地址(即物理地址)由“段值:偏移”确定。“段值”为16位的cs、ds等段寄存器,“偏移”可由16位的寄存器或常数(符号标识)给出。物理地址的计算公式为:

        物理地址(Physical Address ) = 段值(Segment)x 16 + 偏移(Offset)

 

保护模式下:

逻辑地址:由“段值:偏移”确定。“段值”仍旧是16位的段寄存器,叫做选择子(Selector),作为查找段描述符表的索引,“偏移”可为32位的寄存器或常数。

 

线性地址:根据逻辑地址中的选择子找到段基址,然后加上偏移值,即为线性地址。

 

物理地址:当不启用分页机制时,线性地址 = 物理地址;如果启用了分页机制,则需要从线性地址得到页目录和页表,转换后才能得到物理地址。这个还不懂,以后补充。

 

3. 实模式跳到保护模式步骤

    step 1: 准备GDT。在定义时,通常只定义了段界限和段属性,段基址常常需要通过代码重新赋值。

    step 2: 用lgdt加载gdtr寄存器。gdtr为48位寄存器,高32位为GDT表的段基址,低16位为GDT界限,即长度。

    step 3:打开A20地址线

    step 4:置cr0的PE位,进入保护模式

    step 5:跳转,运行保护模式的代码

 

4. 关于mov [LABEL_GO_BACK_TO_REAL + 3], ax 这句话

刚开始看了好久,一直在用单片机的思维想,这不是自己修改自己代码吗,code存放在flash里,怎么可能可以自己修改呢?!

 

良久,才想起来,这段代码虽然存放在软盘中,后来不是被BIOS加载到7c00h内存中去了吗,前面运行的代码修改后面内存中的内容,当然可以啊。顿悟!

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值