Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242062
  • 博文数量: 21
  • 博客积分: 796
  • 博客等级: 军士长
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-16 01:03
文章分类
文章存档

2020年(1)

2017年(1)

2016年(1)

2015年(2)

2012年(9)

2011年(7)

我的朋友

分类: LINUX

2016-01-25 15:12:47

实验环境:Ubuntn 14.04、bin86-0.16.17、VirtualBox-4.3.34、Bochs-2.4.6

1. 安装软件

点击(此处)折叠或打开

  1. # 安装as86和ld86
  2. sudo apt-get install bin86
  3. # 安装VirtualBox
  4. sudo apt-get install virtualbox
  5. # 安装Bochs
  6. sudo apt-get install bochs
  7. # 安装Bochs-x,否则启动虚拟机时会产生下面错误信息:
  8. # Event type: PANIC Device: [ ] Message: dlopen failed for
  9. # module 'x': file not found
  10. sudo apt-get install bochs-x
  11. # 安装Bochs的另一种显示方案SDL,否则启动虚拟机时会产生下面错误信息:
  12. # bochs-biin: symbol lookup error:
  13. # /usr/lib/bochs/plugins/libbx_x.so: undefined symbol:
  14. # XpmCreatePixmapFromData
  15. # 使用SDL显示方案后,在虚拟机配置文件bochsrc中需要增加一行:
  16. # display_library: sdl
  17. sudo apt-get install bochs-sdl


2. 编写主引导程序源代码

点击(此处)折叠或打开

  1.     BOOTSEG = 0x07c0
  2.     entry     start
  3. start:
  4.     jmpi    go, BOOTSEG
  5. go:    
  6.     mov     ax, cs
  7.     mov     dx, ax
  8.     mov     es, ax
  9.     mov     [msg+17], ah
  10.     mov     cx, #20
  11.     mov     dx, #0x1004
  12.     mov     bx, #0x000c
  13.     mov     bp, #msg
  14.     mov     ax, #0x1301
  15.     int     0x10
  16. loop0:    
  17.     jmp     loop0
  18. msg:   
  19.     .ascii    "Loading system..."
  20.     .byte     0x0d, 0x0a, 0x00
  21.     .org      510
  22.     .word     0xaa55
该程序的作用是在屏幕上用红色显示字符串“Loading system...”。源代码中没有分段,所有代码和数据存放在一个段中。entry指令用于指定程序的入口指令,这里不是必须的,只是为了消除链接器ld86报告错误信息。注意,不要用Emacs编辑源代码,否则as86可能会产生错误信息。


3. 编译主引导程序

点击(此处)折叠或打开

  1. as86 -0 -o boot.o boot.s
-0选项:生成16位代码。
-o选项:输出的目标文件名。


4. 链接主引导程序

点击(此处)折叠或打开

  1. ld86 -0 -d -s -o boot boot.o
-0选项:生成具有16位魔数的文件头。
-d选项:截去a.out格式32字节的文件头。
-s选项:移除所有符号。
-o选项:输出文件名。


5. 制作启动软盘镜像文件

点击(此处)折叠或打开

  1. # boot.img文件只包含主引导程序的一个扇区
  2. dd if=boot of=boot.img bs=512 count=1
  3. # 在boot.img文件第一个扇区之后追加2879个扇区,构成完整的1.44MB软盘镜像文件
  4. dd if=/dev/zero of=boot.img seek=1 bs=512 count=2879


6. 用VirtualBox运行主引导程序

(1) 新建一个虚拟机
(2) 为虚拟机添加软盘:设置 > 存储 > 添加一个新的控制器到存储树的结尾 > 添加软盘控制器 > 添加虚拟软驱 > 选择磁盘 > 选定boot.img

(3) 设置启动顺序:单击系统 > 将软驱设置为第一个启动设备

(4) 单击”启动“按钮启动虚拟机。


7. 用Bochs运行主引导程序

(1) 编写虚拟机配置文件bochsrc

点击(此处)折叠或打开

  1. megs: 4
  2. romimage: file=$BXSHARE/BIOS-bochs-latest
  3. vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
  4. floppya: 1_44=boot.img, status=inserted
  5. boot: floppy
  6. log: bochsout.txt
  7. mouse: enabled=0
  8. cpu: ips=15000000
  9. display_library: sdl
(2) 启动虚拟机

点击(此处)折叠或打开

  1. bochs -f bochsrc
运行效果如下图所示


8. 参考文献

[1] 《Linux内核完全剖析——基于0.12内核》
[2] bochs安装一系列问题
[3] 自制操作系统:引导扇区的实现




阅读(3997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~