经过大约10天的时间,趁着下班的空余时间终于把30天(以下简称30天)自制操作系统的U盘启动,以及读写U盘的扇区问题搞定了。
按照30天中的代码,用qemu模拟的话很轻松就可以实现从软盘启动的模拟,但是如何改成从u盘启动呢。
我把我的大致思路讲下。
1.先搞懂,BIOS的功能,以及关机流程,内存地址0x7c00的意义,这些网上都能够查到。
2. 搞清楚,FAT32文件格式,当你格式化一个u盘的时候 如果选择FAT32,U盘第一个扇区的前88个字节(大概)说的是FAT32格式的相关内容。极为重要的 是前三个字节。举个例子:
EB 58 90
前两个字节的意思是 jmp 58(偏移量,尤为重要,不是目的地址),实际跳转到的地址 要加上将要执行的下一条指令的地址,即(ip)=(ip)+偏移量,在我们U盘这个程序中 实际跳到 0x5a这个地方,因为jmp指令本身占两个字节。
3.搞清楚 int 13h(读盘 在这里是读U盘),int 10h(显示 acsii字符) 这两个个BIOS中断的用法,百度吧,会有很多说明。
4.知道自己的u盘的驱动器号,我的是80h,每个人的可能不一样,取决于你的电脑。方法:BIOS启动的时候 会将驱动器号保存在dl寄存器中,(当你用电脑格式化u盘过后,第一个扇区的40h自己的内容就是驱动器,你自己可以验证下)所以 你可以调用BIOS中断显示dl的内容,但要注意 BIOS中显示的是字符0-127。 80h已经超出这个范围,可以减去1fh,再显示,假如驱动器号 是80h那么显示的字符是a,81h显示b,以此类推。
5. 过程: 写好汇编代码,用nask,就是30天书上的工具,生成的ipl.bin,用winhex 将bin文件中代码部分(不包括前面的,关于软盘的设置),复制到格式化后(FAT32)的u盘,JMP指令,指定的跳转位置,记得将 510,和511字节改写为55和 AA,还有不要忘了保存。
6.我用winhex 将U盘的第二个扇区的前几个字节的内容,改成我想要显示的内容,然后在程序中读取第二个扇区的内容,然后显示前面几个字节,检验显示的是否正确。
补充:关于C(柱面)H(磁头)S(扇区)以及 LBA(Logical Block Address)的相关信息,自己百度吧。bios是将CHS转换成LBA地址后 进行读盘的。
完结!
如文中有错误,欢迎讨论指正,如有问题,本人邮箱,shuiqianyushen@yeah.net.
阅读(3614) | 评论(0) | 转发(0) |