zoukankan      html  css  js  c++  java
  • 调试环境搭建

    操作系统相关的代码,始终还是代码,即肯定需要相应的调试工具。

    Bochs是一种十分轻便的使用c++编写的开源IA-32(x86)电脑模拟器,可以运行在最受欢迎的平台上。能仿真英特尔x86 CPU、常见的I/O设备、和定制的BIOS,支持断点调试,调试方法和GDB非常相似。

    现在官网下载Bochs的源码:

    然后将其拷贝到ubuntu下:解压缩:tar -zxvf  bochs-2.4.5.tar.gz 

    然后执行:

    ./configure --enable-debugger --enable-disasm

    此时可能会报错 :

    ERROR: X windows gui was selected, but X windows libraries were not found.

    解决办法:

    sudo apt install xorg-dev
    但是此时可能又会出现这样的情况:

    0% [Connecting to archive.ubuntu.com (2001:67c:1360:8001::21)] 

    解决办法:

    先执行:sudo nano /etc/gai.conf

    然后找到这行命令:#precedence ::ffff:0:0/96 100  把“#“去掉,保存退出即可。

    再次执行 sudo apt install xorg-dev即可安装成功。

    然后,再运行:./configure --enable-debugger --enable-disasm

    又可能出现:

    Package gtk+-2.0 was not found in the pkg-config search path.Perhaps you should add the directory containing `gtk+-2.0.pc'to the PKG_CONFIG_PATH environment variableNo package 'gtk+-2.0' foundERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.Install pkg-config and the gtk+ development package,or disable the gui debugger, or the wxWidgets display library (whichever is being used).

    解决办法:

    sudo apt install libgtk2.0-dev
    之后,再次执行./configure --enable-debugger --enable-disasm,紧接着执行make,又可能出现:

    解决办法:

    在Makefile的92行增加链接库 pthread:

    然后,再make,最后sudo make install即可安装完成。

     安装成功之后,执行bochs,选择选项6,得到:

     

     现在即完成了第一阶段的任务,虽然此时的bochs有发出不能打开硬件设备的错误信息。

    主引导程序肯定是使用汇编编写的,同时微软的.asm后缀汇编,无法使用gcc编译(特意查了一下,使用gcc编译.asm文件,似乎很棘手):

    所以我们安装了nasm这个工具,NASM全称The Netwide Assembler,是一款基于80x86和x86-64平台的汇编语言编译程序。apt install nasm 安装即可:

    然后我们准备一份汇编代码,boot.asm,使用nasm将其编译成bin文件:nasm boot.asm -o boot.bin( 之所以这样,还是因为参考资料使用.asm后缀的汇编,但是什么编译器并不是重点,这段boot.asm的X86汇编也不是重点,目前我主要是使用ARM 汇编,但是这个教程是X86的,也不排除之后在公司是开发X86,但是汇编只用作简单了解即可,重点是先搭建好环境并调试程序,让我们对引导操作系统有个全局认识)。

    在使用bximage(一个制作软盘的工具)生成a.img软盘文件:

    最后,我们需要将编译好的二进制文件导入在软盘中,使用dd命令,将boot.bin文件导入软盘a.img中:

    dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,参考链接(点击

    dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc   其中if表示输入文件名, of表示输出文件名, bs=bytes:同时设置读入/输出的块大小为bytes个字节, count=blocks:仅拷贝blocks个块,块大小等于bs的字节数,conv=conversion:用指定的参数转换文件,notrunc:不截短输出文件。

     

     boot.asm:

    org 0x7c00
    
    start:
        mov ax, cs
        mov ss, ax
        mov ds, ax
        mov es, ax
        
        mov si, msg
        
    print:
        mov al, [si]
        add si, 1
        cmp al, 0x00
        je last
        mov ah, 0x0e
        mov bx, 0x0f
        int 0x10
        jmp print
        
    last:
        hlt
        jmp last
        
    msg:
        db 0x0a, 0x0a
        db "Hello, YGOS!"
        db 0x0a, 0x0a
        times 510-($-$$) db 0x00
        db 0x55, 0xaa

    现在,我们还需要配置Bochs的启动项:

    ###############################################################
    
    # Configuration file for Bochs
    
    ###############################################################
    
    
    
    # how much memory the emulated machine will have
    
    megs: 32
    
    
    
    # filename of ROM images
    
    romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
    
    vgaromimage: file=/usr/share/vgabios/vgabios.bin
    
    
    
    # what disk images will be used
    
    floppya: 1_44=a.img, status=inserted
    
    
    
    # choose the boot disk.
    
    boot: floppy
    
    
    
    # where do we send log messages?
    
    # log: bochsout.txt
    
    
    
    # disable the mouse
    
    mouse: enabled=0
    
    
    
    # enable key mapping, using US layout as default.
    
    keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map

    上面的红色部分是需要填写的路径。同时,我们又需要apt install vgabios这个显卡工具,需要注意的是,这个步骤完成之后,才有

    vgaromimage: file=/usr/share/vgabios/vgabios.bin 这条指令的路径。
    

     安装之后,我们可以使用which bochs ,whereis vgabiso找到主路径,然后根据上面的标红路径完成bochs的启动文件配置。

    在终端输入bochs之后,系统会自动在当前目录下寻找 .bochsrc或bochsrc或bochsrc.txt文件,如果找到有三者之一并语法和逻辑正确,则根据启动文件正常执行bochs。本文使用bochsrc作为其启动文件。bochs也可以显示使用bochs -f bochsrc_file(启动文件名)的方式,这和make寻找makefile的规则一致。

     配置好bochs的启动问价那之后,输入bochs之后,调试界面不再出错,并且停止在程序最开始的地方:

    此时,和GDB操作一样,我们输入continue或者c,得到:

    可以看到,我们的汇编程序,即引导程序,在X86模拟器上的开机画面,打印出了Hello,YGOS!这样,我们就成功安装好了调试环境,并且,还成功将一个简单的引导程序使用bochs模拟器正确运行了起来尽管目前主引导程序并不完善。

    前面也有说到,bochs和GDB很相似,支持断点调试且很多命令包括简写都一致:

  • 相关阅读:
    CTO干点啥?
    [转] 持续集成与持续交付备忘录
    [转]概率基础和R语言
    程序自信
    [转]Neural Networks, Manifolds, and Topology
    ubuntu14 + nginx + php
    [转]http://makefiletutorial.com/
    REDIS key notification
    GO RPC
    xpcall 安全调用
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/10802589.html
Copyright © 2011-2022 走看看