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

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

在Linux中,系統(tǒng)調(diào)用是用戶空間訪問內(nèi)核的唯一手段,它們是內(nèi)核唯一的合法入口。實(shí)際上,其他的像設(shè)備文件和/proc之類的方式,最終也還是要通過系統(tǒng)調(diào)用進(jìn)行的。

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

       在Unix世界中,最流行的應(yīng)用編程接口是基于POSIX標(biāo)準(zhǔn)的,Linux是與POSIX兼容的。

       從程序員的角度看,他們只需要給API打交道就可以了,而內(nèi)核只跟系統(tǒng)調(diào)用打交道;庫函數(shù)及應(yīng)用程序是怎么使用系統(tǒng)調(diào)用不是內(nèi)核關(guān)心的。

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

       系統(tǒng)調(diào)用的實(shí)現(xiàn)有兩個特別之處:1)函數(shù)聲明中都有asmlinkage限定詞,用于通知編譯器僅從棧中提取該函數(shù)的參數(shù)。2)系統(tǒng)調(diào)用getXXX()在內(nèi)核中被定義為sys_getXXX()。這是Linux中所有系統(tǒng)調(diào)用都應(yīng)該遵守的命名規(guī)則。

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

       內(nèi)核記錄了系統(tǒng)調(diào)用表中所有已注冊過的系統(tǒng)調(diào)用的列表,存儲在sys_call_table中。它與體系結(jié)構(gòu)有關(guān),一般在entry.s中定義。這個表中為每一個有效的系統(tǒng)調(diào)用指定了唯一的系統(tǒng)調(diào)用號。

       用戶空間的程序無法直接執(zhí)行內(nèi)核代碼。它們不能直接調(diào)用內(nèi)核空間的函數(shù),因?yàn)閮?nèi)核駐留在受保護(hù)的地址空間上,應(yīng)用程序應(yīng)該以某種方式通知系統(tǒng),告訴內(nèi)核自己需要執(zhí)行一個系統(tǒng)調(diào)用,系統(tǒng)系統(tǒng)切換到內(nèi)核態(tài),這樣內(nèi)核就可以代表應(yīng)用程序來執(zhí)行該系統(tǒng)調(diào)用了。這種通知內(nèi)核的機(jī)制是通過軟中斷實(shí)現(xiàn)的。x86系統(tǒng)上的軟中斷由int$0x80指令產(chǎn)生。這條指令會觸發(fā)一個異常導(dǎo)致系統(tǒng)切換到內(nèi)核態(tài)并執(zhí)行第128號異常處理程序,而該程序正是系統(tǒng)調(diào)用處理程序,名字叫system_call().它與硬件體系結(jié)構(gòu)緊密相關(guān),通常在entry.s文件中通過匯編語言編寫。

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

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

                                      結(jié)構(gòu) 

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

       系統(tǒng)調(diào)用必須仔細(xì)檢查它們所有的參數(shù)是否合法有效。系統(tǒng)調(diào)用在內(nèi)核空間執(zhí)行。如果任由用戶將不合法的輸入傳遞給內(nèi)核,那么系統(tǒng)的安全和穩(wěn)定將面臨極大的考驗(yàn)。最重要的一種檢查就是檢查用戶提供的指針是否有效,內(nèi)核在接收一個用戶空間的指針之前,內(nèi)核必須要保證:

1)指針指向的內(nèi)存區(qū)域?qū)儆谟脩艨臻g
2)指針指向的內(nèi)存區(qū)域在進(jìn)程的地址空間里
3)如果是讀,讀內(nèi)存應(yīng)該標(biāo)記為可讀。如果是寫,該內(nèi)存應(yīng)該標(biāo)記為可寫。

       內(nèi)核提供了兩種方法來完成必須的檢查和內(nèi)核空間與用戶空間之間數(shù)據(jù)的來回拷貝。這兩個方法必須有一個被調(diào)用。

