青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 200, comments - 8, trackbacks - 0, articles - 0

在Linux中,系統調用是用戶空間訪問內核的唯一手段,它們是內核唯一的合法入口。實際上,其他的像設備文件和/proc之類的方式,最終也還是要通過系統調用進行的。

       一般情況下,應用程序通過應用編程接口(API)而不是直接通過系統調用來編程,而且這種編程接口實際上并不需要和內核提供的系統調用對應。一個API定義了一組應用程序使用的編程接口。它們可以實現成一個系統調用,也可以通過調用多個系統調用來實現,即使不使用任何系統調用也不存在問題。實際上,API可以在各種不同的操作系統上實現,給應用程序提供完全相同的接口,而它們本身在這些系統上的實現卻可能迥異。

       在Unix世界中,最流行的應用編程接口是基于POSIX標準的,Linux是與POSIX兼容的。

       從程序員的角度看,他們只需要給API打交道就可以了,而內核只跟系統調用打交道;庫函數及應用程序是怎么使用系統調用不是內核關心的。

       系統調用(在linux中常稱作syscalls)通常通過函數進行調用。它們通常都需要定義一個或幾個參數(輸入)而且可能產生一些副作用。這些副作用通過一個long類型的返回值來表示成功(0值)或者錯誤(負值)。在系統調用出現錯誤的時候會把錯誤碼寫入errno全局變量。通過調用perror()函數,可以把該變量翻譯成用戶可以理解的錯誤字符串。

       系統調用的實現有兩個特別之處:1)函數聲明中都有asmlinkage限定詞,用于通知編譯器僅從棧中提取該函數的參數。2)系統調用getXXX()在內核中被定義為sys_getXXX()。這是Linux中所有系統調用都應該遵守的命名規則。

       系統調用號:在linux中,每個系統調用都賦予一個系統調用號,通過這個獨一無二的號就可以關聯系統調用。當用戶空間的進程執行一個系統調用的時候,這個系統調用號就被用來指明到底要執行哪個系統調用;進程不會提及系統調用的名稱。系統調用號一旦分配就不能再有任何變更(否則編譯好的應用程序就會崩潰),如果一個系統調用被刪除,它所占用的系統調用號也不允許被回收利用。Linux有一個"未使用"系統調用sys_ni_syscall(),它除了返回-ENOSYS外不做任何其他工作,這個錯誤號就是專門針對無效的系統調用而設的。雖然很罕見,但如果有一個系統調用被刪除,這個函數就要負責“填補空位”。

       內核記錄了系統調用表中所有已注冊過的系統調用的列表,存儲在sys_call_table中。它與體系結構有關,一般在entry.s中定義。這個表中為每一個有效的系統調用指定了唯一的系統調用號。

       用戶空間的程序無法直接執行內核代碼。它們不能直接調用內核空間的函數,因為內核駐留在受保護的地址空間上,應用程序應該以某種方式通知系統,告訴內核自己需要執行一個系統調用,系統系統切換到內核態,這樣內核就可以代表應用程序來執行該系統調用了。這種通知內核的機制是通過軟中斷實現的。x86系統上的軟中斷由int$0x80指令產生。這條指令會觸發一個異常導致系統切換到內核態并執行第128號異常處理程序,而該程序正是系統調用處理程序,名字叫system_call().它與硬件體系結構緊密相關,通常在entry.s文件中通過匯編語言編寫。

       所有的系統調用陷入內核的方式都是一樣的,所以僅僅是陷入內核空間是不夠的。因此必須把系統調用號一并傳給內核。在x86上,這個傳遞動作是通過在觸發軟中斷前把調用號裝入eax寄存器實現的。這樣系統調用處理程序一旦運行,就可以從eax中得到數據。上述所說的system_call()通過將給定的系統調用號與NR_syscalls做比較來檢查其有效性。如果它大于或者等于NR_syscalls,該函數就返回-ENOSYS.否則,就執行相應的系統調用:call *sys_call_table(, %eax, 4);

       由于系統調用表中的表項是以32位(4字節)類型存放的,所以內核需要將給定的系統調用號乘以4,然后用所得到的結果在該表中查詢器位置。如圖圖一所示:

                                      結構 

     上面已經提到,除了系統調用號以外,還需要一些外部的參數輸入。最簡單的辦法就是像傳遞系統調用號一樣把這些參數也存放在寄存器里。在x86系統上ebx,ecx,edx,esi和edi按照順序存放前5個參數。需要六個或六個以上參數的情況不多見,此時,應該用一個單獨的寄存器存放指向所有這些參數在用戶空間地址的指針。給用戶空間的返回值也通過寄存器傳遞。在x86系統上,它存放在eax寄存器中。

       系統調用必須仔細檢查它們所有的參數是否合法有效。系統調用在內核空間執行。如果任由用戶將不合法的輸入傳遞給內核,那么系統的安全和穩定將面臨極大的考驗。最重要的一種檢查就是檢查用戶提供的指針是否有效,內核在接收一個用戶空間的指針之前,內核必須要保證:

