0x0000a0ec in page_fault ()
(gdb)
//解决方法,在 (gdb) 命令行,一直按 ENTER 键。
(gdb) next
-----------------
现在所有的步骤都正确执行了,gdb能够和bochs连接了,但是linux0.11在运行的时候,却在启动过程中出现页错误,具体信息是:
program received signal 0, Signale 0.
0x0000a0ec in page_fault().
解答:缺页中断是正常的处理,按enter将对应的数据加载到内存中就过去了。
-----------------
gdb tools/system命令的主要目的是装入符号表,而符号信息只存在于system目标文件中,Image文件是内核映像文件,不包含符号信息。
你可以用下面的命令系列来执行,可能更容易理解。
gdb (直接进入gdb)
target remote localhost:1234 (设置远程主机)
symbol-file tools/system (装入符号表信息)
其实代码是在远程主机(bochs)上执行的,在本地主机上运行的gdb,它只需要符号表信息就OK了。
-----------------
+++++++++++++++下面不用 调试功能
1. 修改 bochsrc-fd1-gdb.bxrc
将第一行 注释,即:# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0
2. 下载
3. 解压、编译 内核,生成 Image, 然后,
[root@bogon linux]# vim Image -b
将 1d02 55aa 改为 0000 55aa //软盘文件系统
4. 将修改后的 Image 以及 System.map 复制到 linux-gdb-rh9/linux
5. [root@bogon linux-gdb-rh9]# bochs -q -f bochsrc-fd1-gdb.bxrc
6. 如果修改 0.11内核源代码,重复 1~5,验证是否符合自己的功能需求。
+++++++++++linux下面 阅读 linux 0.11 内核源代码
1. 下载、安装 wine
2. 下载、安装 Source Insight 3.5
++++++++++++++++++++++++++++++++++++++++++下面不用
2. 编译带调试信息的Linux 0.11内核
http://blog.chinaunix.net/uid-27062906-id-3380279.html
从下面的链接下载一个可以在gcc4.0下正常编译和运行的内核版本,这是我们能够找到最接近目前环境的正常版本:
或
[root@bogon ~]# wget
[root@bogon ~]# tar xzvf linux-0.11-060618-gcc4.tar.gz
[root@bogon ~]# mv linux linux-0.11-060618-gcc4
[root@bogon ~]# cd linux-0.11-060618-gcc4
[root@bogon linux-0.11-060618-gcc4]# gedit kernel/blk_drv/blk.h
第87行 #elif 语法错误,改为#else 便可
[root@bogon linux-0.11-060618-gcc4]# gedit Makefile
第14行 CFLAGS =-Wall -O2 -fomit-frame-pointer ,
改为 CFLAGS =-Wall -O -g -fomit-frame-pointer
[root@bogon linux-0.11-060618-gcc4]# make
++++++++++++++++++++++++++++++++++++++++++下面不用
2. 编译带调试信息的Linux 0.11内核
[root@bogon ~]# wget
[root@bogon ~]# tar xzvf linux-0.11.tar.gz
[root@bogon ~]# cd linux-0.11
[root@bogon linux-0.11]# gedit Makefile
更改 RAMDISK = #-DRAMDISK=512为 RAMDISK = -DRAMDISK=2048
更改 ROOT_DEV=/dev/hd6 为ROOT_DEV=FLOPPY
将源码目录(linux-0.11)下所有的Makefile进行修改,如下:
LDFLAGS = -M -x //去掉-s标志
CFLAGS = Wall -O -g -fstrength-reduce -fomit-frame-pointer -fcombine-regs //添加-g标志,去掉-mstring-insns
将boot/bootsect.s和tools/build.c中的SYSSIZE的值改为0x8000
由于Makefile文件较多,这里我写了一个脚本程序adjust_make_for_gdb直接完成上述工作
[root@bogon linux-0.11]# gedit adjust_make_for_gdb.sh
#!/bin/sh
sed -i '5 s/#//' Makefile
sed -i '5 s/512/2048/' Makefile
sed -i '23 s/\/dev\/hd6/FLOPPY/' Makefile
sed -i '6 s/3/8/' boot/bootsect.s
sed -i '35 s/2/8/' tools/build.c
find . -name 'Makefile' |while read filename;do
all_lines=$(grep LDFLAGS $filename -nH | awk -F: '{print $2}')
first_line=$(echo $all_lines|awk '{print $1}')
echo $first_line
sed -i "$first_line s/-s//g" $filename
all_lines=$(grep CFLAGS $filename -nH | awk -F: '{print $2}')
first_line=$(echo $all_lines|awk '{print $1}')
echo $first_line
sed -i "$first_line s/-O -fs/-O -g -fs/g" $filename
sed -i '1,$ s/-mstring-insns//g' $filename
done
[root@bogon linux-0.11]# chmod +x adjust_make_for_gdb.sh //将此脚本放在linux-0.11目录下,执行一遍即可.
[root@bogon linux-0.11]# ./adjust_make_for_gdb.sh
[root@bogon linux-0.11]# cd ..
[root@bogon bochs]# tar czvf gdb-linux-0.11.tar.gz linux-0.11 //执行完,打包此源码.