exercise 1.12
这个实验说实话我没有理解,只能照猫画虎的做前几问,最后一问实在不会做。
要求:
- 在函数debuginfo_eip中,__STAB_*来自哪里?
- 通过插入对stab_binsearch的调用来完成debuginfo_eip,使之能够找到一个地址的行号。
- 在内核中添加一条backtrace命令,并且修改你的mon_backtrace函数,使之能够调用debuginfo_eip并且以如下格式打印每个栈结构
解答:
- 通过实验提示,打开kern/kernel.ld,发现这个指针来自于其中的下面这几行代码
/* Include debugging information in kernel memory */
.stab : {
PROVIDE(__STAB_BEGIN__ = .);
*(.stab);
PROVIDE(__STAB_END__ = .);
BYTE(0) /* Force the linker to allocate space
for this section */
}
.stabstr : {
PROVIDE(__STABSTR_BEGIN__ = .);
*(.stabstr);
PROVIDE(__STABSTR_END__ = .);
BYTE(0) /* Force the linker to allocate space
for this section */
}
指针begin、end分别表示程序stab段、stabstr段的开始和结束
- 按照实验提示,打开init.s,发现其中信息差不多长这样。
obj/kern/kernel: 文件格式 elf32-i386
.stab 节的内容:
Symnum n_type n_othr n_desc n_value n_strx String
-1 HdrSym 0 1222 000018d7 1
0 SO 0 0 f0100000 1 {standard input}
1 SOL 0 0 f010000c 18 kern/entry.S
2 SLINE 0 44 f010000c 0
3 SLINE 0 57 f0100015 0
4 SLINE 0 58 f010001a 0
5 SLINE 0 60 f010001d 0
6 SLINE 0 61 f0100020 0
7 SLINE 0 62 f0100025 0
8 SLINE 0 67 f0100028 0
symnum什么的,这几个参数是啥意思,我到现在都糊里糊涂。按照网上一篇博客的说法,是这些个意思,但我没在其他地方看到类似的解释,不管baidu还是google。
- Symnum是符号索引,换句话说,整个符号表看作一个数组,Symnum是当前符号在数组中的下标
- n_type是符号类型,FUN指函数名,SLINE指在text段中的行号
- n_othr目前没被使用,其值固定为0
- n_desc表示在文件中的行号
- n_value表示地址。特别要注意的是,这里只有FUN类型的符号的地址是绝对地址,SLINE符号的地址是偏移量,其实际地址为函数入口地址加上偏移量。比如第3行的含义是地址f01000b8(=0xf01000a6+0x00000012)对应文件第34行。
之后照猫画虎的在kdebug.c的line 182写了如下代码。
stab_binsearch(stabs, &lline, &rline, N_SLINE, addr);
if (lline <= rline) {
info->eip_fn_addr = stabs[lline].n_desc;
}
else return -1;
-
只会做第一部分。第二部分的长代码是真不会写,因为我不理解stab表到底扮演了个什么角色,那些个相对地址绝对地址实在搞不明白。
第一部分只是对着monitor.c line 24 直接抄就行了。
static struct Command commands[] = { { "help", "Display this list of commands", mon_help }, { "kerninfo", "Display information about the kernel", mon_kerninfo }, { "backtrace", "Display backtrace info", mon_backtrace }, };
后面的函数编写实在不会。
行了,现在手头上事情太多了,这些鬼东西需要放一放了。太难了,我太菜了。