1)指針指向的內存區域屬于用戶空間
2)指針指向的內存區域在進程的地址空間里
3)如果是讀,讀內存應該標記為可讀。如果是寫,該內存應該標記為可寫。

       內核提供了兩種方法來完成必須的檢查和內核空間與用戶空間之間數據的來回拷貝。這兩個方法必須有一個被調用。

copy_to_user():向用戶空間寫入數據,需要3個參數。第一個參數是進程空間中的目的內存地址。第二個是內核空間內的源地址
                     .第三個是需要拷貝的數據長度(字節數)。
copy_from_user():向用戶空間讀取數據,需要3個參數。第一個參數是進程空間中的目的內存地址。第二個是內核空間內的源地
                     址.第三個是需要拷貝的數據長度(字節數)。
注意:這兩個都有可能引起阻塞。當包含用戶數據的頁被換出到硬盤上而不是在物理內存上的時候,這種情況就會發生。此時,進程就會休眠,直到缺頁處理程序將該頁從硬盤重新換回到物理內存。

       內核在執行系統調用的時候處于進程上下文,current指針指向當前任務,即引發系統調用的那個進程。在進程上下文中,內核可以休眠(比如在系統調用阻塞或顯式調用schedule()的時候)并且可以被搶占。當系統調用返回的時候,控制權仍然在system_call()中,它最終會負責切換到用戶空間并讓用戶進程繼續執行下去。

       給linux添加一個系統調用時間很簡單的事情,怎么設計和實現一個系統調用是難題所在。實現系統調用的第一步是決定它的用途,這個用途是明確且唯一的,不要嘗試編寫多用途的系統調用。ioctl則是一個反面教材。新系統調用的參數,返回值和錯誤碼該是什么,這些都很關鍵。一旦一個系統調用編寫完成后,把它注冊成為一個正式的系統調用是件瑣碎的工作,一般下面幾步:

1)在系統調用表(一般位于entry.s)的最后加入一個表項。從0開始算起,系統表項在該表中的位置就是它的系統調用號。如第
   10個系統調用分配到系統調用號為9
2)任何體系結構,系統調用號都必須定義于include/asm/unistd.h中
3)系統調用必須被編譯進內核映像(不能編譯成模塊)。這只要把它放進kernel/下的一個相關文件就可以。

       通常,系統調用靠C庫支持,用戶程序通過包含標準頭文件并和C庫鏈接,就可以使用系統調用(或者使用庫函數,再由庫函數實際調用)。慶幸的是linux本身提供了一組宏用于直接對系統調用進行訪問。它會設置好寄存器并調用int $0x80指令。這些宏是_syscalln(),其中n的范圍是從0到6.代表需要傳遞給系統調用的參數個數。這是由于該宏必須了解到底有多少參數按照什么次序壓入寄存器。以open系統調用為例:

