今天的内容比较多,因为要学习的linux方面的基础内容比较多
主要是学习linux下面的开发软件工具的使用。主要有下面几个工具要学习
:
1:
qemu工具(这个工具启动操作系统的虚拟机,与我们在win下面vmware是一样的东东)
2:
dd工具(这个工具功能无比强大,读写u盘的扇区就靠它了)
3:
mount and umount工具(用这个工具来挂载一个具有文件系统的存储介质或是文件)
4:
学习写简单的makefile文件
任务不少,现在开始吧!跟上脚步啊!现从512字节的扇区程序开始(注意本博文的意图是通过这本书,使读者具有使用Linux做程序开发基本能力,不会过多的讲30os这本书上已经有的内容)
1:下面是512字节bootstrap的汇编程序:
hello for you
jmp entry
db 0x00
db "helloOSX"
dw 512
db 1
dw 1
db 2
dw 224
dw 2880
db 0xf0
dw 9
dw 18
dw 2
dd 0
dd 2880
db 0,0,0x29
dd 0xffffffff
db "myosudisk "
db "fat12 "
resb 18
entry:
db 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7c
db 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8a
db 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09
db 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xeb
db 0xee,0xf4,0xeb,0xfd
db 0x0a,0x0a
db "hello,today,you are crazy"
db 0x0a
db 0x00
times 510-($-$$) db 0x00
db 0x55,0xaa
上面的程序中的新东西:jmp,db,dw,dd,address label, times 510-($-$$) db 0x00,
启动介质标志:0xaa55 分别要存放在 第511字节,和第512字节
如果没有这个启动标志:0xaa55 ,bios程序就会认为这个u盘或是软盘能不能够启动的。
结果就是下图的情况:no bootable device
<img src="http://img.blog.csdn.net/20140524201734046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlcmlzaHNpcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="800">
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个柱面,cylinder
18个扇区,sector
2个磁头,head
2x80x18x512bytes=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文件就变成了一个真正意义上的软盘镜像。
<img src="http://img.blog.csdn.net/20140524203933906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlcmlzaHNpcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="400">
5:只要把上面的boot.img这个文件,用dd命令写到软盘上面,我们就做好了一个启动盘,可是现在买不到软盘了,没关系,你有u盘吧。那就找一个 u盘吧。然后写到u盘上去。
sudo dd if=boot.img of=/dev/sdb
注意
:上面的/dev/sdb是你的u盘的盘符,不懂?出门左拐,看上一篇博文,有教你如何知道你的u盘的盘符。
6:写到u盘上了,那么我们就可以关了电脑,从u盘启动了。快试试吧!可不可不关电脑从u盘启动?当然可以的,qemu这个神奇的虚拟机已经支持直接从u盘启动了。使用下面的命令:
sudo qemu -drive file=/dev/sdb,if=floppy
这样qemu就会读取u盘上的第一个扇区的内容,把u盘当成floppy启动了。因为大家大部分人只有一台电脑,这样在后面开发中,就可以直接用qemu测试从u盘启动的情况。而不用经常关机测试从u盘启动了。
7:好吧,说了这么多。下面讲一下,將boot.img这个带有fat12文件格式的文件,挂载成一个loop盘的命令
sudo mount -t msdos -o loop,fat=12 boot.img /mnt
这样就可以把boot.img 挂载到 /mnt目录了, 大家可以用 df命令看看,现在已经把boot.img这个文件当成了一个存储介质进行了mount,然后就可以通过cp命令,给这个虚拟的软盘复制文件进去了。
8:最后讲讲makefile文件吧,make工具是一个为了让我们的工作更容易的工具。
因为后面的开发过程中,经常都需要输入dd,mount,qemu,nasm 这些命令,会觉得很麻烦.所以需要一个工具,来帮我们智能的做这些固定的事情。make工具就可以解决这些问题。
make工作原理:
当你在当前命令行中输入make命令时,make工具就会在当关的目录中寻找一个称为makefile的文件,这个文件里面放的命令,就是我们经常要输入的命令,但是我们又不想自己重复的输入相同的命令,那就把这些命令放到makefile文件吧。
用例子来说明问题:
1:比如我们在开发过程中,经常要改变boot.asm这个文件,而我们不想一次又一次的输入nasm boot.asm -o boot.img
这样的命令。
2:那么我们只需要在makefile这个文件中,输入下面的内容后保存
boot:
nasm boot.asm -o boot.img
3: 然后在命令行中输入make boot
, 这样make工具,就会自动的运行属于boot:这一部分的命令。(注意:boot:换行后要输入tab键,然后再输入后面的命令
),上面是make工具的基本工作过程,有了这个基础后,你就可以使用make工具来管理你的项目了。
4:还有一个问题,如果我们没有改变boot.asm这个文件,然后输入make boot这个命令,是不是也会运行nasm后面的命令?是的!但是这样是不合理的啊!因为我们的汇编程序是没有改变的,所以我们不需要重新编译。怎么解决,很简单!只需要加一点点就ok了。
boot.img:boot.asm
nasm boot.asm -o boot.img
5: 上面就是make工具所利用的依赖关系: 只有当boot.asm被修改了,才会运行后面的命令.
实际上就是永远保证boot.img这个文件是最新的。一旦发现boot.asm的修改时间比boot.img 还要新,就会运行后面的命令。来生成更加新的boot.img这个文件,这种机制对于后面文件非常多时,是非常省时间的,你不需要因为更必了一个 源文件,而重新编译所有的源代码。
6: 下面把我写的简单的makefile文件的内容贴上来,供大家参考:
src=hello.asm
bootstrap=boot.img
boot.img:hello.asm
nasm $(src) -o $(bootstrap)
fat12:
@dd if=/dev/zero of=$(bootstrap) seek=1 count=2879 >> /dev/zero
@ls -al $(bootstrap)
loop:fat12
-sudo umount /mnt
sudo mount -t msdos -o loop,fat=12 $(bootstrap) /mnt
run:boot fat12
qemu-system-i386 -drive file=$(bootstrap),if=floppy
runusb:
sudo qemu -drive file=/dev/sdb,if=floppy
考虑到后面需要同时编辑的文件会比较多,所以cherishsir推荐大家使用codeblock进行代码的编辑工作。
安装: sudo apt-get install codeblocks
好了!第1天的学习引导就到这里,下次再见,有问题记得加群交流哦!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。