Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)

来源:互联网 发布:淘宝u站中心首页 编辑:程序博客网 时间:2024/06/07 01:34

今天的内容比较多,因为要学习的linux方面的基础内容比较多,主要是学习linux下面的开发软件工具的使用。主要有下面几个工具要学习:


1:qemu工具(这个工具启动操作系统的虚拟机,与我们在win下面vmware是一样的东东)

2:dd工具(这个工具功能无比强大,读写u盘的扇区就靠它了)

3:mount and umount工具(用这个工具来挂载一个具有文件系统的存储介质或是文件)

4:学习写简单的makefile文件


任务不少,现在开始吧!跟上脚步啊!现从512字节的扇区程序开始(注意本博文的意图是通过这本书,使读者具有使用Linux做程序开发基本能力,不会过多的讲30os这本书上已经有的内容)

1:下面是512字节bootstrap的汇编程序:

hello for youjmp  entrydb 0x00db  "helloOSX"dw  512db  1dw  1db  2dw  224dw  2880db  0xf0dw  9dw  18dw  2dd  0dd  2880db  0,0,0x29dd  0xffffffffdb  "myosudisk  "db  "fat12   "resb 18entry:db 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7cdb 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8adb 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09db 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xebdb 0xee,0xf4,0xeb,0xfddb 0x0a,0x0adb "hello,today,you are crazy"db 0x0adb 0x00times 510-($-$$) db 0x00db 0x55,0xaa
上面的程序中的新东西:jmp,db,dw,dd,address label, times 510-($-$$) db 0x00,

启动介质标志:0xaa55  分别要存放在 第511字节,和第512字节

如果没有这个启动标志:0xaa55 ,bios程序就会认为这个u盘或是软盘能不能够启动的。

结果就是下图的情况:no bootable device



2:有了上面的512字节的启动程序后,就需要用nasm工具,將汇编编译成x86cpu能识别的机器码了。看懂下面的命令应该是没有问题的。

nasm boot.asm -o  boot.img

3:此时就可以用qemu来运行这个boot.img启动程序了,但是这个程序不是一完成的软盘镜像,不过qemu并不关心这一点。一样是可以运行的。

qemu -drive file=boot.img,if=floppy

4:可是这个文件的大小只有512字节,软盘不是非常大吧,所以要真正的把这个boot.img变成软盘镜像文件,还需要用到dd命令。

80个柱面,cylinder18个扇区,sector2个磁头,head2x80x18x512bytes=80x18kbytes=1440kB
      上面是软盘的大小的计算方法,chs的结构,还是非常简单的,不要想复杂了。

      下面的的命令把boot.img这个512字节的程序变成1440x1024Bytes的软盘镜像:

dd if=/dev/zero of=boot.img seek=1 count=2879
      上面的命令的作用是用0x00来填充boot.img这个文件,填充的时候seek=1表示,跳过boot.img的第1个512字节, 需要填充多少个0呢?我们知道一个软盘的总大小是2880个扇区。小学计算题,自己算吧。而刚才跳过了1个扇区(512字节),所以只需要2879个扇区填充0就ok了.下面是软盘的填充示意图,这样我们的boot.img文件就变成了一个真正意义上的软盘镜像。



4:只要把上面的boot.img这个文件,用dd命令写到软盘上面,我们就做好了一个启动盘。

可是现在买不到软盘了,没关系,你有u盘吧。那就找一个 u盘吧。然后写到u盘上去。

sudo dd if=$(bootstrap) of=/dev/sdb
注意 :上面的/dev/sdb是你的u盘的盘符,不懂?出门左拐,看上一篇博文,有教你如何知道你的u盘的盘符。

5:写到u盘上了,那么我们就可以关了电脑,从u盘启动了。快试试吧!可不可不关电脑从u盘启动?当然可以的,qemu这个神奇的虚拟机已经支持直接从u盘启动了。使用下面的命令:

sudo qemu   -drive file=/dev/sdb,if=floppy

       这样qemu就会读取u盘上的第一个扇区的内容,把u盘当成floppy启动了。因为大家大部分人只有一台电脑,这样在后面开发中,就可以直接用qemu测试从u盘启动的情况。而不用经常关机测试从u盘启动了。

6:好吧,说了这么多。下面讲一下,將boot.img这个带有fat12文件格式的文件,挂载成一个loop盘的命令

sudo mount -t msdos -o loop,fat=12   boot.img /mnt 
       这样就可以把boot.img 挂载到 /mnt目录了, 大家可以用 df命令看看,现在已经把boot.img这个文件当成了一个存储介质进行了mount,然后就可以通过cp命令,给这个虚拟的软盘复制文件进去了。

7:最后讲讲makefile文件吧,make工具是一个为了让我们的工作更容易的工具。

       因为后面的开发过程中,经常都需要输入dd,mount,qemu,nasm 这些命令,会觉得很麻烦。

所以需要一个工具,来帮我们智能的做这些固定的事情。make工具就可以解决这些问题。

make工作原理:

      当你在当前命令行中输入make命令时,make工具就会在当关的目录中寻找一个称为makefile的文件,这个文件里面放的命令,就是我们经常要输入的命令,但是我们又不想自己重复的输入相同的命令,那就把这些命令放到makefile文件吧。

用例子来说明问题:

      比如我们在开发过程中,经常要改变boot.asm这个文件,而我们不想一次又一次的输入

nasm  boot.asm -o boot.img 这样的命令。

那么我们只需要在makefile这个文件中,输入下面的内容后保存

boot:nasm boot.asm -o  boot.img
       然后在命令行中输入make boot, 这样make工具,就会自动的运行属于boot:这一部分的命令。(注意:boot:换行后要输入tab键,然后再输入后面的命令)

上面是make工具的基本工作过程,有了这个基础后,你就可以使用make工具来管理你的项目了。

还有一个问题,如果我们没有改变boot.asm这个文件,然后输入make boot这个命令,是不是也会运行nasm后面的命令?是的!但是这样是不合理的啊!因为我们的汇编程序是没有改变的,所以我们不需要重新编译。怎么解决,很简单!只需要加一点点就ok了。

boot.img:boot.asmnasm boot.asm -o  boot.img
       上面就是make工具所利用的依赖关系: 只有当boot.asm被修改了,才会运行后面的命令,

       实际上就是永远保证boot.img这个文件是最新的。一旦发现boot.asm的修改时间比boot.img 还要新,就会运行后面的命令。来生成更加新的boot.img这个文件,这种机制对于后面文件非常多时,是非常省时间的,你不需要因为更必了一个 源文件,而重新编译所有的源代码。

       下面把我写的简单的makefile文件的内容贴上来,供大家参考:

src=hello.asmbootstrap=boot.img boot.img:hello.asmnasm $(src) -o  $(bootstrap) fat12:@dd if=/dev/zero of=$(bootstrap) seek=1 count=2879 >> /dev/zero@ls -al $(bootstrap)loop:fat12-sudo umount /mntsudo mount -t msdos -o loop,fat=12   $(bootstrap) /mnt run:boot fat12qemu-system-i386  -drive file=$(bootstrap),if=floppyrunusb:sudo qemu   -drive file=/dev/sdb,if=floppy

考虑到后面需要同时编辑的文件会比较多,所以cherishsir推荐大家使用codeblock进行代码的编辑工作。

安装: sudo  apt-get install codeblocks


下回见:有问题记得加群交流哦!be relax!

博主邮件cherishsir@gmail.com和qq群:159336168进行交流

程序boot.asm,makefile文件照例上传到百度云

帐号:cherishsir@gmail.com
密码:cherish 



1 0
原创粉丝点击