open()系統調用定義如下是:
long open(const char *filename, int flags, int mode)
直接調用此系統調用的宏的形式為:
#define NR_open 5
_syscall3(long, open, const char *, filename, int , flags, int, mode)

    這樣,應用程序就可以直接使用open().調用open()系統調用直接把上面的宏放置在應用程序中就可以了。對于每個宏來說,都有2+2*n個參數。每個參數的意義簡單明了,這里就不詳細說明了。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区不卡| 亚洲一区国产一区| 一本久久a久久精品亚洲| 精品成人乱色一区二区| 国产一区二区欧美日韩| 国产麻豆91精品| 亚洲人成在线免费观看| 一区二区三区免费网站| 亚洲无线视频| 欧美一级淫片播放口| 久久久久成人精品免费播放动漫| 欧美与欧洲交xxxx免费观看| 久久精品国产v日韩v亚洲| 久久精品成人欧美大片古装| 久色婷婷小香蕉久久| 欧美精品国产一区| 欧美视频在线观看免费| 国产精品美女久久久久久久| 国产日韩欧美亚洲一区| 亚洲国产日韩美| 一本综合久久| 久久精品综合网| 欧美大胆成人| 亚洲国产精品精华液2区45| 久久久www| 亚洲国产成人在线播放| 亚洲一区二区黄| 欧美成人精精品一区二区频| 欧美午夜一区二区三区免费大片 | 亚洲高清网站| 一区二区电影免费观看| 欧美亚洲日本国产| 欧美成人精品在线| 欧美尤物巨大精品爽| 欧美人交a欧美精品| 国产精品福利在线| 国产午夜精品理论片a级探花 | 久久久久久午夜| 久久五月婷婷丁香社区| 欧美精品1区2区| 狠狠色噜噜狠狠色综合久| 99精品欧美| 米奇777在线欧美播放| 一本久久综合| 免费一级欧美片在线观看| 欧美日韩中文在线观看| 91久久中文| 免费观看成人鲁鲁鲁鲁鲁视频| 在线亚洲观看| 欧美日韩在线精品| 亚洲美女黄网| 久久精品国产欧美激情| 在线亚洲+欧美+日本专区| 久久资源av| 韩国成人精品a∨在线观看| 亚洲美女在线观看| 欧美在线观看一区| 日韩一区二区高清| 免费观看亚洲视频大全| 国内精品国产成人| 久久国产黑丝| 免费亚洲一区| 欧美亚洲日本国产| 国产乱码精品| 亚洲欧洲av一区二区| 亚洲国产日韩一级| 欧美电影免费观看| 在线观看一区| 亚洲二区免费| 欧美人牲a欧美精品| 亚洲一区尤物| 亚洲一区在线观看免费观看电影高清| 欧美日韩国产区| 亚洲午夜精品网| 亚洲永久在线观看| 国产在线精品一区二区夜色| 麻豆免费精品视频| 欧美成人a视频| 一区二区三区日韩| 亚洲一区在线播放| 在线观看成人网| 国产在线精品一区二区夜色| 在线亚洲欧美视频| 欧美国产激情| 欧美夫妇交换俱乐部在线观看| 亚洲欧洲日产国码二区| 亚洲精品日日夜夜| 欧美亚韩一区| 久久久精品久久久久| 久久综合精品国产一区二区三区| 亚洲日本va午夜在线电影 | 久久久久九九视频| 亚洲精品在线电影| 国产精品亚发布| 久久一本综合频道| 欧美激情一区二区三区在线| 亚洲欧美日韩精品久久久| 欧美在线免费观看| 亚洲美女福利视频网站| 欧美一区二区三区四区在线观看| 亚洲国产精品女人久久久| 一区二区三区|亚洲午夜| 激情五月综合色婷婷一区二区| 欧美黄色aaaa| 欧美日韩三级一区二区| 久久亚洲国产成人| 国产精品九九久久久久久久| 久久综合九色综合久99| 欧美国产一区视频在线观看| 香蕉尹人综合在线观看| 欧美+日本+国产+在线a∨观看| 亚洲欧美激情视频在线观看一区二区三区 | 国产日韩在线一区| 亚洲国内高清视频| 欧美性猛交一区二区三区精品| 久久久人人人| 欧美日本一区二区三区 | 久久久久欧美| 欧美视频精品在线观看| 乱人伦精品视频在线观看| 欧美成人在线网站| 久久久久久久999| 欧美日韩在线免费观看| 久久高清福利视频| 欧美激情视频给我| 可以免费看不卡的av网站| 国产精品久久久99| 亚洲国产另类久久精品| 精品av久久707| 欧美一区二区三区在线观看视频| 一二三区精品| 欧美极品一区二区三区| 欧美刺激午夜性久久久久久久| 国产综合香蕉五月婷在线| 亚洲欧美日韩国产中文在线| 亚洲一区视频在线观看视频| 欧美日韩国语| 日韩午夜黄色| 亚洲精品永久免费精品| 欧美高清在线一区| 亚洲国产乱码最新视频| 午夜精品久久久| 狠狠综合久久av一区二区老牛| 亚洲人成艺术| 亚洲精品日韩在线观看| 蜜桃久久av| 亚洲激情欧美激情| a4yy欧美一区二区三区| 欧美精品偷拍| 一本综合久久| 亚洲欧美春色| 国产欧美日韩激情| 欧美一区二视频在线免费观看| 欧美一区成人| 国产视频综合在线| 久久久久久久久一区二区| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲国产成人精品久久| 欧美一级欧美一级在线播放| 国产精品电影观看| 午夜国产精品视频免费体验区| 久久久久国产一区二区三区| 在线观看视频免费一区二区三区| 免费一区二区三区| 在线综合亚洲欧美在线视频| 久久精品国产91精品亚洲| 国内欧美视频一区二区| 牛人盗摄一区二区三区视频| 99国内精品久久| 久久国产精品久久w女人spa| 亚洲国产欧洲综合997久久| 欧美日韩中文字幕在线视频| 性色av一区二区三区红粉影视| 麻豆精品91| 一区二区三区日韩在线观看| 国产一区二区久久| 欧美成人精品激情在线观看| 日韩写真视频在线观看| 久久久久久亚洲精品杨幂换脸| 亚洲卡通欧美制服中文| 国产精品自拍在线| 蜜臀a∨国产成人精品| 亚洲午夜精品久久久久久浪潮| 狂野欧美性猛交xxxx巴西| 亚洲一线二线三线久久久| 国产综合亚洲精品一区二| 欧美日韩免费一区| 久久精品中文| 亚洲欧美日韩一区二区在线| 亚洲黑丝一区二区| 久久人人爽人人爽爽久久| 一区二区三区四区蜜桃| 在线视频国产日韩| 国产欧美精品一区二区三区介绍| 久久一区二区三区超碰国产精品| 亚洲一区二区三区精品视频| 亚洲啪啪91| 亚洲福利视频一区二区| 久久久久久久波多野高潮日日| 午夜精品福利在线|