返回   ShareGet 社群討論 > ≡ 電腦網路 ≡ > □ -- Unix & Linux

發表新主題 回覆
 
主題工具 顯示模式
  #1  
舊 2005-12-04, 01:46 PM
kazaya 的頭像
原來傷害最深的
 
註冊日期: 2004-05-31
來自: 是那些不肯同你說真話的人
文章: 8,847
給予: 45 | 感謝 222 | 共 123 篇
積分: 25189 | 給分能力: 98
[轉貼] 第八章 Modules And Kernel

第八章 Modules And Kernel
一. Modules:
1. 前言:當我們在電腦上新增硬體時,必須要有此硬體的driver(驅動程式),才能讓此硬體於系統上正常運作。而在linux以前較不普及時,硬體廠商所提供的drivers for linux比起drivers for windows真是少得可憐,但隨著linux的漸受重視,這些硬體廠商現大都會附上drivers for linux。
一般較為普及的硬體週邊裝置,OS本身已包含了這些drivers。

2. linux系統內的週邊裝置,於 /dev下都有其代表裝置的檔案,例如:
軟碟機(Floppy Disk)→ /dev/fd0 /dev/fd1
IDE硬碟與CD-ROM→ /dev/hda ~ /dev/hdd
<note>若fstab內為 /dev/cdrom,mount時不能mount /dev/hdx,除非
# mount -t iso9660 /dev/hdd munt/cdrom才OK。
序列埠 (serial),如Modem→ /dev/ttyS0 (com1) /dev/ttyS1(com2)
平行埠 (parallel)如printer→ /dev/lp0 (LPT1) /dev/lp1 (LPT2)
SCSI HD→sda . sdb.…。
SCSI CD-ROM→scd0 . scd1。

3. linux的核心是以modules的方式來載入drivers及支援其它功能,其最大好處是當未使用到該功能時,核心不會主動載入,需要時才將其載入,如此可節省許多系統資源。

4. 模組設定檔: /etc/modules.conf 或 /etc/conf.modules ,視版本而定。
若有新的驅動程式想於開機時被核心載入,就可設定在這裡。
例:alias eth0 8139too=>alias告訴系統eth0 須8139too模組。此檔案內還可包括dma、ioport、IRQ訊息(options)。

5. /lib/modules/2.4.18-3 /
這個目錄下需留意的是kernel目錄及modules.dep檔案:
(1)kernel:此目錄下所列者為核心可使用的模組,其下目錄有drivers、fs、net等,請自行參考。
<note>模組檔案是以 ”.o” 結尾,而在modules.conf內的modules不須要 ”.o”,也就是寫模組名稱 (modules-name) 即可。
另外2.4.18-3 可用`uname –r`代替。
(2)modules.dep:顯示模組相依性的訊息。

6.模組相關指令
(1)lsmod:顯示核心目前有載入的模組,此指令與 /proc/modules的內容相同。
(2)insmod:載入模組,但不會載入相依模組。
-p僅測試模組能否載入,而不會真正載入。
例: # insmod –p fat
# insmod vfat
 會顯示錯誤訊息,因模組有相依性的關係,此時應先載入
        fat,然後vfat才能被成功載入。最後用lsmod作確定動作。

(3)rmmod:移除模組。# rmmod modules–name
(4)modprobe:載入模組及其相依模組,載入流程是先載入modules.dep內與此模組相依的模組後,再載入主要模組。
-l 列出系統可使用的模組,即列出位於 /lib/modules/2.4.18-3/kernel下的子目錄。
-c 列出系統有載入的模組,較lsmod詳細。
-r 移除多模組。
例:# modprobe vfat
# modprobe -l;modprobe -c
# modprobe -r fat msdos
     
(5)modinfo:顯示模組訊息。
例:# modinfo 81390too 顯示模組的作者、用途描述、路徑…。
# modinfo –d 8139too 只顯示用途的描述。
模組訊息中,有一行敘述為:
license GPL
 GPL 為General Public License (通用公共許可)的簡寫,
它是一種軟體的版權模式,像linux就是以GPL版權模式
          對外發行的,也就是說任何人都可從網路上下載原始碼回
          來作修改,但修改完後,有義務將修改結果放置網路上讓
          人使用,這就是GPL的自由精神。
軟體雖經你修改,但版權並不屬於你的,而是要遵循原作
者GPL的版權模式繼續沿用下去。

(6)depmod -a:當有改變模組相依性時,就要執行一次,以更新modules.dep。系統預設在開機時會自動執行。
補充:新增硬體時,若此硬體driver已編入核心或模組(外掛模組),則開機時,kudzu此硬體偵測程式會偵測到,並將此硬體modules自動載入(一般情況下)。

