写一个最简单的MBR程序
首先这个程序只有很简单的几个指令,只要有一台linux系统的电脑,只需几个步骤就能写出自己MBR程序!
什么是MBR?
当你按下电脑的开机键,你的cup第一个运行的是bios程序,这个程序在制造主板的时候就印刷在一个只读存储器里,一般来说我们无法修改它。bios程序将硬盘第一个扇区的数据传送到内存中的某一段存储单元里,然后cpu就从内存这个地方开始执行指令,bios的使命就完成了。接下来登场的就是硬盘第一个扇区的这段程序,称为MBR程序(Manage Boot Recorder)。MBR的生命也很短暂,它的使命是将操作系统的引导程序装载到内存,但如果你希望你电脑上的所有程序都是你自己写的,那么MBR将是电脑接通电源后后第一个你可以DIY的程序
当然这次我们写的程序还不足以称为MBR程序,因为他还不能装载操作系统的引导程序,但这是你能写出一个完整MBR的第一步!
只要设法将二进制指令复制到硬盘的第一个扇区,然后重启系统,cpu就单纯的执行你的指令了,没有任何操作系统的控制和干预!当然,这是个危险的做法,正如前面所说,我们写的是几个最简单的指令,这几个指令还不足以引导操作系统。所以最好你有一台实验用的电脑,或者你有修复MBR的移动介质。但是再怎么说,这样执行你的指令也很不方便,因为每执行一次新的程序,你都得重新修复一下MBR。让人高兴的是,虚拟机可以解决这个问题, 比虚拟机更方便的是QEMU。
下面进行我们的具体步骤:
1,安装NASM和虚拟机(如果你有实验用的电脑,可以不用虚拟机,如果用虚拟机,推荐用这个系统镜像 Slitaz live cd,只有35M)
2,用任何一种编辑器写你的汇编指令,并保存
3,用NASM编译你的汇编指令,生成二进制文件
4,将二进制文件写到磁盘的第一个扇区
5,重启系统
1,安装NASM:如果是debian或ubuntu系统,直接用命令 sudo apt-get install nasm 完成安装。
安装虚拟机: 推荐 virtualbox 和 Slitaz live cd
完成第一步的安装,工作已完成大半了,如果linux操作熟练,安装过程只需要几分钟。下面写我们的指令
2,新建一个文件,命名为test.nasm,打开文件输入下面指令并保存,我们的指令是要在显示器上输出一个字符 x:
reboot
将会看到指令的执行结果。
一种很方便的方法是使用qemu运行你的MBR程序,安装qemu在debian或ubuntu下直接使用命令 sudo apt-get install qemu-system 完成安装,然后只需要运行 qemu-system-i386 test 就可以启动你的MBR程序。
如果对linux安装虚拟机或qemu感到麻烦,可以将mbr安装在u盘上,然后重启时将u盘设为第一启动盘,原理是一样的,只是在dd命令时将of置为/dev/sdb,对于单硬盘电脑,一般sda就是硬盘,sdb是u盘,具体代号可以在磁盘管理里看到。u盘方式真实的显示了这个过程。
一个有趣的例子更清晰的展示了cpu其实是多么的单纯,将test.nasm中的内容换为:
将得到同样的结果。但是这里并没有任何指令,只是定义了一些数据。事实上,cpu并不去区分是指令还是数据,他只会按程序计数器里的地址去取指令,执行指令,再按程序计数器里的地址 取指令,执行指令…… 也许你已经知道了,0xb4就是某一个操作码的 二进制形式,而0xe是操作数
还有一点要注意的是,我们这几个指令不涉及内存寻址。如果程序中有涉及内存寻址的指令,需要在源文件开头加上一句:
org 0x7c00
这个伪指令告诉NASM计算内存地址时以0x7c00为基地址,因为bios程序装载Mbr程序时,就是放在以0x7c00开始的地方,bios程序退出后,cpu从内存0x7c00处取第一条指令执行。
什么是MBR?
当你按下电脑的开机键,你的cup第一个运行的是bios程序,这个程序在制造主板的时候就印刷在一个只读存储器里,一般来说我们无法修改它。bios程序将硬盘第一个扇区的数据传送到内存中的某一段存储单元里,然后cpu就从内存这个地方开始执行指令,bios的使命就完成了。接下来登场的就是硬盘第一个扇区的这段程序,称为MBR程序(Manage Boot Recorder)。MBR的生命也很短暂,它的使命是将操作系统的引导程序装载到内存,但如果你希望你电脑上的所有程序都是你自己写的,那么MBR将是电脑接通电源后后第一个你可以DIY的程序
当然这次我们写的程序还不足以称为MBR程序,因为他还不能装载操作系统的引导程序,但这是你能写出一个完整MBR的第一步!
只要设法将二进制指令复制到硬盘的第一个扇区,然后重启系统,cpu就单纯的执行你的指令了,没有任何操作系统的控制和干预!当然,这是个危险的做法,正如前面所说,我们写的是几个最简单的指令,这几个指令还不足以引导操作系统。所以最好你有一台实验用的电脑,或者你有修复MBR的移动介质。但是再怎么说,这样执行你的指令也很不方便,因为每执行一次新的程序,你都得重新修复一下MBR。让人高兴的是,虚拟机可以解决这个问题, 比虚拟机更方便的是QEMU。
下面进行我们的具体步骤:
1,安装NASM和虚拟机(如果你有实验用的电脑,可以不用虚拟机,如果用虚拟机,推荐用这个系统镜像 Slitaz live cd,只有35M)
2,用任何一种编辑器写你的汇编指令,并保存
3,用NASM编译你的汇编指令,生成二进制文件
4,将二进制文件写到磁盘的第一个扇区
5,重启系统
1,安装NASM:如果是debian或ubuntu系统,直接用命令 sudo apt-get install nasm 完成安装。
安装虚拟机: 推荐 virtualbox 和 Slitaz live cd
完成第一步的安装,工作已完成大半了,如果linux操作熟练,安装过程只需要几分钟。下面写我们的指令
2,新建一个文件,命名为test.nasm,打开文件输入下面指令并保存,我们的指令是要在显示器上输出一个字符 x:
mov ah,0xe ;将16进制数0xe存入寄存器ah
mov al,'x' ;将字符x的asc码存入寄存器al
int 0x10 ; 中断,此时若ah的值为0xe,则将寄存器al里的字符输出在显示器上
end:
jmp end
times 0200h - 2 - ($ - $$) db 0 ;此处给填充若干个0,目的使最终的二进制程序凑够512字节
dw 0AA55h
; MBR程序规定的最后的两个字节
3.用NASM编译,在终端进入test.nasm所在目录后,输入命令:
nasm test.nasm
生成了二进制文件test。
4. 进入虚拟机,设法将二进制文件test复制到虚拟机下。这里有多种方法,如果你的电脑联网,可以将test以附件形式发送到某个邮箱,然后在虚拟机里登录邮箱下载即可。假设下载后存放在主目录,那么打开终端(注意:是在虚拟机下操作,如果在宿主机操作,那么结果是再开机将只能在屏幕上看到一个字母 x,而无法进入操作系统),用su命令切换到root账户, Slitaz live cd的密码是 root, 输入命令:
3.用NASM编译,在终端进入test.nasm所在目录后,输入命令:
nasm test.nasm
生成了二进制文件test。
4. 进入虚拟机,设法将二进制文件test复制到虚拟机下。这里有多种方法,如果你的电脑联网,可以将test以附件形式发送到某个邮箱,然后在虚拟机里登录邮箱下载即可。假设下载后存放在主目录,那么打开终端(注意:是在虚拟机下操作,如果在宿主机操作,那么结果是再开机将只能在屏幕上看到一个字母 x,而无法进入操作系统),用su命令切换到root账户, Slitaz live cd的密码是 root, 输入命令:
dd if=test of=/dev/sda
dd命令一般linux都自带,if是输入的文件名,of是输出的文件名,对了,linux确实是把磁盘也看作一个文件的
该命令将test写入磁盘的第一个扇区(当然虚拟机下是写入虚拟机磁盘的第一个扇区),如果执行成功,会显示:
1+0 records in
1+0 records out
5.重启虚拟机:dd命令一般linux都自带,if是输入的文件名,of是输出的文件名,对了,linux确实是把磁盘也看作一个文件的
该命令将test写入磁盘的第一个扇区(当然虚拟机下是写入虚拟机磁盘的第一个扇区),如果执行成功,会显示:
1+0 records in
1+0 records out
reboot
将会看到指令的执行结果。
一种很方便的方法是使用qemu运行你的MBR程序,安装qemu在debian或ubuntu下直接使用命令 sudo apt-get install qemu-system 完成安装,然后只需要运行 qemu-system-i386 test 就可以启动你的MBR程序。
如果对linux安装虚拟机或qemu感到麻烦,可以将mbr安装在u盘上,然后重启时将u盘设为第一启动盘,原理是一样的,只是在dd命令时将of置为/dev/sdb,对于单硬盘电脑,一般sda就是硬盘,sdb是u盘,具体代号可以在磁盘管理里看到。u盘方式真实的显示了这个过程。
一个有趣的例子更清晰的展示了cpu其实是多么的单纯,将test.nasm中的内容换为:
db 0xb4,0xe,0xb0,'x',0xcd,10h
times 0200h - 2 - ($ - $$) db 0
dw 0AA55h
将得到同样的结果。但是这里并没有任何指令,只是定义了一些数据。事实上,cpu并不去区分是指令还是数据,他只会按程序计数器里的地址去取指令,执行指令,再按程序计数器里的地址 取指令,执行指令…… 也许你已经知道了,0xb4就是某一个操作码的 二进制形式,而0xe是操作数
还有一点要注意的是,我们这几个指令不涉及内存寻址。如果程序中有涉及内存寻址的指令,需要在源文件开头加上一句:
org 0x7c00
这个伪指令告诉NASM计算内存地址时以0x7c00为基地址,因为bios程序装载Mbr程序时,就是放在以0x7c00开始的地方,bios程序退出后,cpu从内存0x7c00处取第一条指令执行。
本文介绍了如何在Linux环境下编写最简单的MBR程序。通过几步简单操作,将汇编指令写入硬盘第一个扇区,实现开机显示字符 'x'。文章详细讲解了MBR的概念,以及使用NASM编译汇编代码,通过dd命令将二进制文件写入磁盘首个扇区,并在虚拟机中运行验证的过程。
436

被折叠的 条评论
为什么被折叠?



