首先,命令應(yīng)該是好和其他兩個(gè)區(qū)分開來的了,因?yàn)槊疃际强梢灾苯忧迷趕hell上面回車執(zhí)行的,而系統(tǒng)調(diào)用和庫(kù)函數(shù)都不行;
創(chuàng)新互聯(lián)擁有10年成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供成都網(wǎng)站建設(shè)、做網(wǎng)站服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、重慶APP開發(fā)公司、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、空間域名等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營(yíng)銷、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項(xiàng)目的能力。
其次,百Linux系統(tǒng)調(diào)用和C庫(kù)函數(shù)都是函數(shù)的形式,即都是“func(args)”的形式,但系統(tǒng)調(diào)用是
由系統(tǒng)內(nèi)核對(duì)外提供的服務(wù)接口;C庫(kù)函數(shù)和你自己寫的普通的函數(shù)沒有本質(zhì)的區(qū)別,只是在度C標(biāo)準(zhǔn)庫(kù)中而已,Linux上面glibc就是C函數(shù)庫(kù)。從表專面上看兩者不太好區(qū)分,不過,你可以從它們需要包含的頭文件來區(qū)分,C庫(kù)函數(shù)像printf在stdio.h中,std就是標(biāo)準(zhǔn)(standard)的縮寫形式,因此在stdxxx.h中的函數(shù),基本都是C庫(kù)函數(shù);像
ssize_t
read(int
fd,
void
*buf,
size_t
count);這樣很多的系統(tǒng)調(diào)用是包含在unistd.h中的,unistd意思是UNIX
Standard,從這個(gè)意義就可以區(qū)分了。
希望對(duì)你有所幫助,如還有問題,可隨屬時(shí)聯(lián)系我:-)
system是系統(tǒng)的意思。
system作為名詞是制度、體制、系統(tǒng)、方法的意思。
system復(fù)數(shù)形式是systems,固定短語(yǔ)搭配有control system意為“控制系統(tǒng)”、management system意為“管理系統(tǒng)、經(jīng)營(yíng)責(zé)任制”、legal system意為“法律制度”、management information system意為“管理信息系統(tǒng)”、binary system意為“二進(jìn)制”。
linux命令格式:
說明:command: 命令名,相應(yīng)功能的英文單詞或單詞的縮寫 [-options]:選項(xiàng),可用來對(duì)命令進(jìn)行控制,也可以省略,[]代表可選 parameter1 …:傳給命令的參數(shù):可以是零個(gè)一個(gè)或多個(gè)
一般是linux命令自帶的幫助信息
如:
man是linux提供的一個(gè)手冊(cè),包含了絕大部分的命令、函數(shù)使用說明
該手冊(cè)分成很多章節(jié)(section),使用man時(shí)可以指定不同的章節(jié)來瀏覽。
例:man ls ; man 2 printf
man中各個(gè)section意義如下:
man是按照手冊(cè)的章節(jié)號(hào)的順序進(jìn)行搜索的。
man設(shè)置了如下的功能鍵:
在敲出命令的前幾個(gè)字母的同時(shí),按下tab鍵,系統(tǒng)會(huì)自動(dòng)幫我們補(bǔ)全命令
當(dāng)系統(tǒng)執(zhí)行過一些命令后,可按上下鍵翻看以前的命令,history將執(zhí)行過的命令列舉出來
ls是英文單詞list的簡(jiǎn)寫,其功能為列出目錄的內(nèi)容,是用戶最常用的命令之一,它類似于DOS下的dir命令。
Linux文件或者目錄名稱最長(zhǎng)可以有265個(gè)字符,“.”代表當(dāng)前目錄,“..”代表上一級(jí)目錄,以“.”開頭的文件為隱藏文件,需要用 -a 參數(shù)才能顯示。
ls常用參數(shù):
Linux允許將命令執(zhí)行結(jié)果重定向到一個(gè)文件,本應(yīng)顯示在終端上的內(nèi)容保存到指定文件中。
如:ls test.txt ( test.txt 如果不存在,則創(chuàng)建,存在則覆蓋其內(nèi)容 )
注意: 輸出重定向會(huì)覆蓋原來的內(nèi)容,輸出重定向則會(huì)追加到文件的尾部。
查看內(nèi)容時(shí),在信息過長(zhǎng)無(wú)法在一屏上顯示時(shí),會(huì)出現(xiàn)快速滾屏,使得用戶無(wú)法看清文件的內(nèi)容,此時(shí)可以使用more命令,每次只顯示一頁(yè),按下空格鍵可以顯示下一頁(yè),按下q鍵退出顯示,按下h鍵可以獲取幫助。
管道:一個(gè)命令的輸出可以通過管道做為另一個(gè)命令的輸入。
管道我們可以理解現(xiàn)實(shí)生活中的管子,管子的一頭塞東西進(jìn)去,另一頭取出來,這里“ | ”的左右分為兩端,左端塞東西(寫),右端取東西(讀)。
clear作用為清除終端上的顯示(類似于DOS的cls清屏功能),也可使用快捷鍵:Ctrl + l ( “l(fā)” 為字母 )。
在使用Unix/Linux的時(shí)候,經(jīng)常需要更換工作目錄。cd命令可以幫助用戶切換工作目錄。Linux所有的目錄和文件名大小寫敏感
cd后面可跟絕對(duì)路徑,也可以跟相對(duì)路徑。如果省略目錄,則默認(rèn)切換到當(dāng)前用戶的主目錄。
使用pwd命令可以顯示當(dāng)前的工作目錄,該命令很簡(jiǎn)單,直接輸入pwd即可,后面不帶參數(shù)。
通過mkdir命令可以創(chuàng)建一個(gè)新的目錄。參數(shù)-p可遞歸創(chuàng)建目錄。
需要注意的是新建目錄的名稱不能與當(dāng)前目錄中已有的目錄或文件同名,并且目錄創(chuàng)建者必須對(duì)當(dāng)前目錄具有寫權(quán)限。
可使用rmdir命令刪除一個(gè)目錄。必須離開目錄,并且目錄必須為空目錄,不然提示刪除失敗。
可通過rm刪除文件或目錄。使用rm命令要小心,因?yàn)槲募h除后不能恢復(fù)。為了防止文件誤刪,可以在rm后使用-i參數(shù)以逐個(gè)確認(rèn)要?jiǎng)h除的文件。
常用參數(shù)及含義如下表所示:
Linux鏈接文件類似于Windows下的快捷方式。
鏈接文件分為軟鏈接和硬鏈接。
軟鏈接:軟鏈接不占用磁盤空間,源文件刪除則軟鏈接失效。
硬鏈接:硬鏈接只能鏈接普通文件,不能鏈接目錄。
使用格式:
如果沒有-s選項(xiàng)代表建立一個(gè)硬鏈接文件,兩個(gè)文件占用相同大小的硬盤空間,即使刪除了源文件,鏈接文件還是存在,所以-s選項(xiàng)是更常見的形式。
注意:如果軟鏈接文件和源文件不在同一個(gè)目錄,源文件要使用絕對(duì)路徑,不能使用相對(duì)路徑。
Linux系統(tǒng)中g(shù)rep命令是一種強(qiáng)大的文本搜索工具,grep允許對(duì)文本文件進(jìn)行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
grep一般格式為:
在grep命令中輸入字符串參數(shù)時(shí),最好引號(hào)或雙引號(hào)括起來。例如:grep‘a(chǎn) ’1.txt。
常用選項(xiàng)說明:
find命令功能非常強(qiáng)大,通常用來在特定的目錄下搜索符合條件的文件,也可以用來搜索特定用戶屬主的文件。
常用用法:
cp命令的功能是將給出的文件或目錄復(fù)制到另一個(gè)文件或目錄中,相當(dāng)于DOS下的copy命令。
常用選項(xiàng)說明:
用戶可以使用mv命令來移動(dòng)文件或目錄,也可以給文件或目錄重命名。
常用選項(xiàng)說明:
計(jì)算機(jī)中的數(shù)據(jù)經(jīng)常需要備份,tar是Unix/Linux中最常用的備份工具,此命令可以把一系列文件歸檔到一個(gè)大文件中,也可以把檔案文件解開以恢復(fù)數(shù)據(jù)。
tar使用格式 tar [參數(shù)] 打包文件名 文件
tar命令很特殊,其參數(shù)前面可以使用“-”,也可以不使用。
常用參數(shù):
tar與gzip命令結(jié)合使用實(shí)現(xiàn)文件打包、壓縮。 tar只負(fù)責(zé)打包文件,但不壓縮,用gzip壓縮tar打包后的文件,其擴(kuò)展名一般用xxxx.tar.gz。
gzip使用格式如下:
gzip [選項(xiàng)] 被壓縮文件
常用選項(xiàng):
tar與bzip2命令結(jié)合使用實(shí)現(xiàn)文件打包、壓縮(用法和gzip一樣)。
tar只負(fù)責(zé)打包文件,但不壓縮,用bzip2壓縮tar打包后的文件,其擴(kuò)展名一般用xxxx.tar.gz2。
在tar命令中增加一個(gè)選項(xiàng)(-j)可以調(diào)用bzip2實(shí)現(xiàn)了一個(gè)壓縮的功能,實(shí)行一個(gè)先打包后壓縮的過程。
壓縮用法:tar -jcvf 壓縮包包名 文件...(tar jcvf bk.tar.bz2 *.c)
解壓用法:tar -jxvf 壓縮包包名 (tar jxvf bk.tar.bz2)
通過zip壓縮文件的目標(biāo)文件不需要指定擴(kuò)展名,默認(rèn)擴(kuò)展名為zip。
壓縮文件:zip [-r] 目標(biāo)文件(沒有擴(kuò)展名) 源文件
解壓文件:unzip -d 解壓后目錄文件 壓縮文件
whoami該命令用戶查看當(dāng)前系統(tǒng)當(dāng)前賬號(hào)的用戶名??赏ㄟ^cat /etc/passwd查看系統(tǒng)用戶信息。
由于系統(tǒng)管理員通常需要使用多種身份登錄系統(tǒng),例如通常使用普通用戶登錄系統(tǒng),然后再以su命令切換到root身份對(duì)傳統(tǒng)進(jìn)行管理。這時(shí)候就可以使用whoami來查看當(dāng)前用戶的身份。
who命令用于查看當(dāng)前所有登錄系統(tǒng)的用戶信息。
常用選項(xiàng):
如果是圖形界面,退出當(dāng)前終端;
如果是使用ssh遠(yuǎn)程登錄,退出登陸賬戶;
如果是切換后的登陸用戶,退出則返回上一個(gè)登陸賬號(hào)。
在Unix/Linux中添加用戶賬號(hào)可以使用adduser或useradd命令,因?yàn)閍dduser命令是指向useradd命令的一個(gè)鏈接,因此,這兩個(gè)命令的使用格式完全一樣。
useradd命令的使用格式如下:
useradd [參數(shù)] 新建用戶賬號(hào)
在Unix/Linux中,超級(jí)用戶可以使用passwd命令為普通用戶設(shè)置或修改用戶口令。用戶也可以直接使用該命令來修改自己的口令,而無(wú)需在命令后面使用用戶名。
可以通過su命令切換用戶,su后面可以加“-”。su和su –命令不同之處在于,su -切換到對(duì)應(yīng)的用戶時(shí)會(huì)將當(dāng)前的工作目錄自動(dòng)轉(zhuǎn)換到切換后的用戶主目錄:
注意:如果是ubuntu平臺(tái),需要在命令前加“sudo”,如果在某些操作需要管理員才能操作,ubuntu無(wú)需切換到root用戶即可操作,只需加“sudo”即可。sudo是ubuntu平臺(tái)下允許系統(tǒng)管理員讓普通用戶執(zhí)行一些或者全部的root命令的一個(gè)工具,減少了root 用戶的登陸和管理時(shí)間,提高了安全性。
方法一:
方法二:
groupadd 新建組賬號(hào) groupdel 組賬號(hào) cat /etc/group 查看用戶組
使用方法:usermod -g 用戶組 用戶名
新創(chuàng)建的用戶,默認(rèn)不能sudo,需要進(jìn)行一下操作
-g用來制定這個(gè)用戶默認(rèn)的用戶組
-G一般配合'-a'來完成向其它組添加
chmod 修改文件權(quán)限有兩種使用格式:字母法與數(shù)字法。
字母法:chmod u/g/o/a +/-/= rwx 文件
cal命令用于查看當(dāng)前日歷,-y顯示整年日歷
設(shè)置時(shí)間格式(需要管理員權(quán)限):
date [MMDDhhmm[[CC]YY][.ss]] +format
CC為年前兩位yy為年的后兩位,前兩位的mm為月,后兩位的mm為分鐘,dd為天,hh為小時(shí),ss為秒。如: date 010203042016.55。
顯示時(shí)間格式(date '+%y,%m,%d,%H,%M,%S'):
進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序,它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元。
ps命令可以查看進(jìn)程的詳細(xì)狀況,常用選項(xiàng)(選項(xiàng)可以不加“-”)如下:
top命令用來動(dòng)態(tài)顯示運(yùn)行中的進(jìn)程。top命令能夠在運(yùn)行后,在指定的時(shí)間間隔更新顯示信息??梢栽谑褂胻op命令時(shí)加上-d 來指定顯示信息更新的時(shí)間間隔。
在top命令執(zhí)行后,可以按下按鍵得到對(duì)顯示的結(jié)果進(jìn)行排序:
kill命令指定進(jìn)程號(hào)的進(jìn)程,需要配合 ps 使用。有些進(jìn)程不能直接殺死,這時(shí)候我們需要加一個(gè)參數(shù)“ -9 ”,“ -9 ” 代表強(qiáng)制結(jié)束.
使用格式:
kill [-signal] pid
df命令用于檢測(cè)文件系統(tǒng)的磁盤空間占用和空余情況,可以顯示所有文件系統(tǒng)對(duì)節(jié)點(diǎn)和磁盤塊的使用情況。
du命令用于統(tǒng)計(jì)目錄或文件所占磁盤空間的大小,該命令的執(zhí)行結(jié)果與df類似,du更側(cè)重于磁盤的使用狀況。
du命令的使用格式如下: du [選項(xiàng)] 目錄或文件名
一、Linux0.11下添加系統(tǒng)調(diào)用:\x0d\x0a\x0d\x0a我在bochs2.2.1中對(duì)linux0.11內(nèi)核添加了一個(gè)新的系統(tǒng)調(diào)用,步驟如下: \x0d\x0a1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87 \x0d\x0a然后在下面聲明函數(shù)原型:int mytest(); \x0d\x0a2./usr/src/linux/include/linux/sys.h中添加:extern int sys_mytest(); \x0d\x0a然后在sys_call_table中最后加上sys_mytest; \x0d\x0a3.在/usr/src/linux/kernel/sys.c中添加函數(shù)實(shí)現(xiàn)如下: \x0d\x0aint sys_mytest(){ \x0d\x0aprintk("This is a test!"); \x0d\x0areturn 123; \x0d\x0a} \x0d\x0a4.在/usr/src/linux/kernel/system_call.s中對(duì)系統(tǒng)調(diào)用號(hào)加1(原來是86改成了87) \x0d\x0a5.然后到/usr/src/linux目錄下編譯內(nèi)核make clean; make Image \x0d\x0a6. cp /usr/src/linux/include/unistd.h /usr/include/unistd.h \x0d\x0a7. reset bochs \x0d\x0a8. 在/usr/root中生成test.c文件如下: \x0d\x0a#define __LIBRARY__ \x0d\x0a#include \x0d\x0a_syscall0(int,mytest) \x0d\x0aint main(){ \x0d\x0aint a; \x0d\x0aa = mytest(); \x0d\x0aprintf("%d", a); \x0d\x0areturn 0; \x0d\x0a} \x0d\x0a9.然后gcc test.c編譯之后運(yùn)行a.out,前面所有步驟都通過,但是每次調(diào)用都是返回-1,然后我查過errno為1(表示操作不允許),就不知道為什么了? \x0d\x0a系統(tǒng)知道的高手們能夠告知一下,不勝感激!這個(gè)問題困擾我很久了! \x0d\x0a\x0d\x0a二、新Linux內(nèi)核添加系統(tǒng)調(diào)用\x0d\x0a\x0d\x0a如何在Linux系統(tǒng)中添加新的系統(tǒng)調(diào)用\x0d\x0a系統(tǒng)調(diào)用是應(yīng)用程序和操作系統(tǒng)內(nèi)核之間的功能接口。其主要目的是使得用戶可以使用操作系統(tǒng)提供的有關(guān)設(shè)備管理、輸入/輸入系統(tǒng)、文件系統(tǒng)和進(jìn)程控制、通信以及存儲(chǔ)管理等方面的功能,而不必了解系統(tǒng)程序的內(nèi)部結(jié)構(gòu)和有關(guān)硬件細(xì)節(jié),從而起到減輕用戶負(fù)擔(dān)和保護(hù)系統(tǒng)以及提高資源利用率的作用。\x0d\x0a\x0d\x0aLinux操作系統(tǒng)作為自由軟件的代表,它優(yōu)良的性能使得它的應(yīng)用日益廣泛,不僅得到專業(yè)人士的肯定,而且商業(yè)化的應(yīng)用也是如火如荼。在Linux中,大部分的系統(tǒng)調(diào)用包含在Linux的libc庫(kù)中,通過標(biāo)準(zhǔn)的C函數(shù)調(diào)用方法可以調(diào)用這些系統(tǒng)調(diào)用。那么,對(duì)Linux的發(fā)燒友來說,如何在Linux中增加新的系統(tǒng)調(diào)用呢? \x0d\x0a1 Linux系統(tǒng)調(diào)用機(jī)制\x0d\x0a\x0d\x0a在Linux系統(tǒng)中,系統(tǒng)調(diào)用是作為一種異常類型實(shí)現(xiàn)的。它將執(zhí)行相應(yīng)的機(jī)器代碼指令來產(chǎn)生異常信號(hào)。產(chǎn)生中斷或異常的重要效果是系統(tǒng)自動(dòng)將用戶態(tài)切換為核心態(tài)來對(duì)它進(jìn)行處理。這就是說,執(zhí)行系統(tǒng)調(diào)用異常指令時(shí),自動(dòng)地將系統(tǒng)切換為核心態(tài),并安排異常處理程序的執(zhí)行。Linux用來實(shí)現(xiàn)系統(tǒng)調(diào)用異常的實(shí)際指令是:\x0d\x0a\x0d\x0aInt $0x80\x0d\x0a\x0d\x0a這一指令使用中斷/異常向量號(hào)128(即16進(jìn)制的80)將控制權(quán)轉(zhuǎn)移給內(nèi)核。為達(dá)到在使用系統(tǒng)調(diào)用時(shí)不必用機(jī)器指令編程,在標(biāo)準(zhǔn)的C語(yǔ)言庫(kù)中為每一系統(tǒng)調(diào)用提供了一段短的子程序,完成機(jī)器代碼的編程工作。事實(shí)上,機(jī)器代碼段非常簡(jiǎn)短。它所要做的工作只是將送給系統(tǒng)調(diào)用的參數(shù)加載到CPU寄存器中,接著執(zhí)行int $0x80指令。然后運(yùn)行系統(tǒng)調(diào)用,系統(tǒng)調(diào)用的返回值將送入CPU的一個(gè)寄存器中,標(biāo)準(zhǔn)的庫(kù)子程序取得這一返回值,并將它送回用戶程序。\x0d\x0a\x0d\x0a為使系統(tǒng)調(diào)用的執(zhí)行成為一項(xiàng)簡(jiǎn)單的任務(wù),Linux提供了一組預(yù)處理宏指令。它們可以用在程序中。這些宏指令取一定的參數(shù),然后擴(kuò)展為調(diào)用指定的系統(tǒng)調(diào)用的函數(shù)。\x0d\x0a\x0d\x0a這些宏指令具有類似下面的名稱格式:\x0d\x0a\x0d\x0a_syscallN(parameters)\x0d\x0a\x0d\x0a其中N是系統(tǒng)調(diào)用所需的參數(shù)數(shù)目,而parameters則用一組參數(shù)代替。這些參數(shù)使宏指令完成適合于特定的系統(tǒng)調(diào)用的擴(kuò)展。例如,為了建立調(diào)用setuid()系統(tǒng)調(diào)用的函數(shù),應(yīng)該使用:\x0d\x0a\x0d\x0a_syscall1( int, setuid, uid_t, uid )\x0d\x0a\x0d\x0asyscallN( )宏指令的第1個(gè)參數(shù)int說明產(chǎn)生的函數(shù)的返回值的類型是整型,第2個(gè)參數(shù)setuid說明產(chǎn)生的函數(shù)的名稱。后面是系統(tǒng)調(diào)用所需要的每個(gè)參數(shù)。這一宏指令后面還有兩個(gè)參數(shù)uid_t和uid分別用來指定參數(shù)的類型和名稱。\x0d\x0a\x0d\x0a另外,用作系統(tǒng)調(diào)用的參數(shù)的數(shù)據(jù)類型有一個(gè)限制,它們的容量不能超過四個(gè)字節(jié)。這是因?yàn)閳?zhí)行int $0x80指令進(jìn)行系統(tǒng)調(diào)用時(shí),所有的參數(shù)值都存在32位的CPU寄存器中。使用CPU寄存器傳遞參數(shù)帶來的另一個(gè)限制是可以傳送給系統(tǒng)調(diào)用的參數(shù)的數(shù)目。這個(gè)限制是最多可以傳遞5個(gè)參數(shù)。所以Linux一共定義了6個(gè)不同的_syscallN()宏指令,從_syscall0()、_syscall1()直到_syscall5()。\x0d\x0a\x0d\x0a一旦_syscallN()宏指令用特定系統(tǒng)調(diào)用的相應(yīng)參數(shù)進(jìn)行了擴(kuò)展,得到的結(jié)果是一個(gè)與系統(tǒng)調(diào)用同名的函數(shù),它可以在用戶程序中執(zhí)行這一系統(tǒng)調(diào)用。\x0d\x0a2 添加新的系統(tǒng)調(diào)用 \x0d\x0a如果用戶在Linux中添加新的系統(tǒng)調(diào)用,應(yīng)該遵循幾個(gè)步驟才能添加成功,下面幾個(gè)步驟詳細(xì)說明了添加系統(tǒng)調(diào)用的相關(guān)內(nèi)容。\x0d\x0a\x0d\x0a(1) 添加源代碼\x0d\x0a\x0d\x0a第一個(gè)任務(wù)是編寫加到內(nèi)核中的源程序,即將要加到一個(gè)內(nèi)核文件中去的一個(gè)函數(shù),該函數(shù)的名稱應(yīng)該是新的系統(tǒng)調(diào)用名稱前面加上sys_標(biāo)志。假設(shè)新加的系統(tǒng)調(diào)用為mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代碼,如下所示:\x0d\x0aasmlinkage int sys_mycall(int number) \x0d\x0a{ \x0d\x0areturn number; \x0d\x0a}\x0d\x0a作為一個(gè)最簡(jiǎn)單的例子,我們新加的系統(tǒng)調(diào)用僅僅返回一個(gè)整型值。\x0d\x0a\x0d\x0a(2) 連接新的系統(tǒng)調(diào)用\x0d\x0a\x0d\x0a添加新的系統(tǒng)調(diào)用后,下一個(gè)任務(wù)是使Linux內(nèi)核的其余部分知道該程序的存在。為了從已有的內(nèi)核程序中增加到新的函數(shù)的連接,需要編輯兩個(gè)文件。\x0d\x0a\x0d\x0a在我們所用的Linux內(nèi)核版本(RedHat 6.0,內(nèi)核為2.2.5-15)中,第一個(gè)要修改的文件是:\x0d\x0a\x0d\x0a/usr/src/linux/include/asm-i386/unistd.h\x0d\x0a\x0d\x0a該文件中包含了系統(tǒng)調(diào)用清單,用來給每個(gè)系統(tǒng)調(diào)用分配一個(gè)唯一的號(hào)碼。文件中每一行的格式如下:\x0d\x0a\x0d\x0a#define __NR_name NNN\x0d\x0a\x0d\x0a其中,name用系統(tǒng)調(diào)用名稱代替,而NNN則是該系統(tǒng)調(diào)用對(duì)應(yīng)的號(hào)碼。應(yīng)該將新的系統(tǒng)調(diào)用名稱加到清單的最后,并給它分配號(hào)碼序列中下一個(gè)可用的系統(tǒng)調(diào)用號(hào)。我們的系統(tǒng)調(diào)用如下:\x0d\x0a\x0d\x0a#define __NR_mycall 191\x0d\x0a\x0d\x0a系統(tǒng)調(diào)用號(hào)為191,之所以系統(tǒng)調(diào)用號(hào)是191,是因?yàn)長(zhǎng)inux-2.2內(nèi)核自身的系統(tǒng)調(diào)用號(hào)碼已經(jīng)用到190。\x0d\x0a\x0d\x0a第二個(gè)要修改的文件是:\x0d\x0a\x0d\x0a/usr/src/linux/arch/i386/kernel/entry.S\x0d\x0a\x0d\x0a該文件中有類似如下的清單:\x0d\x0a.long SYMBOL_NAME()\x0d\x0a\x0d\x0a該清單用來對(duì)sys_call_table[]數(shù)組進(jìn)行初始化。該數(shù)組包含指向內(nèi)核中每個(gè)系統(tǒng)調(diào)用的指針。這樣就在數(shù)組中增加了新的內(nèi)核函數(shù)的指針。我們?cè)谇鍐巫詈筇砑右恍校篭x0d\x0a.long SYMBOL_NAME(sys_mycall)\x0d\x0a\x0d\x0a(3) 重建新的Linux內(nèi)核\x0d\x0a\x0d\x0a為使新的系統(tǒng)調(diào)用生效,需要重建Linux的內(nèi)核。這需要以超級(jí)用戶身份登錄。\x0d\x0a#pwd \x0d\x0a/usr/src/linux \x0d\x0a#\x0d\x0a\x0d\x0a超級(jí)用戶在當(dāng)前工作目錄(/usr/src/linux)下,才可以重建內(nèi)核。\x0d\x0a\x0d\x0a#make config \x0d\x0a#make dep \x0d\x0a#make clearn \x0d\x0a#make bzImage\x0d\x0a\x0d\x0a編譯完畢后,系統(tǒng)生成一可用于安裝的、壓縮的內(nèi)核映象文件:\x0d\x0a\x0d\x0a/usr/src/linux/arch/i386/boot/bzImage \x0d\x0a(4) 用新的內(nèi)核啟動(dòng)系統(tǒng) \x0d\x0a要使用新的系統(tǒng)調(diào)用,需要用重建的新內(nèi)核重新引導(dǎo)系統(tǒng)。為此,需要修改/etc/lilo.conf文件,在我們的系統(tǒng)中,該文件內(nèi)容如下:\x0d\x0a\x0d\x0aboot=/dev/hda \x0d\x0amap=/boot/map \x0d\x0ainstall=/boot/boot.b \x0d\x0aprompt \x0d\x0atimeout=50 \x0d\x0a\x0d\x0aimage=/boot/vmlinuz-2.2.5-15 \x0d\x0alabel=linux \x0d\x0aroot=/dev/hdb1 \x0d\x0a read-only \x0d\x0a\x0d\x0aother=/dev/hda1 \x0d\x0alabel=dos \x0d\x0atable=/dev/had\x0d\x0a\x0d\x0a首先編輯該文件,添加新的引導(dǎo)內(nèi)核:\x0d\x0aimage=/boot/bzImage-new \x0d\x0alabel=linux-new \x0d\x0aroot=/dev/hdb1 \x0d\x0aread-only\x0d\x0a\x0d\x0a添加完畢,該文件內(nèi)容如下所示:\x0d\x0aboot=/dev/hda \x0d\x0amap=/boot/map \x0d\x0ainstall=/boot/boot.b \x0d\x0aprompt \x0d\x0atimeout=50 \x0d\x0a\x0d\x0aimage=/boot/bzImage-new \x0d\x0alabel=linux-new \x0d\x0aroot=/dev/hdb1 \x0d\x0aread-only \x0d\x0a\x0d\x0aimage=/boot/vmlinuz-2.2.5-15 \x0d\x0alabel=linux \x0d\x0aroot=/dev/hdb1 \x0d\x0aread-only \x0d\x0a\x0d\x0aother=/dev/hda1 \x0d\x0alabel=dos \x0d\x0atable=/dev/hda\x0d\x0a\x0d\x0a這樣,新的內(nèi)核映象bzImage-new成為缺省的引導(dǎo)內(nèi)核。為了使用新的lilo.conf配置文件,還應(yīng)執(zhí)行下面的命令:\x0d\x0a#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new\x0d\x0a\x0d\x0a其次配置lilo:\x0d\x0a\x0d\x0a# /sbin/lilo\x0d\x0a\x0d\x0a現(xiàn)在,當(dāng)重新引導(dǎo)系統(tǒng)時(shí),在boot:提示符后面有三種選擇:linux-new 、linux、dos,新內(nèi)核成為缺省的引導(dǎo)內(nèi)核。\x0d\x0a至此,新的Linux內(nèi)核已經(jīng)建立,新添加的系統(tǒng)調(diào)用已成為操作系統(tǒng)的一部分,重新啟動(dòng)Linux,用戶就可以在應(yīng)用程序中使用該系統(tǒng)調(diào)用了。\x0d\x0a\x0d\x0a(5)使用新的系統(tǒng)調(diào)用\x0d\x0a\x0d\x0a在應(yīng)用程序中使用新添加的系統(tǒng)調(diào)用mycall。同樣為實(shí)驗(yàn)?zāi)康?,我們寫了一個(gè)簡(jiǎn)單的例子xtdy.c。\x0d\x0a\x0d\x0a/* xtdy.c */ \x0d\x0a#include \x0d\x0a_syscall1(int,mycall,int,ret) \x0d\x0amain() \x0d\x0a{ \x0d\x0aprintf("%d \n",mycall(100)); \x0d\x0a}\x0d\x0a編譯該程序:\x0d\x0a# cc -o xtdy xtdy.c\x0d\x0a執(zhí)行:\x0d\x0a# xtdy\x0d\x0a結(jié)果:\x0d\x0a# 100\x0d\x0a注意,由于使用了系統(tǒng)調(diào)用,編譯和執(zhí)行程序時(shí),用戶都應(yīng)該是超級(jí)用戶身份。