基于PC/104平臺的嵌入式Linux技術在海洋自動觀測系統中具有廣泛的應用前景,Linux核心定制方法的研究是嵌入式Linux系統研制的關鍵工作。本文結合PC/104平臺嵌入式Linux系統的研制,詳細論述了Linux內核和文件系統的定制方法。 本文就如何對Linux系統的核心實現定制進行論述,主要內容包括Linux內核部分和文件系統,系統定制的硬件平臺是PC/104單片機。之所以將Linux內核定制、文件系統定制單獨討論,是因為在基于任何平臺的Linux系統定制過程中,其內核和文件系統的定制工作都具有相似的特征和相似的過程。 在基于PC/104平臺的嵌入式Linux研制過程中,進行核心定制的主要目的是從需求出發使系統最大程度地滿足應用的需要、最大程度地適應系統硬件平臺、最優化地支持系統外圍設備和應用程序,并且盡量減少對系統資源的占用、減少系統功耗,增強系統的安全性、穩定性、可靠性,另外使系統真正地實現產權自主化。 內核定制 一般操作系統的內核從體系結構角度可以劃分為兩種:微內核體系結構、單內核體系結構。微內核體系結構只在內核中包括了一些基本的內核功能,其它部分在用戶內存空間運行,這種結構需要在各層之間進行調用,因此會有一定的消耗,使執行效率不如單內核體系結構。Linux采用單內核體系結構,內核的所有部分都集中在一起,這樣能使系統的各部分直接溝通,有效地縮短任務之間的切換時間,提高了系統的響應速度,實時性好并提高了CPU的利用率,但在系統比較大的時候體積也比較大,與嵌入式系統容量小、資源有限的特點不符合,因此需要進行非常精細的定制以適應嵌入式系統的需要。 內核版本 Linux的源程序是完全公開的,任何人只要遵循GPL,就可以對內核加以修改并發布給他人使用。Linux的開發采用的是雙樹系統。一個樹是穩定樹(stable tree),另一個樹是非穩定樹(unstable tree)或稱開發樹(development tree)。一些新特性、實驗性改進等都將首先在開發樹中進行,如果在開發樹中所做的改進也可以應用于穩定樹,那么在開發樹中經過測試以后,在穩定樹中將進行相同的改進。一旦開發樹經過了足夠的發展,開發樹就會成為新的穩定樹。開發樹就體現在源程序的版本號中;源程序版本號的形式為x.y.z,對于穩定樹來說,y是偶數;對于開發樹來說,y比相應的穩定樹大一(是奇數)。到目前為止,穩定樹的最高版本是2.4.21,開發樹的最新版本是2.5.73。本項目采用的內核版本是2.2.20,選擇2.2.20版本內核的主要原因有: a.版本為2.0及以前內核中的設備驅動不如2.2版本的全面; b.版本為2.2的內核增加了很多新特性; c.新的版本為2.4的內核對PC/104的CPU塊支持不好; d.由于不明原因版本為214的內核對PC/104 ; e.版本為2.4內核相對龐大,編譯后的內核文件也相對較大; f.版本為2.2的內核已完全能夠滿足本項目的需要。 目前,大多數面向數據采集的嵌入式Linux研制工作都是基于版本2.0/2.2內核進行的。實際上,內核版本的提升,其復雜度也隨之升高,也會給嵌入式系統的定制工作帶來很多的困難。 內核設置 內核設置工作可以通過直接修改內核源代碼中的Make file文件、Config.in文件和內核源代碼根目錄下的.config文件來完成。內核源代碼中的每個目錄都有各自的用途,每個子目錄下也都有相應的Make file文件。例如,在目錄drivers/block/ Config.in文件中有如下語句: if[“$CONFIG_BLK_DEV_HD_DE”= “y”-o“$CONFIG_BLK_DEV_HD_ONLY”= “y”];then define_boolCONFIG_BLK_DEV_HDy else define_boolCONFIG_BLK_DEV_HDn fi 這段語句的作用是定義在塊設備中DE塊設備驅動可以被編譯在內核中也可以被編譯成內核模塊。采用修改配置文件的方式設置內核比較復雜,而且容易出現錯誤,但是對深入剖析和理解內核幫助很大。比較有效的方式還是直接利用Linux內核提供的工具進行內核設置。在Linux源代碼目錄下,Linux內核設置命令是: # make menu config 命令執行后會顯示一個字符型菜單配置環境,在該環境中有以下選項,通過這些選項設置可以定制Linux內核的各項功能,并對內核實現裁減。下面對主要設置選項進行介紹: (1) Code maturity level options代碼成熟等級。此處只有一項:prompt for development and/or incomplete code/drivers,如果要試驗現在仍處于實驗階段的功能,就必須把該項選擇為Y了;否則可以把它選擇為N。在這部分,設定是否允許內核的一些試驗選項被使用。 (2)Load able module support對可加載模塊的支持。可加載模塊碼不是內核的一部分,但是當需要它的時候,可以被同內核一起加載并使用。如果將內核代碼編譯成可加載模塊,可以使內核更小,而且更穩定。但是需要注意的是,如果將文件系統代碼編譯為可加載模塊,將使內核無法讀取文件系統,因此在啟動的時候內核無法加載配置文件。 這里面有3項: Enable loadable module support:提供內核支持; Set version information on all modulesymbols:設置所有模塊的版本信息; Kernel module loader:讓內核在啟動時有自己裝入必需模塊的能力。 (3)Processor type and features CPU類型選項。可以選擇處理器的類型,通常“/dev/cpu”選項更高級。 Processor family:根據應用情況選擇CPU類型。 High Memory Support:大容量內存的支持。可以支持到4G、64G,只有當計算機有超過1GB內存(不是磁盤空間)時才是必須的。 Mathe mulation:協處理器仿真。如果計算機是386或486SX的CPU,則須打開該選項,因為這些CPU沒有Linux需要的浮點運算單元(Math Emulation,也稱數學協處理器),所以必須選擇該選項。 MTTR support: MTTR支持選項允許在PCI或者AGP總線眾進行更快速的通訊。 Symmetric multi-processing support:對稱多處理支持。 (4)Generalsetup 常規選項設置。在這里可以制定特定的內核常規選項,比如網絡支持。網絡支持是Linux內核的重要組成部分,這些選項通常是打開的。現在的Linux發行版以ELF格式作為它們的“內核核心格式”,這是不同系統庫(system libraries)的標準格式。“ELF”是“a1out”格式的繼承,幾乎所有Linux程序都使用ELF庫,有些老的程序仍然需要a1out格式支持。主要選項有: Networking support:網絡支持。 PCI support: PCI支持。 PCI accessmode: PCI存取模式。可供選擇的有BIOS、Direct和Any。 Support fo rhot-pluggabel devices:熱插拔設備支持。但Linux支持的不是太好,可不選。 PCMCIA/CardBus support: PCMCIA CardBus支持。有PCMCIA就必選了。 System VIPC: 允許程序通信和同步。 BSD Process Accounting:保持諸如進程結束時產生的錯誤代碼的。 Sysctl support:允許程序修改某些內核選項而不需要重新編譯內核或者重新啟動計算機。 以上3項是有關進程處理/IPC調用的,主要就是System V和BSD兩種風格。如果不是使用BSD, 可以按照缺省選擇。 Power Marcha gem ent support:電源管理支持。Advanced Power Management BIOS support: 高級電源管理BIOD支持。 (5)Memory Technology Device(MTD) MTD設備支持。這個選項使Linux可以讀取閃存卡(Flash Card)之類的存儲器,2.4版本內核 開始支持DOC。 (6)Paralle lport support并口支持。 (7)Plug and Play configuration即插即用支持。 (8)Block devices塊設備支持。 子選項如下: Normal PC floppy disk support:普通PC軟盤支持。 XT hard disks upport:XT硬盤支持 Mulex DAC960/DAC1100 PCI RAID Controller support: RAID鏡像選項。 Loopback device support: DOC要求有這個支持; Network block device support:網絡塊設備支持。 Logical volume manager(LVM) support:邏輯卷管理支持。 Multiple devices driver support:多設備驅動支持。 RAM disk support: RAM盤支持。 (9)Networking options網絡選項。 Packet socket:網絡包套接口。 Kernel/User netlin ksocke:內核與用戶進程雙向通信。 Network firewalls:防火墻支持。 UNIX domain sockets:UNIX的socket。 TCP/IP networking:TCP/IP支持。 The IPX protocol:IPX協議支持。 (10)Telephony Support 電話支持。Linux下可以支持電話卡,這樣就可以在IP上使用普通的電話提供語音服務了。電話卡和modem沒有任何關系。 (11)ATA/DE/MFM/RLL support 有關各種接口的硬盤/光驅/磁帶/軟盤支持。DOC不需要該選項,CFC需要選擇其中的部分選項。 (12)SCSI supportSCSI設備的支持。 (13)IEEE 1394(FireWire)support 要Fireware硬件來提高串行總線的性能。 (14)I2O devicesupport 需要I2O接口適配器才能支持,在智能Input/Output(I2O)體系接口中使用。 (15)Network device support 網絡設備支持。列出常見網卡的驅動程序。 (16)Amateur Radio support 配置業余無線廣播。 (17)IrDA(infrared) support 紅外支持。 (18)ISDN subsystem ISDN上網支持。 (19)OldCD-ROM drivers(notSCSI、notIDE)非SCSI/DE口的光驅。 (20)Character devices 字符設備。其中有: I2C support: I2C是Philips極力推動的微控制應用中使用的低速串行總線協議。如果要選擇下面的Video For Linux,該項必選。 Mice:鼠標。現在可以支持總線、串口、PS/2、C&T82C710 mouseport、PC110 digitizerpad。 Joysticks:手柄支持。Watchdog Cards:如果把這個選中,那么就會在/dev下創建一個名為watchdog的文件,它可以記錄系統的運行情況,一直到系統重新啟動的1min左右。有了這個文件,就可以恢復系統到重啟前的狀態了。 Video For Linux:支持有關的音頻/視頻卡。 Ftape,the floppy tape device driver: PCMCIA character device support:上邊介紹了。 (21)Filesy stems文件系統。介紹以下幾項: Quota support: Quota可以限制每個用戶可以使用的硬盤空間的上限,在多用戶共同使用一臺主機的情況中十分有效。 DOSFAT fssupport: DOSFAT文件格式的支持,可以支持FAT16、FAT32。 ISO 9660CD-ROM file system support:光盤使用的就是ISO9660的文件格式。 NTFS file system support:ntfs是NT使用的文件格式。 /proc file system support:/proc文件系統是Lnux提供給用戶和系統進行交互的通道,應該選上,否則有些功能沒法正確執行。 還有另外3個大類是:Network File Systems(網絡文件系統)、Partition Types(分區類型)、 NativeLanguageSupport(本地語言支持)。值得一提的是NetworkFileSystems里面的兩種:NFS和SMB分別是Linux和Windows相互以網絡鄰居的形式訪問對方所使用的文件系統。 (22)Console drivers控制臺驅動。一般使用VGA text console就可以了,標準的80325的文本控制臺。 (23)Sound聲卡驅動。 (24)USB supprotUSB支持。很多USB設備,比如鼠標、調制解調器、打印機、掃描儀等,在Linux都可以得到支持。 (25)Kernel hacking配置此選項可以在系統崩潰時,也可以進行一定的工作了。但對于普通用戶是用不著這個功能的。 內核編譯 內核配置結束后就可以編譯內核了,內核編譯只有幾個指令,但是內核編譯的時間可能會很長。在執行內核配置之前可以先執行#make mrproper命令,檢查內核源程序,以發現內核文件是否完備。 內核編譯的命令如下: #maked ep:使內核正確設置所有模塊的依賴關系。 make clean:清除所有已存在的目標文件,已存在的目標文件主要由上次內核編譯形成,如果忘記做這一步,生成的內核將會非常龐大。 #make zImage/zdisk/bzImage/zlilo:生成一個經過壓縮的內核。如果要制作成啟動盤就使用make zdisk,而make zlilo則把生成的內核加入LLO中,不過在最初幾次編譯內核時不要使用此項,以免系統因生成的內核有故障而不能啟動。make bzImage用于生成超過1M文件大小的內核,makezImage生成小于1M的內核。內核文件是經過壓縮處理的。如果內核中使用了可裝卸的模塊,則需要依次運行以下指令: #make modules:編譯內核模塊。 #make modules_install:安裝內核模塊。 編譯后的內核文件存放在arch/i386/boot/目錄下。以下為一個內核編譯配置腳本,采用該腳本編譯的內核可運行于當前所有x86平臺,不具備網絡和串口支持,內核編譯后的大小在200K以內。 #基于x86體系結構 CONFIG_X86=y #是內核中最新功能(或處于實驗中的功能) 可用 CONFIG_EXPERIMENTAL=y #選擇處理器類型和數學處理器仿真 CONFIG_M386=y CONFIG_MATH_EMULATION=y #設置進程間通信協議 CONFIG_SYSVIPC=y CONFIG_SYSCTL=y #設置可支持的二進制文件格式 CONFIG_BINFMT_ELF=y #塊設備支持,CFC和DOC在此設置不同 #設置內核支持DE驅動器 CONFIG_BLK_DEV_DE=y CONFIG_BLK_DEV_DEDISK=y CONFIG_BLK_DEV_CMD640=y CONFIG_BLK_DEV_RZ1000=y CONFIG_BLK_DEV_DEPCI=y CONFIG_BLK_DEV_DEDMA=y CONFIG_IDEDMA_AUTO=y CONFIG_BLK_DEV_CS5530=y CONFIG_BLK_DEV_LOOP=y CONFIG_PARDE_PARPORT=y #字符設備設置 CONFIG_VT=y #文件系統設置 #支持/proc、ext2文件系統 CONFIG_PROC_FS=y CONFIG_EXT2_FS=y #支持字符型終端 CONFIG_VGA_CONSOLE=y 網絡與串口通信功能 Linux內核內置對網絡和串口的支持,具體到內核編譯,只要設置部分內核參數即可。以下是網絡設備的支持,需要注意的是其中PCI設備支持選項和以太網設備支持選項,如果選擇網卡,這兩類設備都必須被支持。網卡的驅動程序如果未包含到內核,則可以模塊形式加載。 CONFIG_NET=y CONFIG_PCI=y CONFIG_PCI_GOANY=y CONFIG_PCI_BIOS=y CONFIG_PCI_DIRECT=y CONFIG_PCI_QUIRKS=y CONFIG_PCI_OLD_PROC=y CONFIG_NETLINK=y CONFIG_INET=y CONFIG_NET_ETHERNET=y 以下是串口設置參數,如果單純支持兩個串口,則設置CONFIG_SERIAL項即可。在系統需要4個以上串口支持,或需要基于串口的終端控制時,需要設置余下3個參數。 CONFIG_SERIAL=y #CONFIG_SERIAL_CONSOLE #CONFIG_SERIAL_EXTENDED #CONFIG_SERIAL_NONSTANDARD 本項目中僅設置兩個串口支持。 文件系統定制 Linux操作系統為方便管理把外存抽象成一個可隨時訪問的塊,為方便管理和使用又在塊設備層上再作抽象,把塊設備抽象成為文件系統,由文件系統管理塊設備上的數據等,文件系統有很多種,不同文件系統有不同的管理方式,造成系統不兼容,為解決這個問題,在文件系統上又作一次抽象,提出了虛擬文件系統的概念。Linux虛擬文件系統為用戶提供了一個公共的接口,而不需要了解物理設備或邏輯系統的細節,系統允許系統管理員將在任何物理設備上的邏輯文件系統掛接在文件目錄中。 目錄結構 Linux文件系統符合FHS(Filesystem Hierarchy Standard)標準,由一些目錄和文件組成。根據安裝的方式不同,這些目錄可能是不同的文件系統。通常,一個系統可以有多個文件系統組成:根分區文件系統(/),和安裝在/usr下的文件系統,還有其他安裝在/home、/var文件系統。 Linux目錄結構起始與根目錄,其中包含以下目錄: /vmlinuz 內核文件,內核文件的位置可由系統引導程序指定。 /bin 包含系統可執行程序,可以在這個目錄下找到linux常用的命令。 /boot 存放系統啟動時所需的各項文件。 /dev 包含所有的設備文件,這些設備是和系統的硬件有一定相互對應關系的特殊文件,分為塊設備、字符設備和特殊設備,dev是設備(device)的英文縮寫。目錄中包含了所有Linux系統中使用的外部設備,但是這里并不是放的外部設備的驅動程序,它實際上是一個訪問這些外部設備的標識。在Linux系統中,對外部設備的訪問和訪問一個文件、一個目錄沒有任何區別。 /cdrom 用于將光驅文件系統加載到這個目錄下。 /etc Linux系統的絕大部分配置文件都存放在這里。比如網絡配置文件,文件系統,XWindow配置文件,設備配置信息,設置用戶信息等都在這個目錄下。 /sbin 存放系統程序。和/bin目錄類似,但這些文件往往是用來進行系統管理或提供系統服務的,一般只有root才有運行的權限。 /home 存放一般用戶個人目錄的主目錄,如果建立一個用戶,用戶名是“xx”,那么在/home目錄下就有一個對應的/home/xx路徑。 /lib 存放系統的各種庫文件,lib是庫(library)英文縮寫。這個目錄用來存放系統動態連接共享庫,采用動態鏈接編譯的應用程序都會用到這個目錄下的共享庫。 /lost+found 用于放置垃圾文件,這個目錄在大多數情況下都是空的。但是如果正在工作的計算機突然停電,或是沒有用正常方式關機,重新啟動機器的時候,有些文件就會找不到應該存放的地方,對于這些文件,系統將他們放在這個目錄下。 /mnt 為其他的文件系統提供安裝點,這個目錄在一般情況下也是空的。 /proc 一個虛擬的文件系統,系統啟動后從內存中建立,用于內存讀取數據。可以在這個目錄下獲取系統信息,這些信息是在內存中,由系統自己產生的。 /root 超級用戶的個人目錄,普通用戶沒有權限訪問。如果以超級用戶的身份登錄,這個就是超級用戶的主目錄。 /tmp 用來存放不同程序執行時產生的臨時文件,這些文件大都是程序運行時產生的,程序結束時自動刪除。 /usr 一般用戶程序安裝所在的目錄,用戶的很多應用程序和文件都存放在這個目錄下。 /var 保存大小和內容隨時改變的文件,通常各種系統日志文件放在這里。 在定制文件系統的過程中,目錄結構必須手工定制,以上描述的僅僅是根目錄下的目錄,在這些目錄下還有一些子目錄,而且不同的子目錄其設置也不同。以下程序可以建立一個完備的目錄結構,這個目錄結構完全符合FHS標準。 ROOT=目標系統路徑 cd$ROOT mkdir-pbin boot dev/ptsetc/opt home lib mntprocrootsbintmpvaropt&& for dirname in$ROOT/usr$ROOT/usr/ local do mkdir$dirname cd$dirname mkdir binetc include lib sbin share src ln-sshare/man ln-sshare/doc ln-sshare/info cd$dirname/share mkdir dict doc info locale mannls miscterm info zoneinfo cd$dirname/share/man mkdirman{1,2,3,4,5,6,7,8} done&& cd$ROOT/var&& mkdir-plock log mail run spool tmp opt cachelib/misclocal&& cd$ROOT/opt&& mkdir bin doc include info lib man && cd$ROOT/usr&& ln-s11/var/tmp cd$ROOT&& chmod0750root&& chmod1777tmpvar/tmp 文件系統 Linux采用虛擬文件系統(VFS)作為實際文件系統和操作系統之間的接口,將實際的文件系統和操作系統隔離開來。通過虛擬文件系統技術,Linux可以支持除EXT之外的許多文件系統類型。各文件系統為虛擬文件系統提供一致的接口,從而將不同文件系統的細節隱藏了起來。對操作系統的其他部分,以及運行在操作系統之上的程序而言,所有的文件系統都是一樣的。 本系統采用ext2磁盤文件系統格式,這是一種比較新的磁盤文件系統格式,在具體應用中也可以根據存儲空間的大小選擇FAT或minix等文件格式。 本系統定制后的目錄有:bin,boot,dev,etc, proc,root,sbin,usr。 /bin,/sbin目錄下是系統初始化與運行過程中必須用到的指令集合。 /boot目錄下是系統引導時用到的文件和內核文件,這些文件是通過內核定制得到的,包括:boot1b,bzImage,map。 /dev目錄下是設備文件。 /etc目錄下是系統配置文件,系統引導后執行的第一個配置文件inittab就在這個目錄下,了解和掌握這個配置文件是分析和掌握Linux系統的關鍵。 /proc目錄在系統啟動后被內核使用,系統啟動后該目錄是一個單獨的文件系統。 /root目錄是系統管理員的用戶根目錄. /usr目錄中存放用戶安裝的應用系統。 總結 嵌入式Linux技術在海洋自動觀測系統中的應用,可以進一步推進我國海洋自動觀測系統產權自主化的建設,增強系統安全性、大幅度提高系統性能,為應用軟件系統提供一個自主、安全、可靠、高效的運行平臺,提高系統間兼容、提高開發效率、縮短開發周期、增強可移植性,這一工作對完成當前國家海洋工作任務及未來我國海洋事業的發展意義深遠。基于PC/104平臺的Linux內核與文件系統定制,是進行面向海洋自動觀測系統嵌入式Linux系統研制工作的關鍵技術,是系統研制過程中的核心步驟。 |