《Linux内核原理与分析》第六周作业
課本:第五章 系統(tǒng)調(diào)用的三層機制(下)
- 中斷向量0x80和system_call中斷服務(wù)程序入口的關(guān)系
0x80對應(yīng)著system_call中斷服務(wù)程序入口,在start_kernel函數(shù)中調(diào)用了trap_init函數(shù),trap_init函數(shù)中調(diào)用了set_system_trap_gate函數(shù),其中有系統(tǒng)調(diào)用的中斷向量0x80和system_call中斷服務(wù)程序入口的函數(shù)指針,system_call被聲明為一個函數(shù),通過set_system_trap_gate函數(shù)綁定了中斷向量0x80和system_call中斷服務(wù)程序入口之后,一旦執(zhí)行int 0x80,CPU就直接跳轉(zhuǎn)到system_call這個位置執(zhí)行。 - 系統(tǒng)調(diào)用用戶態(tài)接口和系統(tǒng)調(diào)用的內(nèi)核處理函數(shù)是通過系統(tǒng)調(diào)用號匹配起來的
system_call中斷服務(wù)程序執(zhí)行流程
從entry(system_call)開始執(zhí)行,根據(jù)系統(tǒng)調(diào)用號來查sys_call_table表中的位置,調(diào)用系統(tǒng)調(diào)用對應(yīng)的處理函數(shù),在syscall_exit里面判斷當前任務(wù)是否需要處理syscall_exit_work,進入syscall_exit_work,這是最常見的進程調(diào)度時機點。
其中sys_call_table(,%eax,4)可以理解為,分派表中每個表項占4個字節(jié),所以先把系統(tǒng)調(diào)用號(eax)乘以4,再加上sys_call_table分派表的起始地址,得到系統(tǒng)調(diào)用號對應(yīng)的系統(tǒng)調(diào)用內(nèi)核處理函數(shù)的指針。
system_call的執(zhí)行流程圖如下圖所示:
其中,cmpl部分是檢查系統(tǒng)調(diào)用號(應(yīng)小于nr_syscalls),不合法即跳入syscall_badsys異常處理,movl部分是保存返回值到棧中,syscall_exit檢查是否有任務(wù)需要處理,有則進入syscall_exit_work,無則恢復(fù)現(xiàn)場。實驗:分析system_call中斷處理過程
上周我進行實驗選擇的系統(tǒng)調(diào)用是38號rename,首先修改menu目錄下的test.c文件,添加Rename函數(shù),并在main里menuconfig方法里調(diào)用,如下圖所示:
在進行make rootfs后,在qemu中的執(zhí)行效果如下:
后打開gdb,在gdb中調(diào)試,在start_kernel和rename的系統(tǒng)調(diào)用入口sys_rename兩個地方設(shè)置斷點,執(zhí)行效果如下圖所示:
在menuOS中執(zhí)行rename指令后,斷點停在sys_rename系統(tǒng)調(diào)用入口處,如下圖所示:
對system_call的流程理解見上部分流程圖所示。
總結(jié)
本周實驗是了解系統(tǒng)調(diào)用在內(nèi)核代碼中的處理過程,實驗實踐起來會比較容易,但真正了解其在內(nèi)核代碼中的處理過程是十分困難的,在gdb環(huán)境下有些特殊的匯編代碼還無法跟蹤調(diào)試。使用 ALD(Assembly Language Debugger)這個匯編代碼調(diào)試器可以完成匯編代碼的調(diào)試,這會在以后進行實現(xiàn)。總統(tǒng)來說,進行本實驗之后對system_call的關(guān)鍵流程有了清晰的了解,具體的細節(jié)指令還有待研究。
本周的實驗遇到一個路徑問題。在LinuxKernel/menu目錄下直接執(zhí)行init可執(zhí)行文件,在menuOS下執(zhí)行rename指令,發(fā)現(xiàn)指令返回提示成功,并成功更改文件名,如下圖所示:
后把文件名更改回原文件名,在qemu環(huán)境下啟動內(nèi)核和menuOS,執(zhí)行rename指令,指令返回error,并未成功更改文件名,如下圖所示:
翻看rename函數(shù)源代碼,判斷應(yīng)該是文件的路徑問題,源碼中使用的是相對路徑,更改文件路徑為絕對路徑依然不能成功更改文件名。就非常疑惑,qemu環(huán)境下運行menuOS默認的相對路徑到底在什么位置?
與同學討論,大多也遇到了這個問題。本來想使用mkdir系統(tǒng)調(diào)用指令來生成文件,后在shell中使用find指令查找此文件夾,但是遇到了訪問路徑權(quán)限不足的問題,升級到root權(quán)限也無濟于事。。。根據(jù)多個系統(tǒng)調(diào)用指令實驗初步猜想,qemu環(huán)境沒有默認的路徑,其直接從內(nèi)存中讀寫文件。這只是猜想,還望了解此問題的同學、老師看到此博可以給予指導(dǎo)解答。
轉(zhuǎn)載于:https://www.cnblogs.com/intoxication/p/9979516.html
總結(jié)
以上是生活随笔為你收集整理的《Linux内核原理与分析》第六周作业的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到孩子有病了是什么意思
- 下一篇: 是什么样的骚操作让应用上线节省90%的时