二. Kernel:
1. 核心是Linux作業系統的靈魂所在,其最主要工作為控制週邊硬體設備,如cpu、記憶體、硬碟、網路卡、音效卡…、還有像行程的管理、網路功
能的支援等等,進而使這些硬體設備及相關服務能發揮其功能。
我們現在一般所謂的Linux distribution,即是在核心以外,另外包含了套件的整合、套件管理工具等,如此便成了Linux的Distribution。較著名的Linux Distribution如RedHat、Debian、SuSE、OpenLinux、Mandrake等等,但無論是哪種Distribution(套裝版本)皆使用相同的Linux核心。

2. 編譯核心的理由:
(1)當您使用的週邊裝置或須要的功能(如NTFS),預設的核心既沒將其編入核心,亦沒編成modules,此時便須重新編譯核心。
(2)若硬體設備只有新核心才支援時,便要下載新版的核心,進行升級編譯的動作。
(3)對於預設核心編譯太多用不到的功能,欲將此多餘功能取消時,就可重編核心,不過不建議如此作,因其對整體效能並無多大助益。
(4)特殊環境須求,例如一些商業套裝軟體系統。

3. 在未編譯核心前,可先了解一下預設核心的編譯狀況,若當初在安裝OS時,採全選安裝或手動安裝有勾選發展工具選項時,以redhat來說,在 /usr/src/linux.2.4.18-3/configs目錄下便有預設核心的概況,但若未勾選發展工具,也可在 /boot/config-2.4.18-3找到預設值,不過在 /usr/src下便找不到linux的字眼,此時可採光碟安裝(第二片),套件名稱為kernel-source。
以Openlinux來說,預設核心的編譯狀況是在 : /usr/src/linux/arch/i386/defconfig

4. # uname -r =>2.4.18-3
2→ 主版本
4→次版本
18→修訂版本
3→附版本
這裡只須留意第二個數字 (次版本),如其為奇數(如2.3、2.5)表為測試階段的版本,若為偶數,表經多次測試OK的穩定版本(如2.2、2.4)。
<note>在核心升級過程,切勿從2.2升級至2.4,因兩版本間已有所差異,函式庫亦有所不同,但若同為次版本升級則是可行,例如2.4.18升級至2.4.19。

5.最新核心訊息網站:
http://www.kernel.org/pub/linux/kernel/
http://ftp.nsysu.edu.tw/Linux/Kernel/linux/kernel/ 中山大學
http://ftp.kernel.org/pub/linux/kernel/

6.編譯核心:
假設系統原來核心版本為2.4.18-3,打算升級至2.4.19時
(1) root # wget http://www.kernel.org/pub/linux/kern...-2.4.19.tar.gz
Enter後便可於root目錄下找到此核心的tarball。
(2) root # cd /usr/src 切換目錄至src下。
(3) src # tar zxvf /root/linux-2.4.19.tar.gz
→將tarball解開到src下,此時可發現有兩目錄,一為linux-2.4.18-3 (此即為當初安裝OS時,採全選安裝或手動安裝有勾選發展工具選項時,才有此目錄存在),一為linux.2.4.19。
(4) src # ln -s linux-2.4.19 linux
→建立連結,因編譯過程在linux目錄下編譯較不會有問題。
<note>若原先已有linux目錄存在,須用mv將其改名。
(5) src # cd linux =>切換至linux目錄下,準備進行編譯步驟。
(6) linux # make menuconfig =>進入編輯畫面(主選單)。
˙畫面底部有Select、Exit、Help三按鈕,可用tab鍵移動。
Select+Enter→進入子選單。
Exit+Enter→退至上一層。
Help+Enter→該選項的說明。
<note>在主選單(Main Menu)畫面時,選Exit+Enter後,系統會問您是否保存以上設定,選擇yes,則會於 /usr/src/linux下,產生一隱藏檔.config。
˙選項右邊有向右箭頭,表示其下尚有子選單。
˙選項右邊無箭頭時,左邊應有〔〕或<>,此時可搭配space或M.N.Y使用,以便將此項目括弧內設定成 ”*”(編入核心)、M(編成外掛模組)或空白 (既不編入核心也不編成外掛模組)。
〔〕→其內不是空白就是*。
<>→其內可*、M、空白。
主選單的最下面有兩個選項:
(1) Load an Alternate Configuration File:
輸入替代檔名稱,例如可將別人編好的已解壓的核心檔案,download回來後附上檔名,並於此輸入。
(2) Save Configuration to an Alternate File:
您可在任何時候選此項 (預防不小心未存檔就退出),不過一般都在編譯完成才將以上設定保存在指定檔案(如 /tmp/barry),將來要是重新安裝OS時(設 /tmp/barry有備份起來),或設定核心選項後未保存就退出時,都可用(1)的Load選項,來套用當初的設定值。

˙編譯核心選項時,能編模組就編模組,以防編入核心項目太多,而使的將來無法製作開機片。除非是特殊效能,如網路功能等,或須此項目但無M可選時,才編成*。
˙編譯完成後,記得保存退出=>產生 /usr/src/linux-2.4.19/.config

