linux0.00 编译运行调试环境, 在 ubuntu 14 下用as ,ld 编译连接,用bochs 来运行和调试!
可参考如下代码:https://github.com/hjjdebug/linux0.00
甲: 编译
1. wget http://oldlinux.org/Linux.old/bochs/linux-0.00-050613.zip
2. 将这个文件解压缩
3. 进入 linux-0.00-050613 目录, 看一眼README, 解压缩linux-0.00-rh9.tar.gz
4. 进入linux-0.00-rh9, 敲make 编译,提示错误
$as -o head.o head.s
head.s: Assembler messages:
head.s:59: Error: invalid instruction suffix for `pushf'
head.s:61: Error: invalid instruction suffix for `popf'
head.s:68: Error: invalid instruction suffix for `push'
head.s:69: Error: invalid instruction suffix for `push'
....
代码不要改,这是64位机器上编译引起的,告诉汇编器编译成32为code, 只需要加上 --32 就可以了,如下:
AS =as --32
然后编译通过
乙: 运行:
安装bochs
1. sudo apt-get install bochs
2. 到根目录下运行,
bochs -f bochsrc-0.00.bxrc
出现了几个问题,无法运行,需要逐一解决
00000000000p[ ] >>PANIC<< bochsrc-0.00.bxrc:113: directive 'floppy_command_delay' not understood
将该行注释掉, 新的bochs 不支持该命令了
00000000000p[ ] >>PANIC<< bochsrc-0.00.bxrc:135: directive 'ips' not understood
将该行注释掉, 新的bochs 不支持该命令了
00000000000i[ ] lt_dlhandle is (nil)
00000000000p[ ] >>PANIC<< dlopen failed for module 'x': file not found
需要安装bochs-x, plugin
$ sudo apt-get install bochs-x
Event type: PANIC
Device: [MEM0 ]
Message: ROM: System BIOS must end at 0xfffff
修改bochsrc-0.00.bxrc 第一行修改为如下,即删除后面的 address=0xf0000
romimage: file=$BXSHARE/BIOS-bochs-latest
bochs-bin: symbol lookup error: /usr/lib/bochs/plugins/libbx_x.so: undefined symbol: XpmCreatePixmapFromData
需要指定显示库,
先安装显示 plugin
$ sudo apt-get install bochs-sdl
在执行脚本中添加如下命令
display_library: sdl
这样终于可以运行了,完整的控制台log 如下:
bochs -f bochsrc-0.00.bxrc
========================================================================
Bochs x86 Emulator 2.4.6
Build from CVS snapshot, on February 22, 2011
Compiled at Jun 8 2013, 05:16:04
========================================================================
00000000000i[ ] LTDL_LIBRARY_PATH not set. using compile time default '/usr/lib/bochs/plugins'
00000000000i[ ] BXSHARE not set. using compile time default '/usr/share/bochs'
00000000000i[ ] reading configuration from bochsrc-0.00.bxrc
00000000000i[ ] lt_dlhandle is 0x3ad0980
00000000000i[PLGIN] loaded plugin libbx_sdl.so
00000000000i[ ] installing sdl module as the Bochs GUI
00000000000i[ ] using log file bochsout.txt
可见运行还需要安装两个plugin, 并且在配置文件中还要指明显示plugin
丙: 调试
调试需要下载bochs 源码重新编译, ubuntu 上apt-get 安装的默认没有调试功能
1. 下载2.4.6 的源码,与默认安装的保持一致,虽然最新的已经是2.6.9了
从 http://sourceforge.net/projects/bochs/ 网站上下载,网速太慢了,才几K, 需要10多分钟,凑合着等吧。
2. 配置,来个简单点的
./configure --enable-debugger --enable-disasm
No package 'gtk+-2.0' found
$ sudo apt-get install libgnomeui-devel
config 通过,然后就可以make 了,出现了一个错误
undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
原来他要连接pthread 库, 在Makefile中找到对应位置,加入-lpthread 即可通过
$ sudo make install
3. 启动新bochs, 它工作了
bochs -f bochsrc-0.00.bxrc , 可以加-q 跳过启动菜单, 然后停止在如下位置
Next at t=0
(0) [0x00000000fffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0
打 help, 可以看到调试器的帮助信息,调试着陆了!
我们看到
cs:0xf000, dh=0xff0093ff, dl=0x0000ffff, valid=7
Data segment, base=0xffff0000, limit=0x0000ffff, Read/Write, Accessed
eip: 0x0000fff0
目前地址为:0xf000:0x0000fff0, 即0xffff0, 相当于cs 全置1,ip全置0, 这是复位开始地址,此处是bios 的入口地址.
我们不关心bios, 在我们关心的入口下断点。
主引导扇区,主引导程序的概念,bios 读取引导盘第一个扇区到内存
自检通过后BIOS将检查磁盘的第一个扇区(512B,0磁头,0磁道,1扇区)载入内存,载入到内存的地址为0x0000:0x7c00,
如果载入扇区的最后两个字节是55和AA,那么这就是一个引导扇区,这个磁盘也就是一块可引导盘,然后就开始执行这个512B的程序,
系统的控制权也就由BIOS转到了这个512B的程序了。
如果载入扇区的最后两个字节不是55和AA,那么BIOS就检查下一个磁盘驱动器
由于BIOS一次只读一个扇区即512B的数据到内存中,512 byte 干不了什么事,一般是将存在磁盘上的操作系统的核心部分读进内存,然后在跳到操作系统的核心部分去执行。
系统BIOS将启动盘(一般是主硬盘)的第一个扇区(BootSector,引导扇区)读入到内存的0x7c00处,并检查0x7dfe地址的内存,
这个大小为512B的程序称为主引导程序。
后边可以把玩和体会汇编代码了!