欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
系統調用跟我學(xué)(1)

什么是系統調用?

Linux內核中設置了一組用于實(shí)現各種系統功能的子程序,稱(chēng)為系統調用。用戶(hù)可以通過(guò)系統調用命令在自己的應用程序中調用它們。從某種角度來(lái)看,系統調用和普通的函數調用非常相似。區別僅僅在于,系統調用由操作系統核心提供,運行于核心態(tài);而普通的函數調用由函數庫或用戶(hù)自己提供,運行于用戶(hù)態(tài)。二者在使用方式上也有相似之處,在下面將會(huì )提到。

隨Linux核心還提供了一些C語(yǔ)言函數庫,這些庫對系統調用進(jìn)行了一些包裝和擴展,因為這些庫函數與系統調用的關(guān)系非常緊密,所以習慣上把這些函數也稱(chēng)為系統調用。





回頁(yè)首


Linux中共有多少個(gè)系統調用?

這個(gè)問(wèn)題可不太好回答,就算讓Linus Torvaldz本人也不見(jiàn)得一下子就能說(shuō)清楚。

在2.4.4版內核中,狹義上的系統調用共有221個(gè),你可以在<內核源碼目錄>/include/asm-i386/unistd.h中找到它們的原本,也可以通過(guò)命令"man 2 syscalls"察看它們的目錄(man pages的版本一般比較老,可能有很多最新的調用都沒(méi)有包含在內)。廣義上的系統調用,也就是以庫函數的形式實(shí)現的那些,它們的個(gè)數從來(lái)沒(méi)有人統計過(guò),這是一件吃力不討好的活,新內核不斷地在推出,每一個(gè)新內核中函數數目的變化根本就沒(méi)有人在乎,至少連內核的修改者本人都不在乎,因為他們從來(lái)沒(méi)有發(fā)布過(guò)一個(gè)此類(lèi)的聲明。

隨本文一起有一份經(jīng)過(guò)整理的列表,它不可能非常全面,但常見(jiàn)的系統調用基本都已經(jīng)包含在內,那里面只有不多的一部分是你平時(shí)用得到的,本專(zhuān)欄將會(huì )有選擇的對它們進(jìn)行介紹。





回頁(yè)首


為什么要用系統調用?

實(shí)際上,很多已經(jīng)被我們習以為常的C語(yǔ)言標準函數,在Linux平臺上的實(shí)現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各種系統調用是初步的要求。進(jìn)一步,若想成為一名Linux下編程高手,也就是我們常說(shuō)的Hacker,其標志之一也是能對各種系統調用有透徹的了解。

即使除去上面的原因,在平常的編程中你也會(huì )發(fā)現,在很多情況下,系統調用是實(shí)現你的想法的簡(jiǎn)潔有效的途徑,所以有可能的話(huà)應該盡量多掌握一些系統調用,這會(huì )對你的程序設計過(guò)程帶來(lái)意想不到的幫助。





回頁(yè)首


系統調用是怎么工作的?

一般的,進(jìn)程是不能訪(fǎng)問(wèn)內核的。它不能訪(fǎng)問(wèn)內核所占內存空間也不能調用內核函數。CPU硬件決定了這些(這就是為什么它被稱(chēng)作"保護模式")。系統調用是這些規則的一個(gè)例外。其原理是進(jìn)程先用適當的值填充寄存器,然后調用一個(gè)特殊的指令,這個(gè)指令會(huì )跳到一個(gè)事先定義的內核中的一個(gè)位置(當然,這個(gè)位置是用戶(hù)進(jìn)程可讀但是不可寫(xiě)的)。在Intel CPU中,這個(gè)由中斷0x80實(shí)現。硬件知道一旦你跳到這個(gè)位置,你就不是在限制模式下運行的用戶(hù),而是作為操作系統的內核--所以你就可以為所欲為。