設定核心選項時,須了解自己的硬體設備及所須功能譯,否則在reboot後會有錯誤訊息產生。
(7) linux # make dep
→建立相依關係。在編譯核心前需先建立起待會編譯核心時所需用到
 的相依函式庫。
(8) linux # make clean
→去除舊有資料設定。
(9) linux # make bzImage
→編譯 ( 建立 ) 核心,完成後可於 /usr/src/linux/arch/i386/boot下產生bzImage 檔案,這個檔案就是我們剛建立起來的新核心。
(10)linux # make modules
→編譯模組,如drivers、net、fs、kernel…。至於編譯時間端賴剛剛
 在設定核心時選擇模組數量多寡來決定。
(11)linux # make modules_install
→將編好模組安裝在 /lib/modules/2.4.19目錄下。
(7)~(11)完成後,可進行測試:
linux # make bzdisk
→將編好的核心放磁片內進行測試,完成後reboot,從軟碟開機,若一切正常,再進行以下步驟。
(12)linux # make install →將核心放硬碟 /boot內。此步驟等於以下組合:
cp /usr/src/linux/arch/i386/boot/ bzImage /boot/vmlinuz-2.4.19
ln -s /boot/vmlinuz-2.4.19 /boot/vmlinuz
cp /usr/src/linux/System.map /boot/System.map-2.4.19
ln -s /boot/System.map-2.4.19 /boot/System.map
最後再修改 /etc/lilo.conf或 /boot/grub/menu.lst,底下分別說明:

˙# vi /etc/lilo.conf
prompt
timeout=50
default=redhat
boot= /dev/hda
map= /boot/map
install= /boot/boot.b
message= /boot/message
lba32
image= /boot/vmlinuz-2.4.18-3
label=redhat
initrd= /boot/initrd-2.4.18-3.img
read-only
root= /dev/hda3
image= /boot/vmlinuz-2.4.19
label=redhat.new
initrd=/boot/initrd-2.4.19.img
read-only
root= /dev/hda3
other= /dev/hda1
lable=windows 2000
修改完存檔離開後,記得執行 # lilo -v –v

˙# vi /boot/grub/menu.lst
default=0
timeout=10
title redhat
root=(hd0,1)
kernel=/boot/vmlinuz-2.4.18-3 root=/dev/hda3
initrd=/boot/initrd-2.4.18-3.img
title redhat-new
root=(hd0,1)
kernel=/boot/vmlinuz-2.4.19 root=/dev/hda3
initrd=/boot/initrd-2.4.19.img
title windows
rootnoverify=(hd0,0)
chainloader +1
存檔離開後,下次重新開機時就可看到三個選單供您選擇。

7.編譯過程如有問題,大都卡在make bzImage、make modules,如遇Error結尾就要小心。
若碰到warning:kernel is too big for standalone boot from Floppy,表所編核心過大,裝不進磁片內,亦即無法製作開機片,故要刪除一些編入核心選項 ”*”或將其改成M。
遇Unresolved symbol…錯誤訊息時,可能舊模組還在 /lib/modules下,故應將其改名,再執行make modules_install,也可試試在編譯選項時,Loadable module support內Set version information on all module symbols的 ”*”取消。

8.當我們安裝好作業系統後,發覺系統預設沒把ntfs編進去,這時候可能就
 需重編核心了。我們以redhat 7.3為例來作說明:
# cd /usr/src
# cp –a linux-2.4.18-3 newlinux
# ln –s newlinux linux
# cd linux
# make menuconfig 將ntfs編進去,然後存檔離開。
 # make dep
# make clean
# make bzImage
# make modules
# make modules_install 會產生2.4.18-3custom於 /lib/modules/ 之下。
 # cd /lib/modules
# cp –a 2.4.18-3custom 2.4.18-3 直接用mv改名亦可。
這樣就算完成了,不必再執行make install,因我們目的只是要那個模組
而已。
  
補充:1. kernel可編譯方式除make menuconfig外,尚有:
make config→逐行輸入設定項目,但無法往前修改。
make xconfig→在X-Window下的設定方式。
2.製作開機片:
# mkbootdisk --device /dev/fd0 2.4.19
→可用`uname –r`代替2.4.19。
開機片內有執行檔:boot.msg、intrd.img、ldlinux.sys、syslinux.cfg、vmlinuz。
3. # free→顯示記憶體訊息。
__________________
如果您覺得"文章小說討論區"所發的主題不錯
請不要吝嗇 在主題 " 點閱" 及 並給予 發文者一些鼓勵
---------------------------------------------
為了防止世界被破壞  為了保護世界的和平
貫徹下載與燒錄的邪惡  可愛又迷人的盜版角色
MP3....Program...  我們是穿梭在網際網路中的盜版大隊~~
拷貝 拷貝的明天正等著我們~~
就是這樣....喵~~@@
回覆時引用此文章
發表新主題 回覆

書簽

主題工具
顯示模式

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用
論壇跳轉


所有時間均為GMT -5。現在的時間是 09:23 PM


Powered by vBulletin® Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.