《ucore lab1 練習5》實驗報告

2021-09-29 02:39:35 字數 4203 閱讀 2882

我們需要在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

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

>

1. 根據注釋填寫**如下:
void

print_stackframe

(void

)}

2. 上述**所呼叫的函式有read_eip、read_ebp、print_debuginfo

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 *%eax7d6e: ba 00 8a ff ff mov $0xffff8a00,%edx

00007c00 :7c00: fa cli7c01: fc cld7c02: 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

其對應的是第乙個使用堆疊的函式,bootmain.c中的bootmain。(因為此時ebp對應位址的值為0)

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...