最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Linux用戶態(tài)與內(nèi)核態(tài)通信的幾種方式

 更新時(shí)間:2019年06月03日 14:21:29   作者:CloudDeveloper  
這篇文章主要介紹了詳解Linux用戶態(tài)與內(nèi)核態(tài)通信的幾種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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 命令,man sysctl 可以看到它的功能和用法。它主要是被用來修改內(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ù)包,通過 echo 1 > /proc/sys/net/ipv4/ip_forward 或者 sysctl -w net.ipv4.ip_forward=1 來設(shè)置內(nèi)核網(wǎng)絡(luò)層允許轉(zhuǎn)發(fā) IP 數(shù)據(jù)包。

同樣的操作,Linux 也提供了文件 /etc/sysctl.conf 來讓你進(jìn)行批量修改。

sysfs

sysfs 是 Linux 2.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)通信最常用的一種方式。Linux kernel 2.6.14 版本才開始支持。它本質(zhì)上是一種 socket,常規(guī) socket 使用的標(biāo)準(zhǔn) API,在它身上同樣適用。比如創(chuàng)建一個(gè) netlink socket,可以調(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)。

總結(jié)

Linux 用戶態(tài)和內(nèi)核態(tài)通信主要的四種方式,其中 netlink 和 procfs 是最常見的方式。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Linux pidof命令使用總結(jié)

    Linux pidof命令使用總結(jié)

    今天GoFace給大家介紹linux pidof命令的用法,pidof命令大家或許很少見過,不過在適當(dāng)?shù)膱?chǎng)合用處還是不小的
    2014-03-03
  • 基于linux程序中段總結(jié)詳解

    基于linux程序中段總結(jié)詳解

    本篇文章是對(duì)linux程序中段的學(xué)習(xí)進(jìn)行了詳細(xì)的總結(jié)與分析,需要的朋友參考下
    2013-05-05
  • 手把手教你啟用Win10的Linux子系統(tǒng)(圖文超詳細(xì))

    手把手教你啟用Win10的Linux子系統(tǒng)(圖文超詳細(xì))

    這篇文章主要介紹了手把手教你啟用Win10的Linux子系統(tǒng)(圖文超詳細(xì)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • VMware下Centos7橋接方式網(wǎng)絡(luò)配置步驟詳解

    VMware下Centos7橋接方式網(wǎng)絡(luò)配置步驟詳解

    這篇文章主要為大家詳細(xì)介紹了VMware下Centos7橋接方式網(wǎng)絡(luò)配置完整步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Linux常用命令之chmod修改文件權(quán)限777和754

    Linux常用命令之chmod修改文件權(quán)限777和754

    這篇文章主要介紹了Linux常用命令之chmod修改文件權(quán)限777和754,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解決yum安裝報(bào)錯(cuò)Protected multilib versions的問題

    解決yum安裝報(bào)錯(cuò)Protected multilib versions的問題

    今天小編就為大家分享一篇解決yum安裝報(bào)錯(cuò)Protected multilib versions的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Centos7.4環(huán)境安裝lamp-php7.0教程

    Centos7.4環(huán)境安裝lamp-php7.0教程

    這篇文章主要介紹了Centos7.4環(huán)境安裝lamp-php7.0,較為詳細(xì)的分析了CentOS7.4環(huán)境下Apache、mysql、php7.0及phpmyadmin等安裝命令與操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • ubuntu下apache服務(wù)器操作方法小結(jié)

    ubuntu下apache服務(wù)器操作方法小結(jié)

    這篇文章主要介紹了ubuntu下apache服務(wù)器操作方法小結(jié),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • Linux下如何永久修改主機(jī)名的方法步驟

    Linux下如何永久修改主機(jī)名的方法步驟

    這篇文章主要介紹了Linux下如何永久修改主機(jī)名的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 關(guān)于Windows 不能在 本地計(jì)算器 啟動(dòng) Apache2(phpstudy)

    關(guān)于Windows 不能在 本地計(jì)算器 啟動(dòng) Apache2(phpstudy)

    今天在自己的本子上準(zhǔn)備放多個(gè)虛擬站點(diǎn)。用的是#phpstudy#。在軟件自身的站點(diǎn)設(shè)置中,根據(jù)提示添加的多站點(diǎn)無效不知道是否和我的系統(tǒng)是Win7有關(guān)
    2012-09-09

最新評(píng)論

纳雍县| 自治县| 农安县| 安陆市| 滦南县| 龙胜| 阳西县| 冕宁县| 犍为县| 内乡县| 馆陶县| 吴桥县| 安溪县| 渝北区| 攀枝花市| 宝山区| 江永县| 元氏县| 垣曲县| 栖霞市| 开远市| 镇安县| 碌曲县| 博野县| 崇礼县| 玛多县| 石棉县| 弥勒县| 邳州市| 毕节市| 安西县| 永登县| 九江市| 江西省| 肥乡县| 甘南县| 杭锦后旗| 巨鹿县| 中江县| 华安县| 琼海市|