copy_to_user():向用戶空間寫入數(shù)據(jù),需要3個參數(shù)。第一個參數(shù)是進(jìn)程空間中的目的內(nèi)存地址。第二個是內(nèi)核空間內(nèi)的源地址
                     .第三個是需要拷貝的數(shù)據(jù)長度(字節(jié)數(shù))。
copy_from_user():向用戶空間讀取數(shù)據(jù),需要3個參數(shù)。第一個參數(shù)是進(jìn)程空間中的目的內(nèi)存地址。第二個是內(nèi)核空間內(nèi)的源地
                     址.第三個是需要拷貝的數(shù)據(jù)長度(字節(jié)數(shù))。
注意:這兩個都有可能引起阻塞。當(dāng)包含用戶數(shù)據(jù)的頁被換出到硬盤上而不是在物理內(nèi)存上的時候,這種情況就會發(fā)生。此時,進(jìn)程就會休眠,直到缺頁處理程序?qū)⒃擁搹挠脖P重新?lián)Q回到物理內(nèi)存。

       內(nèi)核在執(zhí)行系統(tǒng)調(diào)用的時候處于進(jìn)程上下文,current指針指向當(dāng)前任務(wù),即引發(fā)系統(tǒng)調(diào)用的那個進(jìn)程。在進(jìn)程上下文中,內(nèi)核可以休眠(比如在系統(tǒng)調(diào)用阻塞或顯式調(diào)用schedule()的時候)并且可以被搶占。當(dāng)系統(tǒng)調(diào)用返回的時候,控制權(quán)仍然在system_call()中,它最終會負(fù)責(zé)切換到用戶空間并讓用戶進(jìn)程繼續(xù)執(zhí)行下去。

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

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

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

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            在线中文字幕日韩| 欧美一区国产二区| 日韩午夜电影| 亚洲国产影院| 亚洲国产精品一区制服丝袜| 欧美偷拍一区二区| 久久av一区二区三区漫画| 亚洲成人在线视频播放| 亚洲欧美日韩精品久久| 国产欧美精品| 欧美成人久久| 国内精品嫩模av私拍在线观看| 亚洲小视频在线观看| 日韩视频中午一区| 欧美喷潮久久久xxxxx| 亚洲国产视频a| 精品二区视频| 夜夜嗨网站十八久久| 久久国产精品99精品国产| 久久综合色影院| 亚洲国产精品视频一区| 欧美激情一区二区三区| av成人毛片| 免费精品视频| 欧美精品激情在线观看| 欧美大片专区| 国产亚洲成人一区| 亚洲麻豆av| 久久精品国产欧美激情| 欧美第十八页| 欧美资源在线| 欧美视频免费| 在线精品福利| 欧美一区二区三区视频免费| 欧美在线三级| 欧美aⅴ一区二区三区视频| 国产伦精品一区二区三区在线观看 | 久久人人爽人人爽爽久久| 亚洲黄色三级| 欧美日韩二区三区| 亚洲美女av黄| 在线视频亚洲| 国产欧美在线视频| 久热精品在线视频| 欧美国产日韩视频| 亚洲一区免费视频| 亚洲一区在线视频| 红桃av永久久久| 亚洲日本va午夜在线电影| 久久久亚洲国产美女国产盗摄| 欧美系列亚洲系列| 久久久91精品国产| 欧美日韩亚洲一区二区三区四区 | 亚洲一区视频在线| 久久免费视频在线| 最新亚洲电影| ●精品国产综合乱码久久久久| 国产日韩精品在线| 欧美中在线观看| 国产真实精品久久二三区| 欧美一站二站| 亚洲电影第1页| 亚洲美女免费精品视频在线观看| 欧美国产三级| 亚洲天堂网站在线观看视频| 篠田优中文在线播放第一区| 国产精品理论片| 韩日成人在线| 亚洲天堂成人| 亚洲男人的天堂在线aⅴ视频| 亚洲大胆av| 麻豆精品精品国产自在97香蕉| 久久久久久尹人网香蕉| 国产精品一区二区三区四区| 国产精品福利在线观看网址| 免费观看亚洲视频大全| 亚洲大胆视频| 欧美大片专区| 亚洲一区二区免费看| 久久久精彩视频| 亚洲国产黄色| 国产精品人人做人人爽 | 这里只有精品在线播放| 亚洲精品中文字幕在线| 久久久www成人免费毛片麻豆| 激情文学综合丁香| 免费不卡欧美自拍视频| 亚洲精选中文字幕| 久久精品国产96久久久香蕉| 欧美电影在线免费观看网站| 亚洲午夜电影在线观看| 国产日韩精品一区二区三区在线| 久久综合网hezyo| 亚洲男女自偷自拍| 欧美激情一区二区三级高清视频| 亚洲一区二区三区视频播放| 精品成人久久| 国产偷国产偷精品高清尤物| 欧美精品久久久久久久| 久久久国产亚洲精品| 亚洲一区视频| 亚洲手机在线| 中文一区二区| 99热在线精品观看| 国产欧美精品xxxx另类| 国产精品ⅴa在线观看h| 欧美日本中文字幕| 欧美精品日韩三级| 欧美理论视频| 欧美四级剧情无删版影片| 欧美人交a欧美精品| 欧美经典一区二区| 欧美日韩在线一区| 国产精品www994| 欧美极品一区二区三区| 免费影视亚洲| 欧美日韩精品一区二区天天拍小说 | 在线看日韩av| 亚洲国产一区二区三区a毛片| 亚洲第一偷拍| 亚洲一区二区三区在线看| 亚洲一区观看| 久久影院午夜片一区| 欧美国产日本| 亚洲深夜av| 免费成人美女女| 国产精品成人一区二区三区夜夜夜 | 黄色欧美成人| 亚洲一区二区在线视频| 久久久成人精品| 久久精品国产v日韩v亚洲| 欧美一区1区三区3区公司| 欧美顶级少妇做爰| 国产伦精品一区二区三区高清版| 黑人极品videos精品欧美裸| 久久精品二区| 国产精品蜜臀在线观看| 亚洲韩国青草视频| 久久九九免费视频| 99ri日韩精品视频| 欧美高清在线观看| 在线看国产日韩| 久久午夜激情| 国产一区二区三区在线观看免费视频| 最新精品在线| 亚洲高清不卡在线| 久久嫩草精品久久久精品一| 国产欧美一区二区三区视频| 亚洲图片在线观看| 日韩一二在线观看| 欧美日韩午夜视频在线观看| 亚洲欧洲在线免费| 亚洲激情网址| 欧美日韩在线播放一区| 亚洲视频在线看| 一本一道久久综合狠狠老精东影业| 欧美电影电视剧在线观看| 亚洲成色777777在线观看影院| 久久中文字幕导航| 免费av成人在线| 亚洲宅男天堂在线观看无病毒| 夜夜嗨av一区二区三区四季av| 欧美天天影院| 久久激情网站| 欧美激情精品久久久六区热门| 亚洲午夜视频| 久久在线观看视频| 亚洲图片欧美一区| 久久精品国产91精品亚洲| 亚洲欧洲日本在线| 亚洲影视中文字幕| 一本色道久久综合亚洲精品婷婷 | 亚洲精品你懂的| 欧美日韩免费看| 麻豆精品视频在线观看| 欧美日韩美女在线观看| 国产亚洲精品久久久久久| 久久综合一区二区三区| 国产精品成人国产乱一区| 你懂的视频欧美| 韩国成人精品a∨在线观看| 在线综合亚洲| 亚洲免费精品| 欧美韩日视频| 亚洲第一福利在线观看| 激情自拍一区| 久久亚洲精品欧美| 欧美国产亚洲视频| 亚洲高清不卡一区| 久久久久久97三级| 久久伊人精品天天| 韩国在线一区| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲欧美成人一区二区三区| 欧美日韩另类一区| 一区二区三区波多野结衣在线观看| 在线中文字幕不卡| 国产精品性做久久久久久| 校园春色综合网| 欧美韩日亚洲|