大三了,選了一門作業系統實驗課。
第乙個實驗就要求為linux新增系統呼叫。
於是乎,照著網上的教程一步步做。
奈何,編譯核心這步實在太頭疼了,雖然第一次就成功了,但是在效能還行的台式電腦上居然還花了兩個半小時!
接著,感覺教程上的系統呼叫好弱智,我又寫了個複雜一些的函式,想把它加進去試一試。
這次出問題了,我用筆記本編譯了2個小時後,突然蹦出個錯誤,編譯終止!
仔細對了一下教程,原來是少敲了」sys_「,在這一瞬間,我有種想砸電腦的衝動!
兩個小時啊,我是用我那百般無辜的水汪汪的大眼睛盯著螢幕度過的,說得有點過。
反正就是不服氣,為什麼編譯器偏偏就在這最後關頭才發現這個錯誤,有錯你早說嘛,我改還不行麼,
可是你為什麼2個小時後才告訴我,我的時間就不是時間嗎?
然後,我就萌生了這樣乙個想法,能不能動態地新增系統呼叫呢?
度娘告訴我,能!
於是乎,瘋狂找教程,瘋狂試**,結果沒乙個可以用。
問題總是出在sys_call_table上,它是系統呼叫表的首址。
因為sys_call_table無法直接extern
所以只好來狠的,直接給它賦值!
可是,如何得到sys_call_table的位址呢,我看了不下5種方法,都太複雜,
只有一種深深地打動了我,那就是。。。
cat /proc/kallsyms | grep sys_call_table
當然,需要root許可權。
這是我的結果
c1504160 r sys_call_table
可見,其位址為0xc1504160。
很激動,終於可以開工了。
首先,挑選系統呼叫號,我決定把rmdir這個命令對應的系統呼叫該掉!!!
vim /usr/src/linux/arch/x86/include/asm/unistd_32.h
發現它對應的號碼是40
嘿嘿,模組的**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define _nr_mycall 40
#define sys_call_table_adress 0xc1504160
嘿嘿 大功告成了,現在我的rmdir終於不能用了,哈哈!
linux 新增系統呼叫
此文於2010 02 26被推薦到csdn首頁 如何被推薦?新的建立檔案描述符的 syscall 一般都支援額外的 flags 引數,可以直接指定 o nonblock 和 fd cloexec,例如 以上 6 個 syscalls,除了最後乙個是新功能,其餘的都是增強原有的呼叫,把數字尾號去掉就是...
核心新增系統呼叫
在 windows 下新增系統呼叫不像 linux 那樣容易,windows 系統呼叫與使用者程式之間還有 ntdll.dll 層,而這一層微軟沒有提供源 但是我們從系統呼叫的實現機制出發,不管是在 linux 還是windows 系統呼叫的實現都是通過中斷來實現的,可以利用中斷的方式呼叫新新增的系...
Linux新增系統呼叫
修改核心 新增函式,新增函式宣告以及新增系統呼叫id,來實現給自己編譯的核心新增系統呼叫。當然這個過程是在編譯核心之前完成的,核心編譯過程請參照linux核心編譯 進入解壓的檔案目錄 cd usr src linux 5.1 kernel在sys.c中新增函式 執行vim sys.c使用vim開啟s...