红联Linux门户
Linux帮助

在Fedora22环境下编译调试linux 0.12

发布时间:2015-08-17 10:47:09来源:linux网站作者:wenqibiao8

概述:

本文介绍在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)  资料下载:http://pan.baidu.com/s/1mgzlfss

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,实践结果:

在Fedora22环境下编译调试linux 0.12


参考:

[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/


Linux Shell程序调试:http://www.linuxdiyf.com/linux/12894.html