千鋒扣丁學(xué)堂Linux培訓(xùn)之詳解用戶態(tài)與內(nèi)核態(tài)通信方式
2019-06-03 15:50:06
3627瀏覽
今天千鋒扣丁學(xué)堂Linux培訓(xùn)老師給大家分享一篇關(guān)于Linux用戶態(tài)與內(nèi)核態(tài)通信幾種方式的詳細(xì)介紹,首先Linux用戶態(tài)和內(nèi)核態(tài)由于CPU權(quán)限的限制,通信并不像想象中的使用進(jìn)程間通信方式那么簡(jiǎn)單,今天這篇文章就來看看Linux用戶態(tài)和內(nèi)核態(tài)究竟有哪些通信方式。
我們平常在寫代碼時(shí),一般是在用戶空間,通過系統(tǒng)調(diào)用函數(shù)來訪問內(nèi)核空間,這是最常用的一種用戶態(tài)和內(nèi)核態(tài)通信的方式。(關(guān)于Linux用戶態(tài)和內(nèi)核態(tài)可以參考xx)
除此之外,還有以下四種方式:
procfs(/proc)
sysctl(/proc/sys)
sysfs(/sys)
netlink套接口
procfs(/proc)
procfs是進(jìn)程文件系統(tǒng)的縮寫,它本質(zhì)上是一個(gè)偽文件系統(tǒng),為什么說是偽文件系統(tǒng)呢?因?yàn)樗徽加猛獠看鎯?chǔ)空間,只是占用少量的內(nèi)存,通常是掛載在/proc目錄下。
我們?cè)谠撃夸浵驴吹降囊粋€(gè)文件,實(shí)際上是一個(gè)內(nèi)核變量。內(nèi)核就是通過這個(gè)目錄,以文件的形式展現(xiàn)自己的內(nèi)部信息,相當(dāng)于/proc目錄為用戶態(tài)和內(nèi)核態(tài)之間的交互搭建了一個(gè)橋梁,用戶態(tài)讀寫/proc下的文件,就是讀寫內(nèi)核相關(guān)的配置參數(shù)。
比如常見的/proc/cpuinfo、/proc/meminfo和/proc/net就分別提供了CPU、內(nèi)存、網(wǎng)絡(luò)的相關(guān)參數(shù)。除此之外,還有很多的參數(shù),如下所示:
root@ubuntu:~# ls /proc/
1 1143 1345 1447 2 2292 29 331 393 44 63 70 76 acpi diskstats irq locks sched_debug sysvipc zoneinfo
10 1145 1357 148 20 23 290 332 396 442 64 7019 77 asound dma kallsyms mdstat schedstat thread-self
1042 1149 1361 149 2084 2425 291 34 398 45 65 7029 8 buddyinfo driver kcore meminfo scsi timer_list
1044 1150 1363 15 2087 25 3 3455 413 46 66 7079 83 bus execdomains keys misc self timer_stats
1046 1151 1371 16 2090 256 30 35 418 47 6600 7080 884 cgroups fb key-users modules slabinfo tty
1048 1153 1372 17 21 26 302 36 419 5 67 71 9 cmdline filesystems kmsg mounts softirqs uptime
11 1190 1390 18 22 27 31 37 420 518 6749 72 96 consoles fs kpagecgroup mtrr stat version
1126 12 143 182 2214 28 32 373 421 524 68 73 97 cpuinfo interrupts kpagecount net swaps version_signature
1137 1252 1434 184 2215 280 327 38 422 525 69 74 98 crypto iomem kpageflags pagetypeinfo sys vmallocinfo
1141 13 144 190 2262 281 33 39 425 5940 7 75 985 devices ioports loadavg partitions sysrq-trigger vmstat
可以看到,這里面有很多的數(shù)字表示的文件,這些其實(shí)是當(dāng)前系統(tǒng)運(yùn)行的進(jìn)程文件,數(shù)字表示進(jìn)程號(hào)(PID),每個(gè)文件包含該進(jìn)程所有的配置信息,包括進(jìn)程狀態(tài)、文件描述符、內(nèi)存映射等等,我們可以看下:
root@ubuntu:~# ls /proc/1/
attr/ cmdline environ io mem ns/ pagemap schedstat stat timers
autogroup comm exe limits mountinfo numa_maps personality sessionid statm uid_map
auxv coredump_filter fd/ loginuid mounts oom_adj projid_map setgroups status wchan
cgroup cpuset fdinfo/ map_files/ mountstats oom_score root/ smaps syscall
clear_refs cwd/ gid_map maps net/ oom_score_adj sched stack task/
綜上,內(nèi)核通過一個(gè)個(gè)的文件來暴露自己的系統(tǒng)配置信息,這些文件,有些是只讀的,有些是可寫的,有些是動(dòng)態(tài)變化的,比如進(jìn)程文件,當(dāng)應(yīng)用程序讀取某個(gè)/proc/文件時(shí),內(nèi)核才會(huì)去注冊(cè)這個(gè)文件,然后再調(diào)用一組內(nèi)核函數(shù)來處理,將相應(yīng)的內(nèi)核參數(shù)拷貝到用戶態(tài)空間,這樣用戶讀這個(gè)文件就可以獲取到內(nèi)核的信息。一個(gè)大概的圖示如下所示:
sysctl
我們熟悉的sysctl是一個(gè)Linux命令,mansysctl可以看到它的功能和用法。它主要是被用來修改內(nèi)核的運(yùn)行時(shí)參數(shù),換句話說,它可以在內(nèi)核運(yùn)行過程中,動(dòng)態(tài)修改內(nèi)核參數(shù)。
它本質(zhì)上還是用到了文件的讀寫操作,來完成用戶態(tài)和內(nèi)核態(tài)的通信。它使用的是/proc的一個(gè)子目錄/proc/sys。和procfs的區(qū)別在于:
procfs主要是輸出只讀數(shù)據(jù),而sysctl輸出的大部分信息是可寫的。
例如,我們比較常見的是通過cat/proc/sys/net/ipv4/ip_forward來獲取內(nèi)核網(wǎng)絡(luò)層是否允許轉(zhuǎn)發(fā)IP數(shù)據(jù)包,通過echo1>/proc/sys/net/ipv4/ip_forward或者sysctl-wnet.ipv4.ip_forward=1來設(shè)置內(nèi)核網(wǎng)絡(luò)層允許轉(zhuǎn)發(fā)IP數(shù)據(jù)包。
同樣的操作,Linux也提供了文件/etc/sysctl.conf來讓你進(jìn)行批量修改。
sysfs
sysfs是Linux2.6才引入的一種虛擬文件系統(tǒng),它的做法也是通過文件/sys來完成用戶態(tài)和內(nèi)核的通信。和procfs不同的是,sysfs是將一些原本在procfs中的,關(guān)于設(shè)備和驅(qū)動(dòng)的部分,獨(dú)立出來,以“設(shè)備樹”的形式呈現(xiàn)給用戶。
sysfs不僅可以從內(nèi)核空間讀取設(shè)備和驅(qū)動(dòng)程序的信息,也可以對(duì)設(shè)備和驅(qū)動(dòng)進(jìn)行配置。
我們看下/sys下有什么:
# ls /sys
block bus class dev devices firmware fs hypervisor kernel module power
可以看到這些文件基本上都跟計(jì)算機(jī)的設(shè)備和驅(qū)動(dòng)等息息相關(guān)的。更多關(guān)于這些文件的解釋大家可以自行了解,這里就不過多展開了。
netlink
netlink是Linux用戶態(tài)與內(nèi)核態(tài)通信最常用的一種方式。Linuxkernel2.6.14版本才開始支持。它本質(zhì)上是一種socket,常規(guī)socket使用的標(biāo)準(zhǔn)API,在它身上同樣適用。比如創(chuàng)建一個(gè)netlinksocket,可以調(diào)用如下的socket函數(shù):
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(AF_NETLINK, socket_type, netlink_family);
netlink這種靈活的方式,使得它可以用于內(nèi)核與多種用戶進(jìn)程之間的消息傳遞系統(tǒng),比如路由子系統(tǒng),防火墻(Netfilter),ipsec安全策略等等。
引申:
net-tools工具通過procfs(/proc)和ioctl系統(tǒng)調(diào)用去訪問和改變內(nèi)核網(wǎng)絡(luò)參數(shù)配置,而iproute2則通過netlink套接字接口與內(nèi)核通信,前者已經(jīng)被淘汰了,后者逐步成為標(biāo)準(zhǔn)。
Linux用戶態(tài)和內(nèi)核態(tài)通信主要的四種方式,其中netlink和procfs是最常見的方式。
以上就是關(guān)于千鋒扣丁學(xué)堂Linux培訓(xùn)之詳解用戶態(tài)與內(nèi)核態(tài)通信方式的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,
想要了解更多關(guān)于Linux開發(fā)方面內(nèi)容的小伙伴,請(qǐng)關(guān)注扣丁學(xué)堂Linux培訓(xùn)官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的Linux講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的Linux視頻教程定能讓你快速掌握Linux從入門到精通開發(fā)實(shí)戰(zhàn)技能??鄱W(xué)堂Linux技術(shù)交流群:422345477。
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入Python全棧開發(fā)免費(fèi)公開課】
查看更多關(guān)于“Linux培訓(xùn)資訊”的相關(guān)文章>>
標(biāo)簽:
Linux培訓(xùn)
Linux視頻教程
紅帽Linux視頻
Linux學(xué)習(xí)視頻
Linux入門視頻