ubuntu 编译 linux0.01,Linux(ubuntu)下30天自制os学习引导,第1天(0)

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

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群进行交流.

bVcIQm%22%20width=

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

div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值