日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux系统调用FAQ

發(fā)布時間:2025/5/22 linux 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统调用FAQ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1. Linux系統(tǒng)調(diào)用的作用?

系統(tǒng)調(diào)用是操作系統(tǒng)為用戶態(tài)運行的進程與系統(tǒng)內(nèi)核、硬件設(shè)備(如CPU、磁盤、打印機等)進行交互提供的一組接口,在應(yīng)用程序和硬件之間設(shè)置一個額外層的優(yōu)點包括:

1.???????? 用戶編程更加簡單,不必學習硬件設(shè)備的低級編程特性;

2.???????? 提高了系統(tǒng)的安全性,內(nèi)核在試圖滿足某個請求前在接口級可以檢查請求正確性。

3.???????? 這組接口使得程序具有可移植性,只要內(nèi)核所提供的接口相同,使用這些接口的?? ?????程序即可正確的編譯和執(zhí)行。

2. POSIX API與系統(tǒng)調(diào)用的關(guān)系?

1.???????? API是函數(shù)定義(如libc庫),而系統(tǒng)調(diào)用是通過軟中斷想內(nèi)核態(tài)發(fā)出的請求;

2.???????? 一個API沒有必要對應(yīng)一個特定的系統(tǒng)調(diào)用。API可能直接提供用戶態(tài)服務(wù),如數(shù)學函數(shù);有些API函數(shù)可能調(diào)用幾個系統(tǒng)調(diào)用;幾個API函數(shù)可能調(diào)用同一系統(tǒng)調(diào)用(如malloccallocfree均使用brk系統(tǒng)調(diào)用實現(xiàn))。

3.???????? POSIX標準針對API而不是針對系統(tǒng)調(diào)用,判斷一個系統(tǒng)是否與POSIX兼容,要看它是否提供了一組合適的API

4.???????? 從應(yīng)用程序設(shè)計者的角度看,兩者的差別僅在于名字、參數(shù)、返回值的不同;從內(nèi)核設(shè)計者的角度看,系統(tǒng)調(diào)用屬于內(nèi)核,而API不屬于內(nèi)核。

?

3. 內(nèi)核如何處理系統(tǒng)調(diào)用?

1.???????? 每一個系統(tǒng)調(diào)用擁有一個系統(tǒng)調(diào)用號的標識,當用戶態(tài)請求系統(tǒng)調(diào)用時,需傳遞系統(tǒng)調(diào)用號及其它信息作為參數(shù),eax寄存器用于傳遞系統(tǒng)調(diào)用號(同時也用于傳遞返回值,系統(tǒng)調(diào)用號與返回值類型相同)。內(nèi)核從寄存器讀到系統(tǒng)調(diào)用的參數(shù),并執(zhí)行對應(yīng)的系統(tǒng)調(diào)用服務(wù)例程。

2.???????? 下圖顯示了應(yīng)用程序、相應(yīng)的封裝例程、系統(tǒng)調(diào)用處理程序、系統(tǒng)調(diào)用服務(wù)例程之間的關(guān)系。xyz()是應(yīng)用程序的調(diào)用接口,xyzlibc中的調(diào)用實現(xiàn)通過調(diào)用SYSCALL匯編指令實現(xiàn),該指令使得CPU切換到內(nèi)核態(tài)(SYSEXIT反之);內(nèi)核態(tài)通過sys_call系統(tǒng)調(diào)用處理程序來最終調(diào)用xyz的服務(wù)例程sys_xyz()

???

3.???????? 為了將系統(tǒng)調(diào)用號與相應(yīng)的服務(wù)例程關(guān)聯(lián)起來,內(nèi)核利用一個系統(tǒng)調(diào)用分派表,該表存放在sys_call_table數(shù)組中,有NR_syscalls個表項,第n個表項包含系統(tǒng)調(diào)用號為n的服務(wù)例程的地址。

?

?

4. 如何進入和退出系統(tǒng)調(diào)用?

本地應(yīng)用可以通過兩種方式調(diào)用系統(tǒng)調(diào)用:

1.???????? 執(zhí)行int $0x80匯編語言指令(老版本linux中從用戶態(tài)切換到內(nèi)核態(tài)的唯一方式)

