对于进入保护模式的个人总结和一点感触
扫描二维码
随时随地手机看文章
1.最主要的就是那个jmp dword,一切都是为了Jmp做准备
2.int 13h读取扇区,既可以读硬盘,又可以读软盘,应该是两个的驱动器号不同(这个还没搞清楚,现在只会读软盘)。用硬盘映像的时候,总是说找不到引导设备,不知道是哪儿的参数错了。
一些细节:
>cl是读取的扇区号,1就是第1个扇区,并不是从0算起。
>kernel.s生成的就只有16B,所以只读取16字节。(其他的好像是0,回来试试看)
>读取成功了,bochs有时候会告诉你成功了,有时候不会。(一次告诉我读取了16B,一次告诉我读取了17个扇区)。
3.复制kernel到0:0处
>0:0处在实模式下放了256个中断向量号,每个向量号4字节
>movsb会自动把si,di加1,所以千万不要inc si,inc di,多此一举(我画蛇添足时调试总是感觉怎么不对劲,si一下增加2了,我还以为inc指令有问题)
>复制完了后,有些中断向量号就被淹没了,不能用了。
4加载GDT
>注意lgdt时,加载数据的格式。数据地址越高,就在高位。
>>如 DW 0X0000 DW gdt+0x7c00,0x0000.最后形成的GDTR内容就是0x0000,gdt+0x7c00,0x0000
>gdt是便宜地址,所以要加上这个段的起始地址0x7c00
>代码段描述符的数据格式也要注意
>>DW 0XFFFF 0X0000 0X9E00 0X0000,和GDTR表的地址一样,高地址在高位(话说,bochs不是模拟x86的吗?x86的小端不是这样的吧?这个回来也要看看)
>代码段的描述符构造时也要仔细,小心,要不然bochs会出现一些段保护的错误。
5.操作cr0
>那个书上用as86汇编写的,貌似用了一个lmsw的命令,从来没见过。自己又是用nasm写的,开始觉得很不顺,什么破书,总是跟自己的不一样。网上又有人用AT&T汇编格式写了一遍,下载来看,发现整体的结构又变了。又看的头晕,一想自己吃饱了撑的,搞三种汇编干蛋阿,任何一种语法都不熟。就老老实实用nasm。后来想起来《自》的源码是用nasm格式的,于是下载下来找一下lgdt的用法。一下子就解决问题了(开始我是lgdt gdt,正确的是lgdt [gdt]),再后来发现用nasm的不少,可以google很多boot.s用nasm写的。不得不说,这个时候英语确实很重要,虽然google有翻译功能,但是翻译的不准,不是很爽。还好英语基本功还是有的,hiahia。在这期间,感觉新浪爱问真是一个很好的中文网站,很多资料上面都有,而且不吭爹,如果有网站投票的话,一定投他。www.nasm.us,一开始百度nasm官网都没百到。我很奇怪,百度上很多软件的官网排名还不如写这个软件使用心得的博客排名靠前,有的甚至百度不到。还是直接在google上直接英文搜索,很方便了。但是GOOGLE有时候又进不去,唉,恼火。(小技巧:用https://www.google.cn可以进,为什么这个协议就行的通呢?,不懂)。
6.jmp dword
>这一段属于16位和32位的混合编程,www.nasm.us上有介绍。
>其中在0x0008:0的8上我又折腾了很久,因为一开始以为第一个描述是0,第二个8,第三个16,第四个24。后来才想起来选择子的格式。(所以说,先把理论上的搞清楚,该背的要背)。DI13位,TI=0表示GDT,RPL
7.跳到kernel后
>本来是准备用int 10来显示一下字符串的,但是到了保护模式,中断向量号应该是8个字节的了,BIOS提供的应该不能用了吧,得自己写中断服务了。
8.一点感触
>以前看《自己动手写操作系统》的时候,看很多人说这本书好,作者以幽默的语言怎么怎么样。现在觉得真实坑爹,如果你调试半天还是看不出来哪儿错了,书上写的又不详细,百度百到的零零散散,正确性都没保障的时候,幽默顶个屁用阿。而且那本书的基础也不止只需要一点c语言和操作系统的知识,所以我很奇怪难道就没人跟我一样的感受吗?今天百度一些问题的时候,看到了有类似感受的,所以我觉得很奇怪为什么对《自》的评价我看到的都是一种声音:适合初学者。哼,童话里都是骗人的。
>今天google的时候,发现国外很多写OS的小组,貌似国内高校就没这么多的小组额。。。
>英语很重要。即使是写一个kid os,也要耐心和知识的积累。
>找书很麻烦,比如说对8253这些芯片编程以前没接触过,虽然学了汇编。但是不知道看什么书,于是百度吧,但是大家的说法又不统一,Intel的又全是英文,图书馆也没找到,学校外面又买不到,写信给intel领免费的三本这种事又觉得麻烦。唉,于是只能瞎找书,最后找到32位微型接口技术及应用这类书上了,勉强能够满足需求。