Linux核心動態載入模組,linux核心模組

來源:互聯網
上載者:User

Linux核心動態載入模組,linux核心模組
一、安裝核心模組:  一般步驟:  (1) 在/usr/src/linux/下運行make menuconfig把需要編譯成模組的項打上(M),儲存並退出。  (2) 運行make modules,這一步將在/usr/src/linux/下產生*.o或*.ko檔案。  (3) 運行make modeules_install來安裝,這步會把產生的.o或ko檔案拷貝到/lib/modules/`uname -r`/下。  如果你只要編譯某一個或幾個模組,就可以用下面這個快速的方法:  (1) 找到編譯核心所需要的.config檔案。  在/usr/src/linux/arch目錄下有若干編譯核心所用的配置。選擇我們想要的配置,將它複製到/usr/src/linux目錄下,改名為.config。  cp /usr/src/linux/arch/x86/xxconfig /usr/src/linux/.config  (2) 修改.config檔案,去掉不用的模組,加上自己想要的模組。  開啟.config,有許多XXXX=m的項,這些都是要被編譯為模組 的項,因為我們不希望編譯這些模組,所以要把XXXX=m的項統統去掉。然後再加上我們想要的模組,例如將# CONFIG_NTFS_FS is not set 改為CONFIG_NTFS_FS=m 當然,可以用你熟悉各種工具來做這件事。  (3) 編譯NTFS模組。  在/usr/src/linux目錄下運行命令make modules來編譯我們想要的模組。  (4) 安裝模組。  編譯後得到的.o檔案在/usr/src/linux/目錄下,手動將它複製到正確的目錄下。  例如cp /usr/src/linux/fs/ntfs/ntfs.o /lib/modules/2.2.16-22/fs/  注意:千萬不能運行命令make modules_install,否則將帶來嚴重的後果,它會刪除你系統中的所有模組,只安裝剛剛編譯的模組(ntfs.o)。  二:安裝完成以後,我們就可以載入模組了:  和linux中載入模組有關的幾個命令分別如下:  depmod, modprobe, lsmod  先來看看depmod命令:  depmod是一個 用來產生modules.dep和map檔案的程式。在modules.dep檔案中空白行和以’#'開頭的行將被忽略.depmod通過讀取/lib /modules/version目錄下的每一個模組來建立一個記錄模組相依性的列表。這個列表就是/lib/modules/version目錄下的 modules.dep。depmod也會在/lib/modules/version目錄下建立許多map檔案,例如 modules.dep,modules.isapnpmap,modules.pcimap,modules.alias這些檔案將會被hotplug 用到。  OPTIONS:  -a –all Probe all modules. This option is enabled by default if no  file names are given in the command-line.  檢查所有的模組,這個命令是預設的如果你沒有指定模組名字的話。  -A –quick This option scans to see if any modules are newer than the  modules.dep file before any work is done%3  再來看看modprobe命令:  modprobe 命令是根據depmod -a的輸出/lib/modules/version/modules.dep來載入全部的所需要模組。可以通過modprobe -l來顯示可以當前可以載入的模組。modprobe 在掛載模組是不用指定模組檔案的路徑,也不用帶檔案的尾碼.o 或.ko, 而insmod 需要的是模組的所在目錄的絕對路徑,並且一定要帶有模組檔案名稱尾碼的(modulefile.o 或modulesfile.ko )。 insmod比較重要的用途是用來測試模組的正確性,載入一般都是依靠modprobe。  用法:modprobe xxx.ko #載入某個模組  modprobe -r xxx.ko #卸載某個模組  lsmod:  lsmod 顯示當前載入的所有 模組,相當於cat /proc/modules,假設你沒有設定開機載入某個模組,比如ntfs,那麼開機後執行lsmod,列表裡不會有ntfs這個模組的,這時你再執行 mount -t ntfs xxx後,執行lsmod後列表裡就會有ntfs這個模組了。  還要注意的是lsmod顯示的是模組名,而不是別名(alias)。  三、在核心中有一個“Automatic kernel module loading”功能被編譯到了核心中。當使用者嘗試開啟某類型的檔案時,核心會根據需要嘗試載入相應的模組。我們來看看驅動程式自動載入是怎麼實現的:  每一個裝置都有Verdon ID, Device ID, SubVendor ID等資訊。而每一個裝置驅動程式,必須說明自己能夠為哪些Verdon ID, Deviece  ID, SubVendor ID的裝置提供服務。以PCI裝置為例,它是通過一個pci_device_id的資料結構來實現這個功能的。例如:RTL8139的pci_device_id定義為:  static struct pci_device_id rtl8139_pci_tbl[] = {  {0x10ec, 0×8139, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },  {0x10ec, 0×8138, PCI_ANY_ID, PCI_ANY_ID, 0, 0, RTL8139 },  ……  }  在模組安裝的時候,depmod會根據模組中的rtl8139_pci_tbl的資訊,產生下面的資訊,儲存到/lib/modules/uname-r /modules.alias檔案中,其內容如下:  alias pci:v000010ECd00008138sv*sd*bc*sc*i* 8139too  alias pci:v000010ECd00008139sv*sd*bc*sc*i* 8139too  ……  另外在/lib/modules/uname-r /modules.dep檔案中還儲存這模組之間的依賴關係,其內容如下:  (這裡省去了路徑資訊。)  8139too.ko:mii.ko  在核心啟動過程中,匯流排驅動程式會會匯流排協議進行匯流排枚舉(匯流排驅動程式總是整合在核心之中,不能夠按模組方式載入,你可以通過make menuconfig進入Bus options,這裡面的各種匯流排,你只能夠選擇Y或N,而不能選擇M.),並且為每一個裝置建立一個裝置對象。每一個匯流排對象有一個kset對象,每一 個裝置對象嵌入了一個kobject對象,kobject串連在kset對象上,這樣匯流排和匯流排之間,匯流排和裝置裝置之間就組織成一顆樹狀結構。當匯流排驅 動程式為掃描到的裝置建立裝置對象時,會初始化kobject對象,並把它串連到裝置樹中,同時會調用kobject_uevent()把這個(添加新設 備的)事件,以及相關資訊(包括裝置的VendorID,DeviceID等資訊。)通過netlink發送到使用者態中。在使用者態的udevd檢測到這個 事件,就可以根據這些資訊,開啟/lib/modules/uname-r /modules.alias檔案,根據 alias pci:v000010ECd00008138sv*sd*bc*sc*i* 8139too  得知這個新掃描到的裝置驅動模組為8139too。於是modprobe就知道要載入8139too這個模組了,同時modprobe根據 modules.dep檔案發現,8139too依賴於mii.ko,如果mii.ko沒有載入,modprobe就先載入mii.ko,接著再載入 8139too.ko。  實驗  在你的shell中,運行:  # ps aux | grep udevd  # kill -9 25063 然後跟蹤udevd,在shell中運行:  # strace -f /sbin/udevd –daemon  這時,我們看到udevd的輸出如下: ……  close(8) = 0  munmap(0xb7f8c000, 4096) = 0  select(7, [3 4 5 6], NULL, NULL, NULL  我們發現udevd在這裡被阻塞在select()函數中。 select函數原型如下: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);  第一個參數:nfds表示最大的檔案描述符號,這裡為7(明明是6 ?)。  第二個參數:readfds為讀檔案描述符集合,這裡為3,4,5,6.  第三個參數:writefds為寫檔案描述符集合,這裡為NULL。  第四個參數:exceptfds為異常檔案描述符集合,這裡為NULL。  第五個參數:timeout指定逾時時間,這裡為NULL。  select函數的作用是:如果readfds中的任何一個檔案有資料可讀,或者witefds中的任何一個檔案可以寫入,或者exceptfds中的任 何一個檔案出現異常時,就返回。否則阻塞當前進程,直到上訴條件滿足,或者因阻塞時間超過了timeout指定的時間,當前進程被喚醒,select返 回。 所以,在這裡udevd等待3,4,5,6這幾個檔案有資料可讀,才會被喚醒。現在,到shell中運行: # ps aux | grep udevd  root 27615 …… strace -o /tmp/udevd.debug -f /sbin/udevd –daemon  root 27617 …… /sbin/udevd –daemon  udevd的進程id為27617,現在我們來看看select等待的幾個檔案: # cd /proc/27615/fd  # ls -l  udevd的標準輸入,標準輸出,標準錯誤全部為/dev/null.  0 -> /dev/null  1 -> /dev/null  2 -> /dev/null  udevd在下面這幾個檔案上等待。  3 -> /inotify  4 -> socket:[331468]  5 -> socket:[331469]  6 -> pipe:[331470]  7 -> pipe:[331470]  由於不方便在運行中插入一塊8139的網卡,因此現在我們以一個隨身碟來做實驗,當你插入一個隨身碟後,你將會看到strace的輸出,從它的輸出可以看到 udevd在select返回後,調用了modprobe載入驅動模組,並調用了sys_mknod,在dev目錄下建立了相應的節點。  execve(“/sbin/modprobe”, ["/sbin/modprobe", "-Q", "usb:v05ACp1301d0100dc00dsc00dp00"...]  ……  mknod(“/dev/sdb”, S_IFBLK|0660, makedev(8, 16)) = 0  ……  這裡modprobe的參數”usb:v05AC…”對應modules.alias中的某個模組。 可以通過udevmonitor來查看核心通過netlink發送給udevd的訊息,在shell中運行: # udevmonitor –env  然後再插入隨身碟,就會看到相關的發送給udevd的訊息。  四、核心模組載入的配置:  有時候需要一次性載入許多模組,需要在一個地方統一配置modprobe的選項等,有一個比較重要的檔案:/etc/modprobe.conf,在opensuse中,和它有關的還有modprobe.d/檔案夾下的許多檔案和modprobe.conf.local檔案,在 /etc/modprobe.conf裡會include其它所說的檔案,一般建議在modprobe.conf.local中修改自己的配置。 /etc/modprobe.conf其實就是用於 寫入模組的載入命令或模組的別名的定義等。man modprobe.conf:  alias my-mod really_long_modulename為模組定義一個便於使用的別名  options modulename option…在載入模組時添加選項  install modulename command…使用自己定義的命令去載入指定的模組,如install fred /sbin/modprobe barney; /sbin/modprobe  –ignore-install fred” 每次載入fred模組的時候用的是 “/sbin/modprobe barney; /sbin/modprobe  –ignore-install fred”命令  remove modulename command…用自己定義的命令刪除指定的模組。  include filename 引入其它檔案  blacklist modulename 不再載入某個模組  五、核心模組開機自動掛載:  對於開機自動掛載模組,在redhat系統裡,網上說在核心啟動的過程中,init執行/etc/rc.d/rc.sysinit後,啟動核心外掛模組 時會讀取/etc/modprobe.conf這個檔案。在2.4的核心中, 只 要直接修改/etc/modprobe.conf加入install xxx即可。2.6核心則需修改/etc/rc.d/rc.sysinit檔案。具體的過程可以看:http://blog.csdn.net /ioriqqe/archive/2009/11/05/4772033.aspx  而在suse裡,可以在root許可權編輯/etc/sysconfig/kernel檔案,添加需要啟動的模組。 

  碼農必須要加班?NO!

  知道碼農們都想擺脫加班狗、外賣臉的稱號,所以我們來了!

  我們做了一個能讓程式員之間共用知識技能的APP,覺得可以顛覆程式員的工作方
式!

  有人說我們癡心妄想,但我們不那麼認為。

  為了能煽爛說我們癡心妄想的人的臉,現在我們急需程式員業內的牛嗶-人物來給
我們“號脈”!“診斷費”豐厚!畢竟我們不差錢兒,只是想做到最好!

  圈圈字典中講到,牛嗶-人物是指群成員數高於1000人的QQ群主或關注人數高於
2000人的貼吧吧主或粉絲人數高於10000人的微博博主或成員數高於2000主題貼的版主
或單帖閱讀量高於2000部落客或人脈超級廣的圈內紅人。

  對於未能達標的未來大神們,我們只能含淚表示:蜀黍,咱們來日方長,這次暫
時不約好嗎?待他日你立地成神,我必生死相依!

  來?還是不來?

  圈圈互動 接頭暗號:1955246408 (QQ)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.