Linux內核服務(wù)例程與系統調用接口
高級語(yǔ)言應用程序一般不能直接訪(fǎng)問(wèn)內核函數。但是,總還是有一些高級用戶(hù)需要訪(fǎng)問(wèn)內核函數,如果讓用戶(hù)自己編寫(xiě)匯編語(yǔ)言程序來(lái)實(shí)現內核的陷入,顯然是不合適的,因為它既不安全也不符合設置操作系統的初衷___為用戶(hù)提供一個(gè)友好的程序設汁平臺。
由于用于封裝內核服務(wù)例程的系統調用例程有一個(gè)固定的框架,所以為了簡(jiǎn)化對內核服務(wù)例程的封裝工作,Linux定義了從_sysca110~_sysca115的6個(gè)宏,高級用戶(hù)可使用這些宏把所需的內核服務(wù)例程封裝為系統調用例程。
上述這6個(gè)宏的名稱(chēng)后的數字表示被封裝的內核服務(wù)例程可使用的參數個(gè)數(系統調用號除外)。在上述宏對內核服務(wù)例程進(jìn)行封裝時(shí),Linux規定,給宏傳遞參數的個(gè)數應是內核服務(wù)例程所需參數個(gè)數的2倍再加2,即2(n+1)個(gè),其中″是系統調用的參數個(gè)數。也就是說(shuō).對于內核服務(wù)例程的每一個(gè)參數,在宏中都必須用兩個(gè)參數來(lái)表達:一個(gè)用來(lái)指明參數的名稱(chēng),一個(gè)用來(lái)指明參數的類(lèi)型。還要附加兩個(gè)參數,分別用來(lái)表達系統調用返回值的名稱(chēng)和類(lèi)型。例如,用宏來(lái)封裝內核服務(wù)例程write()時(shí),就應按下面的格式來(lái)調用宏syscall3:_syscall3(int,write,int,fd,cONst char*,buf,unsingnde int,count)
其中:int和wrlte為返回值的類(lèi)型和名稱(chēng);int和fd為其參數fd的類(lèi)型和名稱(chēng);const char*和buf為其參數buf的類(lèi)型和名稱(chēng);unsigned lnt和count為其參數count的類(lèi)型和名稱(chēng)。
2.系統調用接口
一般情況下,作為一個(gè)完善的操作系統,是不會(huì )讓用戶(hù)應用程序直接使用名稱(chēng)類(lèi)似于.svsxyz()形式的系統凋用例程來(lái)調用內核服務(wù)例程的。所以,通常還要在系統調用例程的上面再用高級語(yǔ)言提供一個(gè)與普通函數一樣的接口,這樣用戶(hù)在通過(guò)這個(gè)接口凋用系統服務(wù)時(shí),感覺(jué)就像使用普通函數一樣方便。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論