linux内核分析期末,Linux内核分析作业
Linux內核分析課程期末大作業
一.程序的主要設計思路及實現方式
在Linux內核中,存在一個全局變量:init_task.該變量即是Linux第一個啟動的用戶空間進程init對應的task_struct結構.由于該進程是Linux進程樹的"樹根"進程,故而通過此數據結構,可以遍歷當前進程空間的所有進程,并予以輸出.
而要增加一個系統調用,可以選擇在已有的系統調用表中找到一個還未使用的調用號,經檢查,可發現223號調用被標注為未使用,如圖1所示:
圖1
故此給新的系統調用號分配223號.
在修改系統調用表之前首先要找到該表.依據系統調用的原理,在0x80中斷的中斷處理程序中,會有用過call指令對系統調用表的引用.可以在該中斷處理程序入口搜索基址變址尋址的call指令,獲取指令中的基地址,該基地址便是系統調用表的基地址,再設置相應頁表和cr0寄存器的頁表設置,便可對系統調用表進行修改.
二.程序的主要模塊以及劃分
該程序主要分為內核驅動模塊以及用戶控件程序.
1.首先在內核驅動模塊中分以下幾個函數
asmlinkage long sys_hello(void) 自己的系統調用入口
static void printDFS(struct task_struct *t, int depth) 按深度優先遍歷在內核消息中輸出進程樹.
unsigned long get_sys_call_table(void) 通過第一部分描述的方法獲取系統調用表的基地址.
2.用戶空間應用程序
傳入223號系統調用號,通過syscall函數調用響應的系統調用,使該系統調用得以執行.
三.所遇到的問題以及解決方法
1.如何在系統運行狀態下獲取系統調用表基地址?
根據以往在Windows下獲取該地址的經驗以及查閱相關資料,確定了通過中斷處理程序中指令的編碼來獲取系統調用表基地址的辦法.該方法的優點是依賴少,較為準確.缺點是對CPU指令平臺依賴度高,只能在32位80x86環境下使用.
四.程序有運行結果及使用說明
程序的運行結果即為在dmesg輸出的內核消息中輸出了進程樹.
使用方法是在用戶空間中通過syscall函數調用223號系統調用即可.
五.程序運行截圖:
圖2
注:
本次實驗環境:
LinuxMint 32 內核版本 3.18.26
總結
以上是生活随笔為你收集整理的linux内核分析期末,Linux内核分析作业的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mail.rc 端口,配置m
- 下一篇: linux模拟题,Linux操作系统模拟