<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 深度介紹Linux內(nèi)核是如何工作的

          深度介紹Linux內(nèi)核是如何工作的

          作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

          # lsmod

          pcspkr 4224 0

          hci_usb 18204 2

          psmouse 38920 0

          bluetooth 55908 7 rfcomm,l2cap,hci_usb

          yenta_socket 27532 5

          rsrc_nonstatic 14080 1 yenta_socket

          isofs 36284 0

          輸出的內(nèi)容包括:模塊的名字、大小、使用次數(shù)和依賴(lài)于它的模塊列表。使用次數(shù)對(duì)防止卸載當(dāng)前活躍的模塊非??傄?。Linux只允許使用次數(shù)為零的模塊被移除。

          你可以使用modprobe來(lái)手動(dòng)加載和卸載模塊,(還有兩個(gè)命令行叫做insmod和rmmod,但modprobe更易于使用因?yàn)樗詣?dòng)移除了模塊依賴(lài))。比如lsmod的輸出在我們的電腦上顯示了一個(gè)名叫isofs的卸載模塊,它的使用次數(shù)是零而且沒(méi)有依賴(lài)模塊,(isofs是一個(gè)模塊,它支持CD上使用的ISO系統(tǒng)文件格式)這種情況下,kernel會(huì)允許我們卸載模塊:

          # modprobe -r isofs

          現(xiàn)在,isofs不再顯示在Ismod的輸出中,kernel由此節(jié)省了36,284字節(jié)的存儲(chǔ)。如果你放入CD并且讓它自動(dòng)安裝,kernel將自動(dòng)重新載入isofs模塊,而且isofs的使用次數(shù)增加到1次。如果這時(shí)候你還試圖移除模塊,就不會(huì)成功了因?yàn)樗诒皇褂茫?p># modprobe -r isofs

          FATAL: Module isofs is in use.

          Lsmod只是列出了當(dāng)前被載入的模塊,modprobe則將列出所有可用的模塊,它實(shí)際上輸出了/lib/modules/KERNELVERSION目錄下所有的模塊,名單會(huì)很長(zhǎng)!

          實(shí)際上,使用modprobe來(lái)手動(dòng)加載一個(gè)模塊并不常見(jiàn),但確實(shí)可以通過(guò)modprobe命令行來(lái)對(duì)模塊設(shè)置參數(shù),例如:

          # modprobe usbcore blinkenlights=1

          我們并不是在創(chuàng)建blinkenlights,而是usbcore模塊的實(shí)參數(shù)。

          那么如何知道一個(gè)模塊會(huì)接受什么參數(shù)呢?一個(gè)比較好的方法是使用modinfo命令,它列出了關(guān)于模塊的種種信息。這里有一個(gè)關(guān)于模塊snd-hda-intel的例子

          # modinfo snd-hda-intel

          filename: /lib/modules/2.6.20-16-generic/kernel/sound/pci/hda/snd-hda-intel.ko

          description: Intel HDA driver

          license: GPL

          srcversion: A3552B2DF3A932D88FFC00C

          alias: pci:v000010DEd0000055Dsv*sd*bc*sc*i*

          alias: pci:v000010DEd0000055Csv*sd*bc*sc*i*

          depends: snd-pcm,snd-page-alloc,snd-hda-codec,snd

          vermagic: 2.6.20-16-generic SMP mod_unload 586

          parm: index:Index value for Intel HD audio interface. (int)

          parm: id:ID string for Intel HD audio interface. (charp)

          parm: model:Use the given board model. (charp)

          parm: position_fix:Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size). (int)

          parm: probe_mask:Bitmask to probe codecs (default = -1). (int)

          parm: single_cmd:Use single command to communicate with codecs (for debugging only). (bool)

          parm: enable_msi:Enable Message Signaled Interrupt (MSI) (int)

          parm: enable:bool

          對(duì)我們來(lái)說(shuō)比較有興趣的以parm開(kāi)頭的那些部分:顯示了模塊所接受的參數(shù)。這些描述都比較簡(jiǎn)明,如果想要更多的信息,那就安裝kernel的源代碼,在類(lèi)似于/usr/src/KERNELVERSION/Documentation的目錄下你會(huì)找到。

          里面會(huì)有一些有趣的東西,比如文件/usr/src/KERNELVERSION/Documentation/sound/alsa/ALSA-Configuration.txt描述的是被許多ALSA聲音模塊承認(rèn)的參數(shù);/usr/src/KERNELVERSION/Documentation/kernel-parameters.txt這個(gè)文件也很有用。

          前幾天在Ubuntu論壇有一個(gè)例子,說(shuō)的是如何將參數(shù)傳遞到一個(gè)模塊(詳見(jiàn)https://help.ubuntu.com/community/HdaIntelSoundHowto)。實(shí)際上問(wèn)題的關(guān)鍵是snd-hda-intel參數(shù)在正確驅(qū)動(dòng)聲音硬件時(shí)需要一點(diǎn)操作,而且在boot time加載時(shí)會(huì)中止。解決方法的一部分是將probe_mask=1選項(xiàng)賦給模塊,如果你是手動(dòng)加載模塊,你需要輸入:

          # modprobe snd-hda-intel probe_mask=1

          更有可能,你在文件/etc/modprobe.conf中放置這樣類(lèi)似的一行:options snd-hda-intel probe_mask=1

          這告訴modprobe每次在加載snd-hda-intel模塊時(shí)包含probe_mask=1選項(xiàng)。現(xiàn)在的有些Linux版本將這一信息分離進(jìn)/etc/modprobe.d下的不同文件中了,而不是放入modprobe.conf中。

          /proc系統(tǒng)文件

          Linux kernel同樣通過(guò)/proc系統(tǒng)文件來(lái)展示了許多細(xì)節(jié)。為了說(shuō)明/proc,我們首先需要擴(kuò)展我們對(duì)于文件的理解。除了認(rèn)為文件就是存儲(chǔ)在硬盤(pán)或者CD或者存儲(chǔ)空間上的持久信息之外,我們還應(yīng)當(dāng)把它理解為任何可以通過(guò)傳統(tǒng)系統(tǒng)調(diào)用如:打開(kāi)、讀、寫(xiě)、關(guān)閉等訪問(wèn)的信息,當(dāng)然它也可以被常見(jiàn)的程序訪問(wèn)。

          /proc之下的文件完全是kernel虛擬的一個(gè)部分,給我們一個(gè)視角可以看到kernel內(nèi)部的數(shù)據(jù)結(jié)構(gòu)。實(shí)際上,許多Linux的報(bào)告工具均能夠很好地呈現(xiàn)在/proc下的文件中尋到的格式化版本的信息。比如,一列/proc/modules將展示一列當(dāng)前加載的模塊。

          同樣的,/proc/meminfo提供了關(guān)于虛擬存儲(chǔ)系統(tǒng)當(dāng)前狀態(tài)的更多細(xì)節(jié)信息,而類(lèi)如vmstat的工具則是以一種更加可理解的方式提供了相同的一些信息;/proc/net/arp顯示了系統(tǒng)ARP cache的當(dāng)前內(nèi)容,從命令行來(lái)說(shuō),arp -a顯示的也是相同的信息。

          尤其有意思的是/proc/sys下的文件。/proc/sys/net/ipv4/ip_forward下的設(shè)置告訴我們kernel是否將轉(zhuǎn)發(fā)IP數(shù)據(jù)包,也就是說(shuō)是否扮演網(wǎng)關(guān)的作用?,F(xiàn)在,kernel告訴我們這是關(guān)閉的:

          # cat /proc/sys/net/ipv4/ip_forward

          0

          當(dāng)你發(fā)現(xiàn)你可以對(duì)這些文件寫(xiě)入的時(shí)候,你會(huì)覺(jué)得更加有意思。繼續(xù)舉例來(lái)說(shuō):

          # echo 1 > /proc/sys/net/ipv4/ip_forward

          將在運(yùn)行的kernel中打開(kāi)IP 轉(zhuǎn)發(fā)(IP forwarding)

          除了使用cat和echo來(lái)檢查和更正/proc/sys下的設(shè)置以外,你也可以使用sysctl命令:

          # sysctl net.ipv4.ip_forward

          net.ipv4.ip_forward = 0

          這等同于:

          # cat /proc/sys/net/ipv4/ip_forward



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();