1

今天的内容比较多,因为要学习的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&quot; 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&quot; 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天的学习引导就到这里,下次再见,有问题记得加群交流哦!

qq群:480178442

项目github地址:https://github.com/cherishsir/ubuntu230os


猫哥
305 声望44 粉丝

热衷于研究各类互联网技术,热爱学习,热爱生活!