JOS lab4 用戶程序分析

JOS lab4 用戶程序分析


dumbfork.c:


這裏fork的實現機制太重要了, 單獨拎出來分析.

http://blog.csdn.net/cinmyheart/article/details/45342007


faultread.c faultdie.c:

這兩個用戶程序一起分析

左右兩個用戶程序,都試圖對非法地址寫入數據,但是左邊的就會導致 page fault ,觸發的是內核trap


而後邊的就會進入打印trap frame,導致系統掛掉,而右邊的不會,右邊的由於有用戶空間的處理機制,

還是建議自己一步步跟蹤去看.


faultalloc.c faultallocbad.c :


這裏還是用戶空間直接調用系統調用處理函數,還是通過用戶程序觸發page fault 之後再用用戶空間page fault handler處理異常.和之前的faultread.c faultdie.c是一個原理,換湯不換藥啊哈哈...



faultbadhandler.c :



這裏由於設置的把 0xDeadBeef當做handler的地址,是錯誤的,這是個非法地址.

我特意註釋了,只要按照我註釋的來運行,就可以處理好這裏的賦值操作引起的page fault.




同樣handler設置不正確的還有

faultevilhandler.c:


這裏的問題在於handler的地址 0xF0100020是個內核高地址.非法的,我們設置的用戶態page fault handler必須處於用戶空間內.不能放在內核地址.


faultnostack.c:

觀察各種配置好的 user space page fault handler 處理機制,都有異常棧的設置,但是這裏沒有,於是,掛.

要知道所有的user space page fault handler都是運行在exception stack裏面的,而不是normal user stack.也不是kernel stack.

而且這裏僅僅只配置了內核向上銜接處理用戶page fault的藉口 _pgfault_upcall.連handler都沒寫.





forktree.c:

這個在lab4實驗報告裏面有


pingpong.c:


這裏很有意思.fork出一個子進程,然後由父進程發送一個值給pid爲who的進程(即子進程,這裏注意,父進程和子進程的who變量值不同就好.父進程的who是子進程的pid,子進程的who是0).

然後兩個進程都落入到while循環,首先子進程接受信息,接受到了就打印這個信息 i.

i++,接着對於子進程來說who值已經改變了,在ipc_recv的時候傳參的時候是&who.這裏函數內部會把誰傳遞信息給子進程的pid賦值給who.注意我這裏沒有特別說明是父進程,而用了"誰傳遞信息給這個子進程".因爲在其他情形中,可能不僅僅只有父進程給這個子進程傳遞信息.

爾後雙方互發信息....每個進程爲i值增加1,雙方交互十次然後結束.呵呵...所以這個程序看起來就像

雙方打乒乓球一樣...ping ping pong pong ...




spin.c:


這個用戶程序看起來還是很簡單的,子進程有點作死,居然死循環.這個時候會如果沒有好的調度策略那麼這貨會一直搶佔着CPU,大家也就都別玩了,,,

這樣不好...怎麼辦呢?可以通過一個定時器中來觸發外部硬件中斷,由這個中斷來完成進程的讓出.

這裏parent process 各種讓出CPU,然後又被子進程霸佔CPU,等一段時間了定時器開始觸發中斷,這個時候CPU響應中斷.開始處理這個定時器中斷,我們就可以在處理機制裏面做手腳,怎麼做呢?

看下面:

在 trap_dispatch裏面添加下面的代碼用來檢測觸發的外部硬件中斷是否爲定時器中斷.


看,我們添加了sched_yield();主動讓出這個一直搶佔CPU的進程.

由於之前初始化的時間片太短了,可能測試程序的感覺不明顯.

我們可以去kern/lapic.c裏面修改下面的代碼.

註釋哪行是實驗老師原來設置的默認定時器初始值,現在看到的時我自己設置的0xFFFFFFF

一個大概足夠大的數據就好,我沒有深究這裏的意義.因爲這貨和CPU的主頻速度有關係,是一個不斷做減法的過程.(以前玩過單片機還是有好處的哇...)

這裏修改過這個參數後去運行spin的話就會發現,child Spinning ...那個地方會有明顯的停頓.如果不把時間增加,那地方一閃就過了.這裏爲什麼要設置恰當的時間,實驗者可以自己想想 : )



測試完之後記得把TICR的值改回去,不然grade的時候可能時間太長過不了.




後面還有一些fork和IPC結合的demo, 我覺得只要把上面這些demo搞定了, 那幾個都不是事兒.

就不繼續贅述了. 如果是在不能理解, 疑問的話, 也歡迎交流討論


有誤解的話,懇請斧正.


2015.04.30 update... 補充了dumbfork的分析link. 因爲之前一直也沒有完全透徹的明白其中的奧義~ 明白了,神清氣爽...





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章