上次我們分析了系統呼叫大致過程,現在我們把這兩個系統呼叫的**放到menuos中,並用gdb跟蹤除錯來看看從system_call開始到iret結束之間的整個過程。
邊看實驗過程邊分析:
首先我們要將系統裡面的menu目錄刪去,然後從github上更新到新版的menu。
接著,把我們之前寫好的getpid()的c版本和asm版本加入到menu中,最後make rootfs啟動系統。這樣系統中就增加了兩個命令。輸入pid或者pid-asm就能看到當前程序號。
menuos系統裝好之後,就該分析這個系統特別是系統呼叫的過程了。我們還是用老辦法,先凍結核心載入,再gdb跟蹤除錯。
啟動gdb,載入3.18.6核心符號表,設定gdbsever遠端除錯埠,在start_kernel處設定斷點等等就不再贅述,前面的文章有詳細操作。直接來看結果。
我們主要來看看在系統呼叫處,這裡是getpid()函式處設定斷點之後,處理過程是怎樣的。
系統啟動過後,輸入pid命令:
這塊出了點狀況。當我輸入pid時是可以得到pid號的,而輸入pid-asm卻被凍結。原因可能是c版本中的getpid不是通過呼叫int 0x80進入中斷的,而我們的匯程式設計序是指定了用int 0x80指令。不過這並不影響我們繼續分析。用list列出此處**也能窺曉一二。一直用s單步執行程式,一步步的觀察執**況:
用finish結束,再接著s單步執行,直到能顯示當前程序號。我們還可以載system_call處設定斷點,接著s單步執行:
觀察完整個過程後,主要的還是對整個過程的理解。
1、使用者通過執行int 0x80彙編指令,使自己從使用者態切換到了核心態。通過執行ireq彙編指令,從系統呼叫中退出。
2、當使用者程序發出int 0x80指令時,cpu切換到核心態並開始從位址system_call處開始執行指令。
3、system_call()函式首先把系統呼叫號和這個異常處理程式可以用到的所有cpu暫存器儲存到相應棧中,再對使用者態程序傳來的系統呼叫號進行有效性檢查,最後呼叫與eax中所包含的系統呼叫號對應的特定服務例程。
4、當系統呼叫服務例程結束時,system_call()函式從eax獲得返回值。如果所有標誌都沒有被設定,函式跳到restore_all處執行,並執行ireq。如果有被設定的標誌,那麼在返回前將有一些工作要完成。
Linux中許可權
當你在linux下用命令ll 或者ls la的時候會看到這些字眼,這些字眼表示為不同使用者組的許可權 r read就是讀許可權 數字4表示 w write就是寫許可權 數字2表示 x excute就是執行許可權 數字1表示 讀 寫 執行三項許可權可以用數字表示,就是r 4,w 2,x 1。所以,rw...
Linux中控制代碼
1.控制代碼就是乙個識別符號,只要獲得物件的控制代碼,我們就可以對物件進行任意的操作。2.控制代碼不一定是指標。作業系統用控制代碼可以找到一塊記憶體,這個控制代碼可能是識別符號,例如map的key,也可能是指標,看作業系統怎麼處理的了。fd算是在某種程度上替代控制代碼吧 linux 有相應機制,但沒...
Linux中的時鐘概念Linux中的時鐘概念
linux的時鐘中斷中涉及至二個全域性變數乙個是xtime,另乙個則是jiffies。有乙個與時間有關的時鐘 實時時鐘 rtc 這是乙個硬體時鐘,用來持久存放系統時間,系統關閉後靠主機板上的微型電池保持計時。系統啟動時,核心 通過讀取rtc來初始化wall time,並存放在xtime變數中,即xt...