程序執行軌跡的跟蹤和統計——
還是***那門課的實驗,把它從實驗樓搬過來了。
這個實驗的目的:需要在
linux 0.11
中建立乙個
log檔案用來收集
linux 0.11
執行中所有程序建立、切換以及退出的狀態。為此,我們需要在系統初始化的時候建立乙個
log檔案,用來記錄;需要乙個
fprintk
函式,它可以向
log檔案寫入程序各種狀態;需要在所有控制程序的函式當中加入
fprintk
函式的呼叫,以寫入
log檔案。
首先,修改
linux 0.11
讓它在初始化的時候能夠產生乙個
log檔案,只需要修改
init/main.c
,這裡幾條語句的順序不能顛倒,我們將來需要用檔案描述符
3來指向
log檔案,寫入程序資訊。
把已經寫好的
fprintk
放入kernel/printk.c
中,這個步驟按照實驗提示進行即可。
接下來,我們需要在有關程序的各個呼叫當中,加入
fprintk
,使得系統程序發生改變的時候可以向
log檔案寫入一些資訊。我認為,這個部分順著乙個程序由被建立到最後退出的過程來思考各種狀態切換,會比較清晰。
乙個程序宣告週期,是由
fork
函式開始的。
fork
函式所做的事情,就是將中斷呼叫了
sys_fork
,然後由
sys_fork
呼叫copy_process
,copy_process
會把父程序執行狀態當中的各種引數(核心棧的內容)複製乙份,放進乙個新建的
pcb中,作為新的子程序的
pcb使用。注意,
fork
並不負責切換,它只負責建立乙個跟父程序差不多一模一樣的子程序,放在就緒佇列中等待被切換。一旦
pcb搞定了,放到就緒佇列中了,就沒有
fork
什麼事了。所以,我們需要跟進乙個程序的建立,就需要在
copy_process
(在kernel/fork.c
中)中加入
fprintk
函式呼叫,並且表明兩種狀態,一是
『n』,表示有乙個新程序;二是
『j』,表示有這個程序已經放入就緒佇列,等待被切換。
當乙個程序進入了就緒佇列,那麼它就可能被切換執行,切換的操作由
schedule
函式(在
kernel/sched.c
中)進行,這裡有兩個地方需要注意:第一,切換可能由乙個正在執行中的程序切回到它自己,這個程序的狀態實際上沒有變化,所以
schedule
需要判斷當前程序和將要切換的下乙個程序是不是同乙個傢伙,如果是,那就不需要輸出狀態了,因為沒有變化;第二,需要了解當前程序是因為什麼而被切換,這決定了它的狀態是被切成
『j』還是
『w』,因為當程序睡眠時也會呼叫
schedule
,它並非進入就緒佇列而是進入阻塞佇列。
這個執行中的程序,有可能會進入睡眠狀態,這就是執行到睡眠的切換,通過幾個呼叫來實現:
sys_pause
(在kernel/sched.c中)
(在kernel/exit.c中)
不可中斷睡眠
sleep_on
(在kernel/sched.c
中)
可中斷睡眠
interruptible_sleep_on
(在kernel/sched.c
中)
這裡需要注意的是
sys_pause
和兩個睡眠。
系統在無事可做的時候會不斷呼叫
sys_pause
,所以如果不加乙個條件判斷會造成不斷輸出
0號程序的
『w』狀態的情況。
另外,睡眠程序喚醒順序是反向的,從最後乙個睡眠的程序開始到第乙個睡眠的程序。除了最後乙個程序是被
wake_up
或者訊號喚醒,其餘的都是通過
tmp來喚醒的。所以需要在
tmp所指向的程序狀態改變為
0時輸出
『j』,因為它從阻塞佇列進入就緒佇列。
程序睡眠後,需要通過訊號(在
schedule
中)或者
wake_up
(在kernel/sched.c
中)喚醒,修改如下:
上面已經誰完了程序的建立,以及就緒切執行,執行切就緒,執行切睡眠和睡眠切就緒的狀態,最後只需要再輸出程序退出的狀態就可以了。通過修改,
do_exit
(在kernel/exit.c中)
修改完成了,
make all
一下重新編譯,就可以跑虛擬機器了。
在虛擬機器下面執行自己寫的
process.c
可以看到父程序id是
8,子程序
id分別是
9/10/11/12
,將log
檔案放到自己的
ubuntu
上,執行
python
程式分析
作業系統實驗報告三 16281028
系統呼叫的進一步理解。程序上下文切換。同步與通訊方法。通過fork的方式,產生4個程序p1,p2,p3,p4,每個程序列印輸出自己的名字,例如p1輸出 i am the process p1 要求p1最先執行,p2 p3互斥執行,p4最後執行。通過多次測試驗證實現是否正確。實驗結果 在p2和p3之間...
ucore作業系統 lab1 練習四 實驗報告
1.bootloader如何讀取硬碟扇區的?2.bootloader是如何載入elf格式的os?讀乙個扇區的大致流程 1.等待磁碟準備好 2.發出讀取扇區的命令 3.等待磁碟準備好 4.把磁碟扇區資料讀到指定記憶體 實際操作中,需要知道怎樣與硬碟互動。所有的io操作是通過cpu訪問硬碟的io位址暫存...
實驗報告 四
學 號 20141450041 中國人民公安大學 chinese people public security university 網路對抗技術 實驗報告 實驗四惡意 技術 學生姓名 張珂 年級 2014級 區隊五區隊 指導教師 高見 資訊科技與網路安全學院 2016年11月7日 實驗任務總綱 2...