在Fedora22环境下编译调试linux 0.12

来源:互联网 发布:淘宝卖家基本设置出错 编辑:程序博客网 时间:2024/04/30 14:31

概述:

本文介绍在Fedora22中编译调试Linux0.12。本文基于网友提供的Linux0.12源代码(我在makefile中做了一处修改)、赵炯博士所提供的linux-0.11-gdb-rh9-050619资料包1,2等资源,完成能够在Fedora22中编译并调试Linux0.12内核(根文件系统存放与硬盘中,而不是软盘)。

 

环境:

Fedora: Fedora release 22

gcc(g++): 5.1.1 20150618 (Red Hat 5.1.1-4)

BOCHS: 2.6.8

as: 2.25

ld: 2.25-8.fc22

nasm: 2.11.06 compiled on Feb 18 2015

gdb: 7.9-11.fc22

 

要点:

1,安装BOCHS

    a) 需要先安装(安装bochs的必要条件):

dnf install libX11

dnf install libX11-devel

dnf install gtk+

dnf install gtk+-devel

dnf install libXrandr

dnf install libXrandr-devel

    b) 下载BOCHS源代码

    c) 在源代码目录中运行BOCHS脚本./configure –enable-gdb-stub

    d) make

    e) make install

    f) BOCHS安装完成


2, 编译Linux0.12内核,网友所提供的版本3

 

3, 其它必要文件

    a) *.bxrc,附件中为bochsrc-gdb.bxrc

    b) 根文件系统,名为:rootimage-0.12-hd

    c) 运行bxrc的脚本

 

4, 运行gdb、BOCHS调试


5, 其它说明

a)  资料下载:点击打开链接

b) bochs找不到

解决办法:bochs默认安装于/usr/local/bin/路径,请将其拷贝至/usr/bin/路径下;

c)  下载相关资料后,不要修改任何文件,直接实验一遍,以测试环境是否OK;

d)  gdb控制端中不断地出现page_fault的情况:

解决办法4

       1)  修改bochs的gdbstub.cc文件的代码:

将代码:

    switch (buffer[0])    {      // 'c [addr]' Continue. addr is address to resume.      // If addr is omitted, resume at current address.      // This packet is deprecated for multi-threading support. See [vCont packet]      case 'c':      {       /* 此处省略数行代码 -- by 博主 */        if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||            last_stop_reason == GDBSTUB_TRACE)        {           write_signal(&buf[1], SIGTRAP);        }        else        {   write_signal(&buf[1], 0);        }        put_reply(buf);        break;      }


修改为:

    switch (buffer[0])    {      // 'c [addr]' Continue. addr is address to resume.      // If addr is omitted, resume at current address.      // This packet is deprecated for multi-threading support. See [vCont packet]      case 'c':      {              /* 此处省略数行代码 -- by 博主 */        if (last_stop_reason == GDBSTUB_EXECUTION_BREAKPOINT ||            last_stop_reason == GDBSTUB_TRACE)        {                 write_signal(&buf[1], SIGTRAP);        }        else if ( last_stop_reason == GDBSTUB_STOP_NO_REASON )        {           write_signal(&buf[1], SIGSEGV);        }        else        {   write_signal(&buf[1], 0);        }        put_reply(buf);        break;      }


               2) 开始gdb后,输入handle SIGSEGV nostop noprint ignore ,以忽略bochs传递过来的SIGSEGV信号。


OK,实践结果:

     

 

后记:

    先发布,有问题再改:)

 

参考:

[1] Linux内核完全剖析-基于0.12内核

[2] http://www.oldlinux.org/Linux.old/kernel/0.1x/

[3] http://www.oldlinux.org/oldlinux/viewthread.php?tid=15138&highlight=nasm

[4] http://blog.163.com/shaoyong_2001/blog/static/1716125702013399858963/

0 0