1

今天开始书本上第一天的内容,内容的主要是分三个部分:

1. 用二进制编辑器hexedit,写一个用机器码"hello wolrd"的启动程序

2. 开始用汇编的db指令写"hello cherishsir"的启动程序

3. 开始用真正的汇编语言写"hello cherishsir"的启动程序


  • 从上面的三个过程中,大家可以学习如何使用hexedit这个二进制文件编辑器,还有linux系统的一些简单的命令,如ls ,cat,less等有用的命令.其实上面前两个部分学习实践的目的只是为了让大家对"计算机只能运行二进制机器码"这句话有更深刻的理解.第三个学习实践才是对人类来说的编程活动.因为自从有了编译器后,人类已有很久没有直接用机器码写程序了.所以大家还会学到如何使用nasm这个汇编器,进行程序的汇编过程,以及如何把写好的程序,用dd命令写到你自己的u盘上,然后使你的电脑从u盘启动.那么我们开始吧!


1.用二进制编辑器hexedit,写一个用机器码"hello wolrd"的启动程序

  1. 为了方便我们管理程序,我们在做一个项目时,通常会新建一个目录,然后在这个目录下面新建这个项目所需要的文件.

  2. 所以,让我们新建一个目录吧,取名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&quot; 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&quot; >

  • 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的基本用法做最简单的讲解.

QQ群:480178442

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


猫哥
305 声望44 粉丝

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