2.???????? 執(zhí)行sysenter匯編語言指令,Intel Pentium II微處理器引入該指令,linux2.6內(nèi)核支持這條指令。

同樣,內(nèi)核可通過兩種方式從系統(tǒng)調(diào)用退出,使CPU切換回到用戶態(tài):

1.???????? 執(zhí)行iret匯編語言指令

2.???????? 執(zhí)行sysexit匯編語言指令

對以上兩種方式涉及到匯編代碼,我也解釋不太清楚,更詳細的了解,請參考《深入理解linux內(nèi)核》。

?

5. 系統(tǒng)調(diào)用參數(shù)如何傳遞?

1.???????? 普通C函數(shù)的參數(shù)傳遞是通過把參數(shù)值寫入到活動的程序棧(用戶態(tài)或內(nèi)核態(tài)堆棧)實現(xiàn)的,而系統(tǒng)調(diào)用同時跨越內(nèi)核態(tài)和用戶態(tài),同時操作兩個棧是很復(fù)雜的,而采用下面的方式(寄存器傳遞參數(shù))將使得系統(tǒng)調(diào)用處理程序與其它異常處理程序的結(jié)構(gòu)類似。

2.???????? 在發(fā)出系統(tǒng)調(diào)用之前,系統(tǒng)調(diào)用的參數(shù)被寫入到CPU的寄存器,然后在調(diào)用系統(tǒng)服務(wù)例程之前,內(nèi)核再把存放在CPU中的參數(shù)拷貝到內(nèi)核態(tài)堆棧(系統(tǒng)調(diào)用服務(wù)例程是普通的C函數(shù))。

3.???????? 使用寄存器傳遞參數(shù)必須滿足:每個參數(shù)的長度不能超過寄存器的長度(容易解決,長度不夠,可以通過傳遞參數(shù)的地址解決),并且參數(shù)的個數(shù)不能超過6個(系統(tǒng)調(diào)用號除外),因為80x86處理器的寄存器的數(shù)量是有限的(用于存放調(diào)用號和調(diào)用參數(shù)的寄存器是eaxebxecxedxesiediebp)。

?

6. 如何保證系統(tǒng)調(diào)用的安全性?

內(nèi)核在滿足用戶的系統(tǒng)調(diào)用請求前,必須仔細的檢查所有的系統(tǒng)調(diào)用參數(shù),如write系統(tǒng)調(diào)用的參數(shù)fd,內(nèi)核需檢查fd是否對應(yīng)于一個打開的文件,該文件是否允許寫操作等,這些檢查操作依賴于系統(tǒng)調(diào)用本身,也依賴于特定的參數(shù)。但有一種檢查對所有的系統(tǒng)調(diào)用是通用的,只要參數(shù)指定的是地址,內(nèi)核必須檢查它是否屬于用戶地址空間,可通過檢查地址所在的線性區(qū),或直接與PAGE_OFFSET對比等兩種方式實現(xiàn)(linux2.2開始實現(xiàn)第二種方式)。

?

7. 內(nèi)核如何訪問用戶態(tài)數(shù)據(jù)?

系統(tǒng)調(diào)用服務(wù)例程需要非常頻繁的讀寫進程地址空間的數(shù)據(jù),Linux提供一組宏來實現(xiàn)這個目的(__開頭的宏不包含對線性地址的有效性檢查)。

get_user? __get_user?? 從用戶空間讀一個整數(shù)(124個字節(jié))

put_user? __put_user?? 向用戶空間寫一個整數(shù)(124個字節(jié))

copy_from_user __copy_from_user? 從用戶空間復(fù)制任意大小的塊

copy_to_user? __copy_to_user? 把任意大小的塊復(fù)制到用戶空間

strncpy_from_user ?__strncpy_from_user? 從用戶空間復(fù)制一個以null結(jié)束的字符串

strlen_user? strnlen_user? 返回用戶空間以null結(jié)束的字符串的長度

clear_user __clear_user 0填充用戶空間的一個內(nèi)存區(qū)域

?

8. 在內(nèi)核態(tài)能否調(diào)用系統(tǒng)調(diào)用?