進(jìn)程可以跳轉到的內核位置叫做sysem_call。這個(gè)過(guò)程檢查系統調用號,這個(gè)號碼告訴內核進(jìn)程請求哪種服務(wù)。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接著(zhù),就調用函數,等返回后,做一些系統檢查,最后返回到進(jìn)程(或到其他進(jìn)程,如果這個(gè)進(jìn)程時(shí)間用盡)。如果你希望讀這段代碼,它在<內核源碼目錄>/kernel/entry.S,Entry(system_call)的下一行。





回頁(yè)首


如何使用系統調用?

先來(lái)看一個(gè)例子:

#include<linux/unistd.h> /*定義宏_syscall1*/            #include<time.h>     /*定義類(lèi)型time_t*/            _syscall1(time_t,time,time_t *,tloc)    /*宏,展開(kāi)后得到time()函數的原型*/            main()            {            time_t the_time;            the_time=time((time_t *)0); /*調用time系統調用*/            printf("The time is %ld\n",the_time);            }            系統調用time返回從格林尼治時(shí)間1970年1月1日0:00開(kāi)始到現在的秒數。            這是最標準的系統調用的形式,宏_syscall1()展開(kāi)來(lái)得到一個(gè)函數原型,稍后我會(huì )作詳細解釋。但事實(shí)上,如果把程序改成下面的樣子,程序也可以運行得同樣的結果。            #include<time.h>            main()            {            time_t the_time;            the_time=time((time_t *)0); /*調用time系統調用*/            printf("The time is %ld\n",the_time);            }

這是因為在time.h中實(shí)際上已經(jīng)用庫函數的形式實(shí)現了time這個(gè)系統調用,替我們省掉了調用_syscall1宏展開(kāi)得到函數原型這一步。

大多數系統調用都在各種C語(yǔ)言函數庫中有所實(shí)現,所以在一般情況下,我們都可以像調用普通的庫函數那樣調用系統調用,只在極個(gè)別的情況下,我們才有機會(huì )用到_syscall*()這幾個(gè)宏。





回頁(yè)首


_syscall*()是什么?

在unistd.h里定義了7個(gè)宏,分別是

_syscall0(type,name)            _syscall1(type,name,type1,arg1)            _syscall2(type,name,type1,arg1,type2,arg2)            _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3)            _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4)            _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5)            _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4,type5,arg5,type6,arg6)            

它們看起來(lái)似乎不太像宏,但其實(shí)質(zhì)和
#define MAXSIZE 100
里面的MAXSIZE沒(méi)有任何區別。

它們的作用是形成相應的系統調用函數原型,供我們在程序中調用。我們很容易就能發(fā)現規律,_syscall后面的數字和typeN,argN的數目一樣多。事實(shí)上,_syscall后面跟的數字指明了展開(kāi)后形成函數的參數的個(gè)數,讓我們看一個(gè)實(shí)例,就是剛剛用過(guò)的time系統調用:

_syscall1(time_t,time,time_t *,tloc)

展開(kāi)后的情形是這樣:

time_t   time(time_t *   tloc)            {            long __res;            __asm__ volatile("int $0x80" : "=a" (__res) : "0" (13),"b" ((long)(tloc)));            do {            if ((unsigned long)(__res) >= (unsigned long)(-125)) {            errno = -(__res);            __res  = -1;            }            return (time_t) (__res);            } while (0) ;            }

可以看出,_syscall1(time_t,time,time_t *,tloc)展開(kāi)成一個(gè)名為time的函數,原參數time_t就是函數的返回類(lèi)型,原參數time_t *和tloc分別構成新函數的參數。事實(shí)上,程序中用到的time函數的原型就是它。





回頁(yè)首


errno是什么?

為防止和正常的返回值混淆,系統調用并不直接返回錯誤碼,而是將錯誤碼放入一個(gè)名為errno的全局變量中。如果一個(gè)系統調用失敗,你可以讀出errno的值來(lái)確定問(wèn)題所在。

errno不同數值所代表的錯誤消息定義在errno.h中,你也可以通過(guò)命令"man 3 errno"來(lái)察看它們。

