實驗六 分析Linux核心建立乙個新程序的過程

2021-07-10 20:46:52 字數 1538 閱讀 9645

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