概述:
本文介绍在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,实践结果:
参考:
[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