linux0.00 编译运行调试环境

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
    <bochs:1>
    打 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的程序称为主引导程序。

    后边可以把玩和体会汇编代码了!

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值