需要注意的是,errno的值只在函數發(fā)生錯誤時(shí)設置,如果函數不發(fā)生錯誤,errno的值就無(wú)定義,并不會(huì )被置為0。另外,在處理errno前最好先把它的值存入另一個(gè)變量,因為在錯誤處理過(guò)程中,即使像printf()這樣的函數出錯時(shí)也會(huì )改變errno的值。





回頁(yè)首


系統調用兼容性好嗎?

很遺憾,答案是--不好。但這決不意味著(zhù)你的程序會(huì )三天兩頭的導致系統崩潰,因為系統調用是Linux的內核提供的,所以它們工作起來(lái)非常穩定,對于此點(diǎn)無(wú)需絲毫懷疑,在絕大多數的情況下,系統調用要比你自己編寫(xiě)的代碼可靠而高效的多。

但是,在Linux的各版本內核之間,系統調用的兼容性表現得并不像想象那么好,這是由Linux本身的性質(zhì)決定的。Linux是一群程序設計高手利用業(yè)余時(shí)間開(kāi)發(fā)出來(lái)的,他們中間的大部分人沒(méi)有把Linux當成一個(gè)嚴肅的商業(yè)軟件,(現在的情況有些不同了,隨著(zhù)Linux商業(yè)公司和以L(fǎng)inux為生的人的增長(cháng),不少人的腦筋發(fā)生了變化。)結果就是,如果新的方案在效率和兼容性上發(fā)生了矛盾,他們往往舍棄兼容性而追求效率,就這樣,如果他們認為某個(gè)系統調用實(shí)現的比較糟糕,他們就會(huì )毫不猶豫的作出修改,有些時(shí)候甚至連接口也一起改掉了,更可怕的是,很多時(shí)候,他們對自己的修改連個(gè)招呼也不打,在任何文檔里都找不到關(guān)于修改的提示。這樣,每當新內核推出的時(shí)候,很可能都會(huì )悄悄的更新一些系統調用,用戶(hù)編制的應用程序也會(huì )跟著(zhù)出錯。

說(shuō)到這里,你是不是感覺(jué)前途一片昏暗呢?呵呵,不用太緊張,如前面所說(shuō),隨著(zhù)越來(lái)越多的人把Linux當成自己的飯碗,不兼容的情況也越來(lái)越罕見(jiàn)。從2.2版本以后的Linux內核已經(jīng)非常穩定了,不過(guò)盡管如此,你還是有必要在每個(gè)新內核推出之后,對自己的應用程序進(jìn)行兼容性測試,以防止意外的發(fā)生。





回頁(yè)首


該如何學(xué)習使用Linux系統調用呢?

你可以用"man 2 系統調用名稱(chēng)"的命令來(lái)查看各條系統調用的介紹,但這首先要求你要有不錯的英語(yǔ)基礎,其次還得有一定的程序設計和系統編程的功底,man pages不會(huì )涉及太多的應用細節,因為它只是一個(gè)手冊而非教程。如果man pages所提供的東西不能使你感到非常滿(mǎn)意,那就跟我來(lái)吧,本專(zhuān)欄將向你展示Linux系統調用編程的無(wú)窮魅力。

雖然本專(zhuān)欄并非異常高深的技術(shù)文章,但是還對讀者有兩點(diǎn)小小的要求:1)讀者必須有一定的C語(yǔ)言編程經(jīng)驗,本專(zhuān)欄不會(huì )在語(yǔ)言細節上過(guò)分糾纏;2)讀者必須有一定的Linux使用經(jīng)驗,本專(zhuān)欄也不打算在Linux應用上大動(dòng)干戈。舉一個(gè)小小的測試標準,如果你能完全看懂本文從開(kāi)頭到這里所講的東西,你就合格了。收拾好行囊,準備出發(fā)吧!

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
深入理解Linux的系統調用
linux內核級后門(mén)的原理及簡(jiǎn)單實(shí)戰應用
linux系統調用
Linux 下系統調用的三種方法
linux系統調用機制分析
使用 Linux 系統調用的內核命令
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久