Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)
来源:互联网 发布:淘宝u站中心首页 编辑:程序博客网 时间:2024/06/07 01:34
今天的内容比较多,因为要学习的linux方面的基础内容比较多,主要是学习linux下面的开发软件工具的使用。主要有下面几个工具要学习:
1:qemu工具(这个工具启动操作系统的虚拟机,与我们在win下面vmware是一样的东东)
2:dd工具(这个工具功能无比强大,读写u盘的扇区就靠它了)
3:mount and umount工具(用这个工具来挂载一个具有文件系统的存储介质或是文件)
4:学习写简单的makefile文件
任务不少,现在开始吧!跟上脚步啊!现从512字节的扇区程序开始(注意本博文的意图是通过这本书,使读者具有使用Linux做程序开发基本能力,不会过多的讲30os这本书上已经有的内容)
1:下面是512字节bootstrap的汇编程序:
hello for youjmp entrydb 0x00db "helloOSX"dw 512db 1dw 1db 2dw 224dw 2880db 0xf0dw 9dw 18dw 2dd 0dd 2880db 0,0,0x29dd 0xffffffffdb "myosudisk "db "fat12 "resb 18entry:db 0xb8,0x00,0x00,0x8e,0xd0,0xbc,0x00,0x7cdb 0x8e,0xd8,0x8e,0xc0,0xbe,0x74,0x7c,0x8adb 0x04,0x83,0xc6,0x01,0x3c,0x00,0x74,0x09db 0xb4,0x0e,0xbb,0x0f,0x00,0xcd,0x10,0xebdb 0xee,0xf4,0xeb,0xfddb 0x0a,0x0adb "hello,today,you are crazy"db 0x0adb 0x00times 510-($-$$) db 0x00db 0x55,0xaa上面的程序中的新东西:jmp,db,dw,dd,address label, times 510-($-$$) db 0x00,
启动介质标志:0xaa55 分别要存放在 第511字节,和第512字节
如果没有这个启动标志:0xaa55 ,bios程序就会认为这个u盘或是软盘能不能够启动的。
结果就是下图的情况:no bootable device
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个柱面,cylinder18个扇区,sector2个磁头,head2x80x18x512bytes=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文件就变成了一个真正意义上的软盘镜像。
4:只要把上面的boot.img这个文件,用dd命令写到软盘上面,我们就做好了一个启动盘。
可是现在买不到软盘了,没关系,你有u盘吧。那就找一个 u盘吧。然后写到u盘上去。
sudo dd if=$(bootstrap) of=/dev/sdb注意 :上面的/dev/sdb是你的u盘的盘符,不懂?出门左拐,看上一篇博文,有教你如何知道你的u盘的盘符。
5:写到u盘上了,那么我们就可以关了电脑,从u盘启动了。快试试吧!可不可不关电脑从u盘启动?当然可以的,qemu这个神奇的虚拟机已经支持直接从u盘启动了。使用下面的命令:
sudo qemu -drive file=/dev/sdb,if=floppy
这样qemu就会读取u盘上的第一个扇区的内容,把u盘当成floppy启动了。因为大家大部分人只有一台电脑,这样在后面开发中,就可以直接用qemu测试从u盘启动的情况。而不用经常关机测试从u盘启动了。
6:好吧,说了这么多。下面讲一下,將boot.img这个带有fat12文件格式的文件,挂载成一个loop盘的命令
sudo mount -t msdos -o loop,fat=12 boot.img /mnt这样就可以把boot.img 挂载到 /mnt目录了, 大家可以用 df命令看看,现在已经把boot.img这个文件当成了一个存储介质进行了mount,然后就可以通过cp命令,给这个虚拟的软盘复制文件进去了。
7:最后讲讲makefile文件吧,make工具是一个为了让我们的工作更容易的工具。
因为后面的开发过程中,经常都需要输入dd,mount,qemu,nasm 这些命令,会觉得很麻烦。
所以需要一个工具,来帮我们智能的做这些固定的事情。make工具就可以解决这些问题。
make工作原理:
当你在当前命令行中输入make命令时,make工具就会在当关的目录中寻找一个称为makefile的文件,这个文件里面放的命令,就是我们经常要输入的命令,但是我们又不想自己重复的输入相同的命令,那就把这些命令放到makefile文件吧。
用例子来说明问题:
比如我们在开发过程中,经常要改变boot.asm这个文件,而我们不想一次又一次的输入
nasm boot.asm -o boot.img 这样的命令。
那么我们只需要在makefile这个文件中,输入下面的内容后保存
boot:nasm boot.asm -o boot.img然后在命令行中输入make boot, 这样make工具,就会自动的运行属于boot:这一部分的命令。(注意:boot:换行后要输入tab键,然后再输入后面的命令)
上面是make工具的基本工作过程,有了这个基础后,你就可以使用make工具来管理你的项目了。
还有一个问题,如果我们没有改变boot.asm这个文件,然后输入make boot这个命令,是不是也会运行nasm后面的命令?是的!但是这样是不合理的啊!因为我们的汇编程序是没有改变的,所以我们不需要重新编译。怎么解决,很简单!只需要加一点点就ok了。
boot.img:boot.asmnasm boot.asm -o boot.img上面就是make工具所利用的依赖关系: 只有当boot.asm被修改了,才会运行后面的命令,
实际上就是永远保证boot.img这个文件是最新的。一旦发现boot.asm的修改时间比boot.img 还要新,就会运行后面的命令。来生成更加新的boot.img这个文件,这种机制对于后面文件非常多时,是非常省时间的,你不需要因为更必了一个 源文件,而重新编译所有的源代码。
下面把我写的简单的makefile文件的内容贴上来,供大家参考:
src=hello.asmbootstrap=boot.img boot.img:hello.asmnasm $(src) -o $(bootstrap) fat12:@dd if=/dev/zero of=$(bootstrap) seek=1 count=2879 >> /dev/zero@ls -al $(bootstrap)loop:fat12-sudo umount /mntsudo mount -t msdos -o loop,fat=12 $(bootstrap) /mnt run:boot fat12qemu-system-i386 -drive file=$(bootstrap),if=floppyrunusb:sudo qemu -drive file=/dev/sdb,if=floppy
考虑到后面需要同时编辑的文件会比较多,所以cherishsir推荐大家使用codeblock进行代码的编辑工作。
安装: sudo apt-get install codeblocks
下回见:有问题记得加群交流哦!be relax!
博主邮件cherishsir@gmail.com和qq群:159336168进行交流
程序boot.asm,makefile文件照例上传到百度云
帐号:cherishsir@gmail.com
密码:cherish
- Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)
- Linux(ubuntu)下30天自制os学习引导,第3.0天(读取u盘第二扇区到内存)
- Linux(ubuntu)下30天自制os学习引导,第3.1天(如何得到 u盘的chs结构)
- Linux(ubuntu)下30天自制os学习引导,第2天(gas汇编语言)
- Linux(ubuntu)下30天自制os学习引导,第3.2天(读取u盘上189kB的内容 )
- 30天自制操作系统U盘启动
- 从你的u盘启动:30天自制操作系统第四天u盘启动学习笔记
- 关于U盘启动操作系统《30天自制操作系统》
- Linux下制作grub启动U盘,引导ubuntu LiveCD(或其他镜像)
- U盘启动引导安装linux
- U盘启动引导安装linux
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 30天自制操作系统——用U盘启动自制系统
- 《30天自制操作系统》U盘启动,真机运行(16天)
- 自制能使用U盘引导的程序(一)
- linux shell数据重定向(输入重定向与输出重定向)详细分析
- 【redis源码分析】RDB持久化机制
- c# .NET 概述
- 第十三周 项目一 点和圆的关系
- 初涉Splay Tree
- Linux(ubuntu)下30天自制os学习引导,第1天(汇编语言,写入u盘,qemu启动u盘)
- 友情链接该怎么做
- ruby on rails 新开始
- ajax浏览器缓存问题
- eclispe codestyle 和 formatter
- Windows消息大全
- VS中调用SQL SERVER存储过程
- poj3414
- linux 关机重启指令