01在Bochs中运行引导扇区框架代码
2016-11-01 18:48
204 查看
《Linux内核完全注释》—-在Bochs中运行引导扇区框架代码
一、说明
本文是学习了《Linux内核完全注释》—3.1as86汇编器这一节内容的学习总结。二、具体的实现步骤
1.首先是书的源代码,命名为boot.s
! ! boot.s -- bootsect.s的框架程序,用代码0x07替换串msg1中1字符,然后在屏幕第1行上显示。 ! .global begtext, begdata, begbss, endtext, enddata, endbss !全局标识符,供ld86链接使用。 .text begtext: .data !数据段 begdata: .bss !未初始化数据段 begbss: .text !正文段 BOOTSEG = 0x07c0 !BIOS加载bootsect代码的原始段地址 entry start !告知链接程序,程序从start标号处开始执行 start: jmpi go, BOOTSEG !段间跳转,INITSEG指出跳转段地址,标号go是偏移地址 go: mov ax, cs !段寄存器cs值->ax,用于初始化数据段寄存器ds和es mov ds, ax mov es, ax mov [msg1+17], ah !0x07->替换字符串中1个符号,喇叭将会鸣一声 mov cx, #20 !共显示20个字符,包换回车换行符 mov dx, #0x1009 !字符串将显示在屏幕第17行,第5列处 mov bx, #0x000c !字符串显示属性(红色) mov bp, #msg1 !指向要显示的字符串(中断调用要求) mov ax, #0x1301 !写字符串并移动光标到串结尾处 int 0x10 !BIOS中断调用0x10,功能0x13,子功能01 loop1: jmp loop1 !死循环 msg1: .ascii "Loading system ..."!调用BIOS中断显示的信息,共20个ASCII码字符 .byte 13, 10 !表示BIOS中断显示的信息,共20个ASCII码字符 .org 510 !表示以后语句从地址510(0x1FE)开始存放 .word 0xAA55 !有效引导扇区标志,供BIOS加载引导扇区使用 .text endtext: .data enddata: .bss endbss:
2.安装as86,ld86汇编器和链接器
我用的是Ubuntu 16.04,直接apt-get install安装as86,ld86失败了,这里从网上的朋友那里学了一手。1)先用:
apt-cache search as86 ld86这个命令查找as86,ld86在那里。
2)然后:
sudo apt-get install bin86即可。
3.编译boot.s文件
编译的话按照书上的命令就可以编译成功,这里就不多提了。4.用Bochs进行仿真
我是按书里讲的,用Bochs这款软件进行仿真。首先需要制作镜像文件,然后在Bochs中加载镜像文件就可以看到书中的最后的演示效果了。1)首先安装bochs:
sudo apt-get install bochs
2)制作镜像文件:安装好bochs后会附带一个bximage这个工具,我们可以用它来制作镜像文件。
a)直接在命令行运行bximage这个命令,会有制作向导。
b)过程如下:
yinzhongkai@yinzhongkai:~/workspace/linux/src$ bximage ======================================================================== bximage Disk Image Creation Tool for Bochs $Id: bximage.c 11315 2012-08-05 18:13:38Z vruppert $ ======================================================================== Do you want to create a floppy disk image or a hard disk image? Please type hd or fd. [hd] fd //这里是问要制作软盘还是硬盘,先制作软盘,因为网上学的 Choose the size of floppy disk image to create, in megabytes. Please type 0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88. [1.44] //这里默认就好,因为制作的是软盘,一般为1.44M I will create a floppy image with cyl=80 //这里是生成软盘的信息大小为1.44M heads=2 sectors per track=18 total sectors=2880 total bytes=1474560 What should I name the image? [a.img] //这里是制作镜像文件的名字,我把它命名为linux.img Writing: [] Done. I wrote 1474560 bytes to a.img. The following line should appear in your bochsrc: floppya: image="a.img", status=inserted yinzhongkai@yinzhongkai:~/workspace/linux/src$
3)将可执行文件boot的内容拷贝到linux.img中
命令如下:
dd bs=32 if=boot of=linux.img skip=1,解释这个命令
a)bs=32一次性读或写32个字节和skip=1配合,跳过boot开头的32个字节,不复制到linux.img中
b)if=boot输入文件为boot
c)of=linux.img输出文件为linux.img
经过上面的步骤就制作好了镜像文件。
4)编写bochs配制文件
将bochs示例文件拷贝到当前目录下,重命名为
linux.bxrc:
cp /usr/share/doc/bochs/examples/bochsrc.gz ./linux.bxrc。改写配置文件
linux.bxrc。
a)设置镜像文件为我们自己制作的linux.img.
b)修改启动方式为软盘启动.
5)经过以上几个步骤的文件结构
6)最后执行命令:
bochs -f linux.bxrc用bochs加载镜像文件
三、效果图
附上效果图在bochs运行过程中跳出了好多窗口,我这里没有管他,直接continue的,是我们配置的linux.bxrc文件还有问题,但是没有关系,因为我们只是运行的引导扇区框架代码,这些问题都没有影响;还有一个原因是我还不知道怎么解决(好尴尬啊!)。不过随着我的深入学习,我相信这些问题都应该不在话下的。
相关文章推荐
- Ubuntu下使用模拟器Bochs运行《Linux内核完全剖析——基于0.12内核》第3章P31 引导扇区源码boot.s的一系列步骤
- 自己的os---boot.s引导扇区运行在bochs上
- 主引导扇区代码(MBR)
- 如何修复扇区0中的引导代码
- Cider需要说服运行于苹果XNU内核上的应用代码,让它可以复制库和框架
- bochs创建主引导代码
- FAT32引导扇区代码
- 用bochs调试自己写的系统引导代码
- 用bochs调试自己写的系统引导代码
- nasm实现的用vmware运行自做的linux启动盘的引导代码
- x264代码剖析(二):如何编译运行x264以及x264代码基本框架
- 5DG'S OpenGL学习01--简单框架代码
- 简单到引导扇区汇编代码解释
- hive代码研究--运行原理(1)- 整体框架
- 用bochs调试自己写的系统引导代码
- 01windows程序运行机制、代码编写流程与剖析
- 主引导扇区代码(MBR)分析(转)
- 引导扇区汇编代码解释
- C#程序集系列01,用记事本编写C#,IL代码,用DOS命令编译程序集,运行程序
- CI框架代码运行最详细的流程(不违法广告法吧~)