我們需要在lab1中完成kdebug.c中函式print_stackframe的實現,可以通過函式print_stackframe來跟蹤函式呼叫堆疊中記錄的返回位址。如果能夠正確實現此函式,可在lab1中執行 「make qemu」後,在qemu模擬器中得到類似如下的輸出:請完成實驗,看看輸出是否與上述顯示大致一致,並解釋最後一行各個數值的含義。要求完成函式kern/debug/kdebug.c::print_stackframe的實現,提交改進後源**包(可以編譯執行) ,並在實驗報告中簡要說明實現過程,並寫出對上述問題的回答。補充材料:由於顯示完整的棧結構需要解析核心檔案中的除錯符號,較為複雜和繁瑣。**中有一些輔助函式可以使用。例如可以通過呼叫print_debuginfo函式完成查詢對應函式名並列印至螢幕的功能。具體可以參見kdebug.c**中的注釋。
along:
~/src/ucore/labcodes/lab1$ sudo make qemu
warning: image format was not specified for
'bin/ucore.img'
and probing guessed raw.
automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
specify the 'raw' format explicitly to remove the restrictions.
(thu.cst) os is loading ...
special kernel symbols:
entry 0x00100000
(phys)
etext 0x001036f3
(phys)
edata 0x0010e950
(phys)
end 0x0010fdc0
(phys)
kernel executable memory footprint:
64kb
1. 根據注釋填寫**如下:> kern_init -
>
grade_backtrace -
>
grade_backtrace0(0
,(int)kern_init,
0xffff0000)-
>
grade_backtrace1(0
,0xffff0000)-
>
grade_backtrace2(0
,(int)&0
,0xffff0000,(
int)&(
0xffff0000))
->
mon_backtrace(0
,null
,null)-
>
print_stackframe -
>
2. 上述**所呼叫的函式有read_eip、read_ebp、print_debuginfovoid
print_stackframe
(void
)}
read_eip
(void
)
static
inline uint32_t
read_ebp
(void
)
//列印eip以及ebp的相關資訊
print_debuginfo
(uintptr_t eip)
else
fnname[j]
='\0'
;cprintf
(" %s:%d: %s+%d\n"
, info.eip_file, info.eip_line,
fnname, eip - info.eip_fn_addr);}
}
解釋最後一行各個引數的含義ebp:0x00007b38 eip:0x00100bf2 args:0x00010094 0x0010e950 0x00007b68 0x001000a2
kern/debug/kdebug.c:297: print_stackframe+48
ebp:0x00007b48 eip:0x00100f40 args:0x00000000 0x00000000 0x00000000 0x0010008d
kern/debug/kmonitor.c:125: mon_backtrace+23
ebp:0x00007b68 eip:0x001000a2 args:0x00000000 0x00007b90 0xffff0000 0x00007b94
kern/init/init.c:48: grade_backtrace2+32
ebp:0x00007b88 eip:0x001000d1 args:0x00000000 0xffff0000 0x00007bb4 0x001000e5
kern/init/init.c:53: grade_backtrace1+37
ebp:0x00007ba8 eip:0x001000f8 args:0x00000000 0x00100000 0xffff0000 0x00100109
kern/init/init.c:58: grade_backtrace0+29
ebp:0x00007bc8 eip:0x00100124 args:0x00000000 0x00000000 0x00000000 0x0010379c
kern/init/init.c:63: grade_backtrace+37
ebp:0x00007be8 eip:0x00100066 args:0x00000000 0x00000000 0x00000000 0x00007c4f
kern/init/init.c:28: kern_init+101
ebp:0x00007bf8 eip:0x00007d6e args:0xc031fcfa 0xc08ed88e 0x64e4d08e 0xfa7502a8
: -- 0x00007d6d --
最後一行是
ebp:0x00007bf8 eip:0x00007d6e args:0xc031fcfa 0xc08ed88e 0x64e4d08e 0xfa7502a8
,共有ebp,eip和args三類引數,下面分別給出解釋。7d6c: ff d0 call *%eax
7d6e: ba 00 8a ff ff mov $0xffff8a00,%edx
其對應的是第乙個使用堆疊的函式,bootmain.c中的bootmain。(因為此時ebp對應位址的值為0)00007c00 :
7c00: fa cli
7c01: fc cld
7c02: 31 c0 xor %eax,%eax
7c04: 8e d8 mov %eax,%ds
7c06: 8e c0 mov %eax,%es
7c08: 8e d0 mov %eax,%ss
7c0a: e4 64 in $0x64,%al
7c0c: a8 02 test $0x2,%al
7c0e: 75 fa jne 7c0a
bootloader設定的堆疊從0x7c00開始,使用」call bootmain」轉入bootmain函式。
call指令壓棧,所以bootmain中ebp為0x7bf8。
ucore lab1 練習6的實驗報告.
《ucore lab1 練習4》實驗報告
首先要介紹一下 對於bootloader訪問硬碟時都是lba模式的pio方式,也就是說所有的i o操作都是通過cpu訪問硬碟的i o位址暫存器完成。作業系統位於第乙個硬碟上,而訪問第乙個硬碟的扇區可以設定i o埠0x1f0 0x1f7來改變位址暫存器實現。下述 所顯示的即為0x1f0 0x1f7所對...
實驗練習5
實驗任務5 自定義模組及模組匯入程式設計 一 把類studentdoc儲存到模組student.py中 student.py class studentdoc 學生檔案管理 def init self,students number,studens name,major,python score s...
MOOS ivp 實驗二 C 程式設計練習(1)
在moos ivp的第二個實驗中,主要任務是在linux系統中進行c 的程式設計練習。總結 主要記錄一些關於vim的相關操作以及linux中c 的相關程式實驗。基本上所有c 實驗的第一步都是構建乙個hello world檔案,此次實驗當然也不例外。1.先建立乙個文件用來編輯,使用 vim hello...