1、首先進入虛擬機器,開啟終端,這命令列依次敲入以下命令:
cd linuxkernel
一切正常的話,這時候我們簡易的核心系統就啟動起來了,輸入help,就可以看到新新增的命令fork,輸入fork,
2. gdb上述的fork命令
關閉qemu視窗,中命令列中輸入:
qemu -kernel linux-3.18.6/arch/x86/boot/bzimage -initrd rootfs.img -s -s
再次啟動menuos,並暫停等待gdb除錯。
然後水平分割命令列視窗,這新視窗中依次輸入以下命令,啟動除錯:
然後再設定斷點:
實驗**:
fork乙個子程序的**
#include
#include
#include
intmain(
intargc,
char
* argv)
else
if(pid == 0)
else}
建立乙個新程序在核心中的執行過程
從使用者態的**看fork();函式返回了兩次,即在父子程序中各返回一次,父程序從系統呼叫中返回比較容易理解,子程序從系統呼叫中返回,那它在系統呼叫處理過程中的**開始執行的呢?這就涉及子程序的核心堆疊資料狀態和task_struct中thread記錄的sp和ip的一致性問題,這是在**設定的?copy_thread in copy_process
*childregs = *current_pt_regs();
//複製核心堆疊
childregs->ax = 0;
//為什麼子程序的fork返回0,這裡就是原因!
p->
thread
.sp = (unsigned
long
) childregs;
//排程到子程序時的核心棧頂
p->
thread
.ip = (unsigned
long
) ret_from_fork;
//排程到子程序時的第一條指令位址
實驗8 分析乙個奇怪的程式
仔細閱讀9.3節依據位移進行轉移的jmp指令,然後理解下面的這個很奇怪的程式就容易多了,當然要看著機器碼去分析。assume cs codesg codesg segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s m...
實驗8 分析乙個奇怪的程式
分析 assume cs codesg codesg segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s mov si,offset s2 mov ax,cs si mov cs di ax s0 jmp shor...
彙編實驗八 分析乙個奇怪的程式
assueme cs codesg codesg segment mov ax,4c00h int 21h start mov ax,0 s nop nopmov di,offset s mov si,offset s2 mov ax,cs si mov cs di ax s0 jmp short ...