盡管系統(tǒng)調(diào)用主要由內(nèi)核態(tài)進程使用,但也可以被內(nèi)核線程調(diào)用,內(nèi)核線程不能使用庫函數(shù)。linux定義了7個從_syscall0_syscall6的一組宏來封裝相應(yīng)例程,宏名中的數(shù)字0-6對應(yīng)著系統(tǒng)調(diào)用所用的參數(shù)個數(shù)(系統(tǒng)調(diào)用號除外)。每個宏需要2 + 2 * n個參數(shù)(n為系統(tǒng)調(diào)用參數(shù)的個數(shù)),前兩個參數(shù)是系統(tǒng)調(diào)用號返回值類型和名字;每一對附加參數(shù)指明相應(yīng)的系統(tǒng)調(diào)用參數(shù)的類型和名字。

轉(zhuǎn)載于:https://www.cnblogs.com/yunnotes/archive/2013/04/19/3032426.html

總結(jié)

以上是生活随笔為你收集整理的Linux系统调用FAQ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精彩视频 | 久久久久久久久久影院 | 亚洲无码精品在线播放 | 精品久久久久久 | 国产美女三级无套内谢 | av中文资源网 | 色片在线播放 | 男女午夜免费视频 | 国产一区久久久 | 日韩大片免费观看视频播放 | 丰满孕妇性春猛交xx大陆 | 中文免费av | 日韩毛毛片| 国产欧美精品区一区二区三区 | 95国产精品 | 天堂中文字幕av | 一本在线免费视频 | 国产三级日本三级在线播放 | 6080一级片 | 亚洲男人天堂2023 | 亚洲一区免费电影 | 欧美激情视频一区二区三区在线播放 | 蜜臀av一区二区三区有限公司 | 自拍偷拍激情视频 | 老女人毛片 | 在线观看免费国产视频 | ,国产精品国产三级国产 | 97干干| 久久久精品999 | 亚洲少妇15p | 免费一区二区在线观看 | www.男人天堂.com | 在线视频观看你懂得 | 欧美老女人bb | 捅肌肌| 日韩欧美中文在线观看 | 日韩 中文字幕 | 久久精品99国产精品日本 | 日本三级久久久 | 日本三级中文字幕在线观看 | 成人免费91| 手机看片午夜 | 污黄视频在线观看 | 性欧美bbw | 狠狠干夜夜爽 | 岳睡了我中文字幕日本 | 午夜剧场成人 | 精品无码三级在线观看视频 | 在线a网 | 蜜臀人妻四季av一区二区不卡 | 国产九九热 | 特黄a级片 | 国语对白少妇spa私密按摩 | 狠狠干b | 久久综合久色欧美综合狠狠 | 精品一区二区三区免费观看 | 欧美在线视频精品 | 国产农村妇女精品一区 | 四虎免费看黄 | 一级免费在线 | 三及毛片 | 永久免费看黄网站 | 成 年 人 黄 色 大 片大 全 | 日韩欧 | 禁网站在线观看免费视频 | 男男车车的车车网站w98免费 | 在线观看免费高清在线观看 | 天天干夜夜撸 | 国产一区二区欧美日韩 | 日本久久不卡 | 欧美精品在欧美一区二区少妇 | 亚洲综合小说 | 臭脚猛1s民工调教奴粗口视频 | 黄色在线不卡 | 欧美一区二区三区黄片 | 高级家教课程在线观看 | 日韩欧美v | 中文字幕欧美另类精品亚洲 | 日韩美一级片 | 朋友人妻少妇精品系列 | 99999视频 | 天天综合天天做天天综合 | 日本一区二区三区免费看 | 黑人巨大猛交丰满少妇 | 91网入口 | 美女视频黄色 | 91精品久久久久久久久中文字幕 | 国产91精品看黄网站在线观看 | 色偷偷av| 播放黄色一级片 | 成人亚洲一区二区 | 桃色激情网 | 国产粉嫩在线 | 在线成人免费观看 | 欧美乱妇高清无乱码 | 免费看一级黄色片 | 中文字幕成人动漫 | 国产成人免费看 | 国产黄色大片在线观看 |