今天开始书本上第一天的内容,内容的主要是分三个部分:
1. 用二进制编辑器hexedit,写一个用机器码"hello wolrd"的启动程序
2. 开始用汇编的db指令写"hello cherishsir"的启动程序
3. 开始用真正的汇编语言写"hello cherishsir"的启动程序
从上面的三个过程中,大家可以学习如何使用hexedit这个二进制文件编辑器,还有linux系统的一些简单的命令,如ls ,cat,less等有用的命令.其实上面前两个部分学习实践的目的只是为了让大家对"计算机只能运行二进制机器码"这句话有更深刻的理解.第三个学习实践才是对人类来说的编程活动.因为自从有了编译器后,人类已有很久没有直接用机器码写程序了.所以大家还会学到如何使用nasm这个汇编器,进行程序的汇编过程,以及如何把写好的程序,用dd命令写到你自己的u盘上,然后使你的电脑从u盘启动.那么我们开始吧!
1.用二进制编辑器hexedit,写一个用机器码"hello wolrd"的启动程序
为了方便我们管理程序,我们在做一个项目时,通常会新建一个目录,然后在这个目录下面新建这个项目所需要的文件.
所以,让我们新建一个目录吧,取名os
mkidr os #mkdir就是新建一个目录的命令,后面跟的os是我们输入的目录名
cd os #cd 是进入到一个目录的,现在我们的位置就到了我们新建的目录里面
pwd #pwd 是查看我们当前是在哪个目录的命令,
2.好了,准备工作做好了!我们需要在os这个目录中,新建一个文件os.img
touch os.img #touch是新建一个文件的命令
ls #可以看到当前的工作目录已经有os.img这个文件了
3.使用hexedit二进制代码编辑工具
开始开始用hexedit工具打开我们的os.img这个文件了,然后输入下面的16进制的机器码了.输入下图中的内容,然后剩下的全部分输入0就可以了,那么要输入多少个0才能结束呢?我们需要保证这个os.img这个文件是512字节,而且要保证第511字节和512字节的内容为0x55,0xaa.这样我们用机器码写的程序就完成了.按下ctr+x ,提示输入y就保存了我们输入的内容.关于hexedit的使用,如果有什么问题,可以加博主或qq群进行交流.
<img src="http://segmentfault.com/img/bVcIQm" width="400" >
4.通过使用hexedit定位二进制数据的位置
大家可以看到hexedit左边显示的是文件数据地地址偏移量,因为地址偏移量是从0开始,所以第511个字节的地址为0x1fe,第512个字节的地址就是0x1ff.可以看上图最后两个16进制机器码是55 aa,这两个字节实际上是一个启动代码的标志,操作系统在读取这部分代码时,就会判断这两个字节是不是0x55,0xaa.如果是,就说明这部分的代码是启动扇区.大家可以用file os.img这个命令看看,输出告诉你这个文件是x86 boot sector.
5.hexedit在显示数据时,是每行16个字节在显示.为了确写我们的程序是512个字节,我们输入下面的命令看看:
ls -l #这样就可以查看文件的大小
6.qemu运行写好的二进制机器码程序
现在我们可以用虚拟机qemu来试试这个程序是能正常工作了!输入下面的命令,使用qemu来运行os.img引导程序.
qemu -drive file=os.img,if=floppy
7.qemu运行成功后的效果
不出意外,qemu会重新打开一个窗口,显示”hello world”,然后进行死循环.
总结:大家可以看到我们通过这个实验学到了好几个linux命令,总结一下有:
mkdir ,cd ,ls ,touch, hexedit,pwd,qemu而这些命令是我们在后面的开发实践中要经常用到命令,不要去背哪一个命令,用多了你自然就会了.而脱离了实践应用的去学习Linux系统的命令是效率非常低下的.
从u盘启动你的“操作系统”
大家可能想把这个程序写到u盘上,然后从u盘启动运行,这样可以吗?当然是可以的,直接写入到u盘就可以了.注意博主说的是直接写入到u盘,不是大家常接触的copy这个文件到u盘.
那是不是需要什么特殊的工具啊?确实需要一个工具,什么工具呢,又要去下载吗?呵呵,不用去下载了,Linux系统自带了这个工具,只需要你会用dd命令就够了
下面是具体的操作的过程:
1:首先你需要找一个能用的u盘,注意把u盘上有用的东西都备份一下,不备份可就全没了!最好找一个在复制文件时,有灯在闪的u盘,因为我们可以通过这个特点来判断,u盘是否正在进行读写操作.
2:在插下u盘之前,首先输入下面的命令,目的是为了后面能确我们u盘的设备号.这一步不要插入u盘:(这个命令会显示关于大家电脑硬盘的分区信息,大家看看,有个大概的印象)
sudo fdisk -l
3:好了,可以插上大家的u盘了,然后同样输入下面的命令
sudo fdisk -l
说明
:这时我们就可以看到u盘的盘符了,大家可以看到我们u盘为/dev/sdc1,因为博主笔记本上除了原来的机械硬盘外,还有一块ssd固态硬盘,所以博主的硬盘的盘符分配情况如下:
/dev/sda :机械硬盘
/dev/sdb:固态硬盘
/dev/sdc:u盘
注意`因为大家的电脑上通常只有一块硬盘,所以u盘最有可能是/dev/sdb
<img src="http://segmentfault.com/img/bVcIQq" >4:好了,现在可以把我们的os.img这个文件写到u盘上了.输入下面的命令,请大家根据自己的情况所sdc换成大家u盘的盘符.
sudo umount /dev/sdc1 #这一步是把u盘从挂载点卸载掉,
sudo dd if=os.img of=/dev/sdc #这一步是把os.img的程序写到盘上,
5:在写u盘的过程中,如果u盘有灯在闪,说明正在进行数据的写入过程,当灯不闪后,说明os.img文件已经写完,可以拔掉u盘,然后找台能从u盘启动的电脑,插上u盘,在bios中,就启动顺序改成首先从u盘启动.这时大家就能看到从u盘启动效果了.
后面的内容
不知不觉中,大家已经学习了Linux的几个常用的命令,在开发的过程中,这些命令都是会用到的,可是当我们熟悉了这些命令之后,就不愿意再反复的输入这些相同的命令了,有什么好办法吗?
那大家就学学makefile吧!要知道linux内核都是用make工具管理的!后面的博文会对makefile的基本用法做最简单的讲解.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。