




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、嵌入式linux啟動信息完全注釋 作者: 摘要我們在這里討論的是對嵌入式linux系統的啟動過程的輸出信息的注釋,通過我們的討論,大家會對嵌入式linux啟動過程中出現的、以前感覺熟悉的、但卻又似是而非的東西有一個確切的了解,并且能了解到這些輸出信息的來龍去脈。嵌入式linux的啟動信息是一個很值得我們去好好研究的東西,它能將一幅縮影圖呈現在我們面前,來指導我們更加深入地理解linux內核。關鍵字:linux,嵌入式,啟動,bootloader正文作為一名嵌入系統開發者,你一定遇到過下面的情景:在某論壇上看到一篇帖子,上面貼著嵌入式linux開發板
2、啟動時的有關信息,然后大家在帖子里討論著這個啟動過程中出現的問題,隨機舉例如下:Linux version 2.4.20-uc0 (rootLocal) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http:/f (uClinux XIP and shared lib patches from #20 三 6月 1 8 00:58:31 CST 2003 Processor: Samsung S3C4510B revision 6 Architecture: SNDS100 On node 0
3、totalpages: 4096 zone(0): 0 pages. zone(1): 4096 pages. zone(2): 0 pages. Kernel command line: root=/dev/rom0 Calibrating delay loop. 49.76 BogoMIPS Memory: 16MB = 16MB total Memory: 14348KB available (1615K code, 156K data, 40K init) Dentry cache hash table entries: 2048 (order: 2, 16384 bytes) Ino
4、de cache hash table entries: 1024 (order: 1, Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 4096 (order: 2, 16384 bytes) POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon S
5、wansea University Computer Society NET3.039 Initializing RT netlink socket Starting kswapd Samsung S3C4510 Serial driver version 0.9 (2001-12-27) with no serial options en abled ttyS00 at 0x3ffd000 (irq = 5) is a S3C4510B ttyS01 at 0x3ffe000 (irq = 7) is a S3C451 Blkmem copyright 1998,1999 D. Jeff D
6、ionne Blkmem copyright 1998 Kenneth Albanowski Blkmem 1 disk images: 0: BE558-1A5D57 VIRTUAL BE558-1A5D57 (RO) RAMDISK driver initialized: 16 RAM disks of 1024K size 1024 blocksize Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <.tw> eth0: 00:40:95:36:35:34 NET4: Linux
7、TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 1024 bind 1024) VFS: Mounted root (romfs Freeing init memory: 40K上面的這些輸出信息,也可能包括你自己正在做的嵌入式linux開發板的輸出信息,其中的每一行,每一個字的含義,你是否深究過,或者說大部分的含義你能確切地知道的?本人想在這里結合本人在
8、實踐中一些體會來和廣大嵌入式linux的開發者一起讀懂這些信息。我們在這里將以一個真實的嵌入式linux系統的啟動過程為例,來分析這些輸出信息。啟動信息的原始內容將用標記標出,以區別與注釋。嵌入式linux的啟動主要分為兩個階段: 第一部分bootloader啟動階段 第二部分linux 內核初始化和啟動階段第一節:start_kernel第二節:用戶模式( user_mode )開始,start_kernel結束第三節:加載linux內核完畢,轉入cpu_idle進程第一部分 : bootload
9、er啟動Boot loader v0.12NOTE: this boot loader is designed to boot kernels made with the2.4.xx releasesbootloader for XVBuilt at Nov 20 2005 10:12:35Bootloader頭信息,版本,編譯時間等,這個因不同的bootloader的設計而有所不同,由此你能看出bootloader的版本信息,有很多使用的是通用的bootloader,如u-boot,redboot等。Loaded to 0x90060000將bootloader加載到內存ram中的0x900
10、60000處,即將bootloader加載到內存的高端地址處。Linux內核將被bootloader加載到0x90090000處。Found boot configuration查找到了啟動boot的配置信息Booted from parallel flash從flash中啟動代碼,此處的flash為并行閃存。Flash的分類列舉如下:閃存分三類:并行,串行,不可擦除。并行Parallel flash?NOR Flash,Intel于1988年發明隨機讀取的速度比較快,隨機按字節寫,每次可以傳輸8Bit。一般適合應用于數據/程序的存貯應用中NOR還可以片內執行(execute-in-place
11、)XIP寫入和擦除速度很低。?NAND Flash,1989年,東芝公司發明是以塊和頁為單位來讀寫的,不能隨機訪問某個指定的點.因而相對來說讀取速度較慢,而擦除和寫入的速度則比較快,每次可以傳輸16Bit,一般適用在大容量的多媒體應用中,容量大。如:CF,SM.串行Serial Flash 是以字節進行傳輸的,每次可以傳輸1-2Bit.如:MMC,SD,MS卡串行閃存器件體積小,引腳也少,成本相對也更低廉。?不可擦除Mask Rom Flash的特點是一次性錄入數據,具有不可更改性,經常運用于游戲和需版權保護文件等的錄入。其顯著特點是成本低。 注意:任何flash器件的寫入操作只能在空或已擦除
12、的單元內進行,所以大多數情況下,在進行寫入操作之前必須先執行擦除。NAND器件執行擦除操作是十分簡單的,而NOR則要求在進行擦除前先要將目標塊內所有的位都寫為0。從上面的信息,我們可以對flash類型特點有個比較明確的了解。CPU clock rate: 200 MHz開發板上所使用的CPU的主頻為200MHZDRAM size is 128MB (128MB/0MB)動態內存ram大小為128M。這里我們列舉一下內存的類型及工作原理。根據內存的工作原理可以劃分出兩種內存:DRAM和SRAMDRAM表示動態隨機存取存儲器。這是一種以電荷形式進行存儲的半導體存儲器。DRAM中的每個存儲單元由一個
13、晶體管和一個電容器組成。數據存儲在電容器中。電容器會由于漏電而導致電荷丟失,因而DRAM器件是不穩定的。為了將數據保存在存儲器中,DRAM器件必須有規律地進行刷新。 SRAM是靜態的,因此只要供電它就會保持一個值。一般而言,SRAM 比DRAM要快,這是因為SRAM沒有刷新周期。每個SRAM存儲單元由6個晶體管組成,而DRAM存儲單元由一個晶體管和一個電容器組成。相比而言,DRAM比SRAM每個存儲單元的成本要高。照此推理,可以斷定在給定的固定區域內DRAM的密度比SRAM 的密度要大。 SRAM常常用于高速緩沖存儲器,因為它有更高的速率;而DRAM常常用于PC中的主存儲器,因為其擁有更高的密
14、度。 在嵌入式系統中使用DRAM內存的設計比較廣泛。地址輔助說明:先說明一下內存地址數字情況,主要是為了方便記憶。可以訪問的內存為4G。0x40000000是1GB處;0x00040000是256K處,0x00020000是128K處,0x90000000是2GB多的地方。1M->0x00100000, 2M->0x00200000,8M->0x0080000016M->0x01000000, 32M->0x02000000256M->0x1000000064K->0x000100004K->0x00001000這個是個快速記憶的方法,你可以根據
15、地址中1的位置和其后0的個數來快速知道換算后的地址是在多少兆的地方。比如,1的后面5個0,代表1M的大小,6個0,代表16M,以此類推。ROMFS found at 0x46040000, Volume name = rom 43f291aaromfs,只讀文件系統所在的地址為:0x46040000 (flash映射后的第3分區)。卷名為rom。romfs和rootfs概念上有所區別。flash在內存中的的起始地址為0x46000000,而ROMFS在flash分區上的起始位置為0x00040000,所以ROMFS在內存地址中的位置就為0x46040000。這個細節的部分可以參考flash分區
16、時的地方,Creating 3 MTD partitions。romfs中包括kernel和app應用,不包括bootloader和firmware信息頭。romfs只讀文件系統里的內容有很多種分類方法,我們可以將kernel和app同時放里面,作為根文件系統下的一個文件,也可以在flash上另外劃分區域來分別存放。VFS虛擬文件系統交換器在linux系統中,目前已經開發出多種文件系統,那么如何讓這些文件系統能共存在一個系統中呢,從linux 2.0開始,引入了虛擬文件系統管理器 VFS的概念。Linux 下的文件系統主要可分為三大塊: 一是上層
17、的文件系統的系統調用, 二是虛擬文件系統交換器 VFS(Virtual Filesystem Switch), 三是掛載到 VFS 中的各實際文件系統,例如 ext2,jffs 等。VFS的確切叫法是Virtual Filesystem Switch虛擬文件系統交換器,這里的VFS中的“S”是指的switch,這個需要強調一下的,它很容易被混淆成“system”,如果理解成“system”將是不正確的,請多加注意。VFS是具體文件系統filesystem的一個管理器。VFS是Linux內核中的一個軟
18、件層,一種軟件機制,它也提供了內核中的一個抽象功能,允許不同的文件系統共存,可以稱它為 Linux 的文件系統管理者,與它相關的數據結構只存在于物理內存當中。所以在每次系統初始化期間,Linux 都首先要在內存當中構造一棵 VFS 的目錄樹。VFS 中的各目錄其主要用途是用來提供實際文件系統的掛載點。而rootfs將是這個目錄樹的根結點的(root),即 "/"目錄,VFS的結構就是從這個rootfs開始的。有了VFS,那么對文件的操作將使用統一的接口,將來通過文件系統調用對 VFS 發起的文件操作等指令將被 rootfs 文件系統中相應的函數接口所接管。注意:rootfs
19、并不是一個具體的文件系統類型,如jffs。它只是一個理論上的概念。在具體的嵌入系統實例中,可以將某種具體的文件系統設置為根文件系統rootfs,如我們可以設置romfs為根文件系統,也可以設置jffs為根文件系統。這里的ROMFS只讀文件系統只是一種具體的文件系統類型,也是在嵌入系統中經常使用到的類型。看完了上面的內容,以后你對出現的類似“kernel Panic:VFS:Unable to mount root fs on 0:00”的含義應該已經了解了。其中“VFS:”就是虛擬文件系統管理器操作時的輸出信息了。File linux.bin.gz foundlinux kernel內核文件名
20、,它是在只讀文件系統romfs上的一個組成部分。Unzipping image from 0x4639DE60 to 0x90090000, size = 1316021將romfs中的linux kernel解壓縮到0x90090000,之后會從這個內存地址啟動內核。romfs為壓縮格式文件,使用壓縮的只讀文件系統,是為了保持制作出來的整個系統所占用的flash空間減小。這個內核的大小為1.3M左右,這也是目前大多數嵌入系統所使用的方法。Inptr = 0x00000014(20)Inflating.釋放,解壓中。(變大,充氣, 膨脹)Outcnt = 0x0030e7c8(3205064)
21、Final Inptr = 0x001414ad(1316013)Original CRC = 0xcbd73adbComputed CRC = 0xcbd73adb做釋放后的CRC檢查Boot kernel at 0x90090000 with ROMFS at 0x46040000kernel已經被從romfs中釋放到內存地址0x90090000處,可以跳轉到此處啟動kernel了,這里是指定的kernel的起始地址Press 'enter' to boot系統等待啟動,后面將看到linux kernel的啟動過程了。第二部分 : linux內核初始化以及啟動第一節:sta
22、rt_kernelLinux的源代碼可以從得到,或者你可以查看linux代碼交叉引用網站:進行在線的代碼查看,這是一個很好的工具網站。在start_kernel中將調用到大量的init函數,來完成內核的各種初始化。如:page_address_init();sched_init();page_alloc_init();init_IRQ();softirq_init();console_init();calibrate_delay();vfs_caches_init(num_physpages);rest_init();具體內容可以參考Linux version 2.4.22-uc0 (root
23、local) (gcc version 2.95.3 20010315 (release) #33 .?1. 20 12:09:106上面的代碼輸出信息,是跟蹤linux代碼分析后得到的,進入init目錄下的main.c的start_kernel啟動函數.嵌入式linux使用的是linux內核版本為linux source code代碼中start_kernel中輸出的linux_banner信息。這個信息是每個linux kernel都會打印一下的信息,如果你沒有把這句去掉的話。Found bootloader memory map at 0x10000fc0.bootloader經過內存映
24、射后的地址為:0x10000fc0, 按上面的地址換算方法,1后面有7個0,那么虛擬地址256M左右處。Processor: ARM pt110 revision 0pT110是ARM微處理器arm核的一種,另一種為pT100。此處為顯示ARM的類型。On node 0 totalpages: 20480zone(0): 20480 pages.zone(0): Set minimum memory threshold to 12288KBWarning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)zone(1): 0 p
25、ages.zone(2): 0 pages.預留內存大小,在節點0上總共20頁, zone(0) 設置最小內存為12MB, zone(1)和zone(2)為0頁。警告:對齊不正確Kernel command line: root=/dev/mtdblock3Kernel 啟動命令設為:/dev/mtdblock3(在后面的說明中會看到mtdblock3是指的flash上的romfs分區。),用來指定根文件系統所在的位置,kernel會將塊設備mtdblock3當作文件系統來處理。也就是說,內核會根據上面的kernel命令行,知道只讀文件系統romfs將是根文件系統rootfs。start_ke
26、rnel(void)中輸出的上面的這句信息。這行命令是在linux內核啟動過程中都會輸出的一句。Console: colour dummy device 80x30代碼中console_init()的輸出信息, 顯示控制臺屬性:一般使用VGA text console,標準是80 X 25行列的文本控制臺,這里是對屬性進行了設置。serial_xx: setup_console 115串口設置值為115200,此為波特率輸出信息。對串口設置的信息做一個打印的動作,在調試時會非常有用。Calibrating delay loop. 82.94 BogoMIPSCalibrate:校準, 進入時延
27、校準循環。檢查CPU的MIPS(每秒百萬條指令),Bogo是Bogus(偽)的意思。這里是對CPU進行一個實時測試,來得到一個大體的MIPS數值Bogomips,是由linus Torvalds寫的, 是Linux操作系統中衡量計算機處理器運行速度的一種尺度。提供這種度量的程序被稱為BogoMips,當啟動計算機時,BogoMips能顯示系統選項是否處于最佳性能。linux內核中有一個函數calibrate_delay(),它可以計算出cpu在一秒鐘內執行了多少次一個極短的循環,計算出來的值經過處理后得到BogoMIPS值你可以將計算機的bogomips與計算機處理器的bogomips進行比較
28、。Torvalds稱這個程序為BogoMips來暗示兩臺計算機間的性能度量是錯誤的,因為并非所有起作用因素都能被顯示出來或被認可。盡管計算機基準中經常用到MIPS,但環境的變化容易導致度量的錯誤。Bogomips能測出一秒鐘內某程序運行了多少次。察看/proc/cpuinfo文件中的最后一行也能得到這個數值。上面這個輸出,在所有的linux系統啟動中都會打印出來。進入內存初始化mem_init(void), arch/i386/mm/init.c Memory: 80MB = 80MB totalMemory: 76592KB available (1724K code, 2565K data
29、, 72K init)當前內存使用情況,將列出總的內存大小, 及分配給內核的內存大小:包括代碼部分,數據部分,初始化部分,總共剛好4M。請留意此處的內核的內存大小的各個值。進入虛擬文件系統VFS初始化vfs_caches_init()Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)Inode cache hash table entries: 8192 (order: 4, 65536 bytes)Mount cache hash table entries: 512 (order: 0, 4096 bytes)Bu
30、ffer cache hash table entries: 4096 (order: 2, 16384 bytes)Page-cache hash table entries: 32768 (order: 5, 131072 bytes)名詞: Dentry:目錄數據結構 Inode:i節點 Mount cache:文件系統加載緩沖 buffer cache:內存緩沖區
31、; Page Cache:頁緩沖區Dentry目錄數據結構(目錄入口緩存),提供了一個將路徑名轉化為特定的dentry的一個快的查找機制,Dentry只存在于RAM中;i節點(inode)數據結構存放磁盤上的一個文件或目錄的信息,i節點存在于磁盤驅動器上;存在于RAM中的i節點就是VFS的i節點,dentry所包含的指針指向的就是它;buffer cache內存緩沖區,類似kupdated,用來在內存與磁盤間做緩沖處理;Page Cache 用來加快對磁盤上映像和數據的訪問。在內存中建立各個緩沖hash表,為kernel對文件系統的訪問做準備。VFS(virtual filesys
32、tem switch)虛擬文件切換目錄樹有用到類似這樣的結構表。上面的輸出信息,在一般的linux啟動過程中都會看到。POSIX conformance testing by UNIFIXconformance:順應, 一致。即POSIX適應性檢測。UNIFIX是一家德國的技術公司,Linux 原本要基于 POSIX.1 的, 但是 POSIX 不是免費的, 而且 POSIX.1 證書相當昂貴. 這使得 Linux 基于 POSIX 開發相當困難. Unifix公司(Braunschweig, 德國) 開發了一個獲得了 FIPS 151-2 證書的 Linux 系統. 這種技術用于 Unifi
33、x 的發行版 Unifix Linux 2.0 和 Lasermoon 的 Linux-FT。在2.6的內核中就將上面的這句輸出給拿掉了。第二節:用戶模式( user_mode )開始,start_kernel結束PCI: bus0: Fast back to back transfers disabledPCI: Configured XX as a PCI slave with 128MB PCI memoryPCI: Each Region size is 16384KBPCI: Reserved memory from 0x10080000 to 0x15080000 for DMA
34、and mapped to 0x12000000設備的初始化 init()->do_basic_init()->pci_init(),初始化PCI,檢測系統的PCI設備。Linux NET4.0 for Linux 2.4Based upon Swansea University Computer Society NET3.039英國威爾士,斯旺西大學的NET3.039, TCP/IP 協議棧此信息,在linux啟動過程中都會出現。Initializing RT netlink socket對Socket的初始化,socket_init(),Netlink 一種路由器管理協議,Ro
35、uting netlink socket interface: protocol independent part。 其中RT是route路由的意思。這句輸出是在create產生rtnetlink的socket套接字時的一個調試輸出。)此信息,在linux啟動過程中都會出現。Starting kswapd啟動交換守護進程kswapd,進程IO操作例程kpiodkswapd可以配合kpiod運行。進程有時候無事可做,當它運行時也不一定需要把其所有的代碼和數據都放在內存中。這就意味著我們可以通過把運行中程序不用的內容切換到交換分區來更好的是利用內存。大約每隔1秒,kswapd醒來并檢查內存情況。如
36、果在硬盤的東西要讀入內存,或者內存可用空間不足,kpiod就會被調用來做移入/移出操作。kswapd負責檢查,kpiod負責移動。Journalled Block Device driver loaded加載日志塊設備驅動。日志塊設備是用來對文件系統進行日志記錄的一個塊設備。日志文件系統是在傳統文件系統的基礎上,加入文件系統更改的日志記錄。它的設計思想是:跟蹤記錄文件系統的變化,并將變化內容記錄入日志。日志文件系統在磁盤分區中保存有日志記錄,寫操作首先是對記錄文件進行操作,若整個寫操作由于某種原因(如系統掉電)而中斷,系統重啟時,會根據日志記錄來恢復中斷前的寫操作。在日志文件系統中,所有的文件
37、系統的變化都被記錄到日志,每隔一定時間,文件系統會將更新后的元數據及文件內容寫入磁盤。在對元數據做任何改變以前,文件系統驅動程序會向日志中寫入一個條目,這個條目描述了它將要做些什么,然后它修改元數據。devfs: v1.12c (20020818) Richard Gooch (rgoochatnf.csiro.au)devfs: boot_options: 0x1Devfs模塊的輸出信息。設備文件系統devfs,版本1.12c,pty: 256 Unix98 ptys configuredPty模塊的輸出信息,與控制臺操作有關的設置。將通過 devpts 文件系統使用 Unix98 PTYs
38、,(Pseudo-ttys (telnet etc) device是偽ttys設備的縮寫。 TTY(/dev/tty)是TeleTYpe的一個老縮寫,為用戶輸入提供不同控制臺的設備驅動程序。它的名字來源于實際掛接到 UNIX系統的、被稱為電傳打字機(teletype)的終端。在Linux下,這些文件提供對虛擬控制臺的支持,可以通過按Alt-F1到Alt-F6鍵來訪問這些虛擬控制臺。這些虛擬控制臺提供獨立的、同時進行的本地登錄對話過程
39、0; ttys(/dev/ttys)是計算機終端的串行接口。/dev/ttyS0對應MS-DOS下的 COM1。使用 make dev腳本MAKEDEV來建立pty文件。這樣系統內核就支持Unix98風格的pty了。在進行Telnet登錄時將要用到/dev/pty設備。 pty是偽終端設備,在遠程登錄等需要以終端方式進行連接,但又并非真實終端的應用程序中必須使用這種設備,如telnet或xterm等程序。Linux 2.2以后增添了UNIX98風格的P
40、ty設備,它使用一個新的文件系統(devpts針對偽終端的文件系統)和一個克隆的設備cloning device來實現其功能。在devfs_mk_dir (NULL, "pts", NULL);時會輸出上面的信息。loop: loaded (max 8 devices)加載返還塊設備驅動,最多支持8個設備8139too Fast Ethernet driver 0.9.27eth0: RealTek RTL8139 at 0x60112000, 00:10:0d:42:a0:03, IRQ 14eth0: Identified 8139 chip type 'RTL
41、-8100B/8139D'網卡驅動,基地址為:0x60112000, MAC地址:00:10:0d:42:a0:03, 中斷號:14RTL8139 的接收路徑設計成一個環形緩沖區(一段線性的內存,映射成一個環形內存)。當設備接收到數據時,數據的內容就保存在這個環形緩沖區內并更新下個存儲數據的地址(第一個數據包的開始地址第一個數據包的長度)。設備會一直保留緩沖區內的數據直到整個緩沖區耗盡。這樣,設備會再次重寫緩沖區內起始位置的內容,就像一個環那樣。從 2.2 版內核升級到 2.4 版時, RTL-8139 支持模塊已不再叫 rtl8139,而叫它 8139too,現在你再看到8139to
42、o就不會不明白它的來由了吧。SCSI subsystem driver Revision: 1.00USB設備信息,USB會被當做SCSI來處理。mumk_register_tasklet: (1) tasklet 0x905bf9c0 status 0x9025e974軟中斷信息輸出。Tasklet是在2.4中才出現,它是為了更好地利用多CPU。Probing XX Flash Memory探測 XX的閃存(Flash Memory),"NOR NAND Flash Memory Technology"Amd/Fujitsu Extended Query Table v1
43、.3 at 0x0040number of CFI chips: 1AMD與富士通合資設立的Flash供貨商Spansion。AMD因獲利不佳,已經退出Flash市場,后續由Spansion合資公司經營.主要生產NOR類型的flash,特點是容量小,速度快。Spansion商標的flash,在我們開發中會經常看到。以后大家看到Spansion的芯片,就能了解到它和AMD還有富士通的來龍去脈了。Common flash Interface (CFI)是指一個統一的flash訪問接口,表示這種flash是這種接口類型的。Using buffer write method使用flash寫緩沖方式fl
44、ash提供了寫BUFFER的命令來加快對flash上塊的操作。對Flash擦除和寫數據是很慢的。如果用寫BUFFER的命令會快一點。據手冊上說,會快20倍。Buffer Size :5 bytes的buffer緩沖不是每個塊都有,是整個flash只有一個5 bytes的buffer,用寫BUFFER命令對所有的塊進行寫操作,都要用同一個buffer,寫Buffer是主要檢查buffer是否available,其實buffer起緩沖作用,來提高工作效率。比如某flash有128個128K字節塊。允許用戶對任意塊進行字節編程和寫緩沖器字節編程操作,每字節編程時間為210s;若采用寫緩沖器字節編程方
45、式,32字節編程共需218s,每字節編程時間僅為6.8s。芯片的塊擦除時間為1s,允許在編程或塊擦除操作的同時進行懸掛中斷去進行讀操作,待讀操作完成后,寫入懸掛恢復命令,再繼續編程或塊擦除。Creating 3 MTD partitions on "XX mapped flash":0x00000000-0x00020000 : "BootLoader"0x00020000-0x00040000 : "Config"0x00040000-0x01000000 : "Romfs"此處為重要信息部分,需要特別留意。在內
46、存中映射過的flash,創建三個MTD分區:flash上的內容將被映射到內存中的對應地址前128K為BootLoader->0x00000000-0x00020000接著的128K為系統配置信息Config存放的位置->0x00020000-0x00040000再后面的 16M - 2X128K 為romfs的存放處.->0x00040000-0x01000000上面的內容,大家可以根據前面的換算公式得到。A> 編譯的bootloader一般大小約50K左右;B> 在此處就知道了配置信息config是放在第2分區中的;C> 制作的romfs的大小,一般為8M
47、或10M左右,所以能放得下;嵌入式Linux內核的塊設備驅動:對于linux 的根文件系統,目前有三種塊設備的驅動可以選擇,它們分別是:a) Blkmem 驅動 b) MTD 驅動 c) RAM disk 驅動 Blkmem 驅動是專門為嵌入式linux 開發的一種塊設備驅動,它是嵌入式linux系統中最為古老和通用的塊設備驅動。它原理相對簡單但是配置比較復雜,需要根據你即的Flash的分區使用情況來修改代碼。當然修改的結果是它可以對一些NOR型的Flash進行讀寫操作。不過目前支持的Flash類型不夠多。如果新加入對一種Flash的支持需要作的工作量比較大。Linux的MTD驅動是標準Lin
48、ux的Flash驅動。它支持大量的設備,有足夠的功能來定義Flash的分區,進行地址映射等等。使用MTD你可以在一個系統中使用不同類型的Flash。它可以將不同的Flash組合成一個線性的地址讓你來使用。在標準的Linux 2.4內核中MTD有一系列的選項,你可以根據個人系統的需要來選擇,定制。另外一種選擇就是RAM disk 驅動。在PC上它經常用于沒有硬盤的Linux的啟動過程。它和Flash沒有直接的關系。不過當Flash上啟動的是經過壓縮的內核時。RAM disk 可以作為根文件系統。MTD 驅動提供了對Flash強大的支持,你通過它甚至可以在Flash上運行一個可以讀寫的真正的文件系
49、統,比如JFFS2。而Blkmem驅動則望塵莫及。NET4: Linux TCP/IP 1.0 for NET4.0調用時的輸出信息, 在啟動過程中被socket.c調用到。IP Protocols: ICMP, UDP, TCP, IGMP列出可以支持的IP協議,此處為kernel源代碼inet_add_protocol(p);的輸出。在linux啟動過程中,都會看到這句的輸出。IP: routing cache hash table of 512 buckets, 4KbytesIP路由代碼的輸出信息。Route.c ,Set the IP module up,路由緩沖hash表TCP:
50、Hash tables configured (established 8192 bind 8192)TCP協議初始化輸出信息。NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.UNIX網絡協議信息。多種連接的一種(IPv4, UNIXdomain sockets, IPv6和IrDA). SMP對稱多處理器Symmetrical MultiProcessing,這里主要是指UNIX的一些網絡協議上面的關于網絡的輸出信息是在linux啟動信息中都會出現的。加載各種文件系統cramfs: wrong magic會出現“cramfs: wrong
51、 magic”,別擔心這沒有什么害處,這個是kernel的書寫bug,在2.6中有修改之,它是一個警告信息,用來檢查cramfs的superblock超級塊的。superblock也是VFS要用到的數據結構。代碼:2.4cramfs_read_super(。)/* Do sanity checks on the superblock */if (super.magic != CRAMFS_MAGIC) /* check at 512 byte offset */memcpy(&super, cramfs_read(sb, 512, sizeof(super), sizeof(super
52、);if (super.magic != CRAMFS_MAGIC) printk(KERN_ERR "cramfs: wrong magic ");goto out;2.6if (super.magic != CRAMFS_MAGIC) if (!silent) printk(KERN_ERR "cramfs: wrong magic "); goto out; 超級塊是文件系統的“頭部”。它包含文件系統的狀態、尺寸和空閑磁盤塊等信息。如果損壞了一個文件系統的超級塊(例如不小心直接將數據寫到了文件系統的超級塊分區中),那么系統可能會完全不識別該文件系統
53、,這樣也就不能安裝它了,即使采用e2fsck 命令也不能處理這個問題。Cramfs文件系統:cramfs 是 Linus Torvalds 本人開發的一個適用于嵌入式系統的小文件系統。由于它是只讀的,所以,雖然它采取了 zlib 做壓縮,但是它還是可以做到高效的隨機讀取。 cramfs 不會影響系統讀取文件的速度,又是一個高度壓縮的文件系統。我們制作image文件之后,我們還要考慮怎樣才能在系統運行的時候,把這個 image 文件 mount 上來,成為一個可用的文件系統。由于這個 image 文件不是一個通常意義上的 block 設備,我們必須采用 loopback 設備來完成這一任務,如:
54、mount -o loop -t cramfs /usr.img /usr這樣,就可以經由 loopback 設備,把 usr.img 這個 cramfs 的 image 文件 mount 到 /usr 目錄上去了。內核中需要對loopback這個設備的支持。cramfs 的壓縮效率一般都能達到將近 50%。Cramfs通過優化索引節點表的尺寸和除去傳統文件系統中文件之間的空間浪費來達到節約空間的目的。它還使用了zlib壓縮,實現優于2:1的壓縮比例。解壓縮過程的系統開銷并不是很大,因為Cramfs支持指定單塊的解壓,而并不必解壓縮整個文件。Cramfs不僅能節省空間,還能避免非正常關機導致的
55、等待fsck或手工進行fsck的麻煩。它通過只讀的方式達到這一目的。RamDisk有三種實現方式:在Linux中可以將一部分內存mount為分區來使用,通常稱之為RamDisk,分為:Ramdisk, ramfs, tmpfs. 第一種就是傳統意義上的,可以格式化,然后加載。這在Linux內核2.0/2.2就已經支持,其不足之處是大小固定,之后不能改變。為了能夠使用Ramdisk,我們在編譯內核時須將block device中的Ramdisk支持選上,它下面還有兩個選項,一個是設定Ramdisk的大小,默認是4096k;另一個是initrd的支持。如果對Ramdisk的支持已經編譯進內核,我們
56、就可以使用它了:首先查看一下可用的RamDisk,使用ls /dev/ram*首先創建一個目錄,比如test,運行mkdir /mnt/test;然后對/dev/ram0 創建文件系統,運行mke2fs /dev/ram0;最后掛載 /dev/ram0,運行mount /dev/ram /mnt/test,就可以象對普通硬盤一樣對它進行操作了。 另兩種則是內核2.4才支持的,通過Ramfs或者Tmpfs來實現:它們不需經過格式化,用起來靈活,其大小隨所需要的空間而增加或減少。Ramfs顧名思義是內存文件系統,它處于虛擬文件系統(VFS)層,而不像ramdisk那樣基于虛擬在內存中的其他文件系統
57、(ex2fs)。因而,它無需格式化,可以創建多個,只要內存足夠,在創建時可以指定其最大能使用的內存大小。如果你的Linux已經將Ramfs編譯進內核,你就可以很容易地使用Ramfs了。創建一個目錄,加載Ramfs到該目錄即可:# mkdir /testRam # mount -t ramfs none /testRAM缺省情況下,Ramfs被限制最多可使用內存大小的一半。可以通過maxsize(以kbyte為單位)選項來改變。 # mount -t ramfs none /testRAM -o maxsize=2000 (創建了一個限定最大使用內存為2M的ramdisk) Tmpfs是一個虛擬
58、內存文件系統,它不同于傳統的用塊設備形式來實現的Ramdisk,也不同于針對物理內存的Ramfs。Tmpfs可以使用物理內存,也可以使用交換分區。在Linux內核中,虛擬內存資源由物理內存(RAM)和交換分區組成,這些資源是由內核中的虛擬內存子系統來負責分配和管理。Tmpfs向虛擬內存子系統請求頁來存儲文件,它同Linux的其它請求頁的部分一樣,不知道分配給自己的頁是在內存中還是在交換分區中。同Ramfs一樣,其大小也不是固定的,而是隨著所需要的空間而動態的增減。使用tmpfs,首先你編譯內核時得選擇"虛擬內存文件系統支持(Virtual memory filesystem support)" 。然后就可以加載tmpfs文件系統了:# mkdir -p /mnt/tmpfs# mount tmpfs /mnt/tmp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 影視設備智能穿戴設備集成考核試卷
- 石墨在微波吸收材料的研究考核試卷
- 森林保護與青少年素質教育考核試卷
- 生活的苦與樂初三語文作文
- 朋友初三語文作文
- 河南省洛陽市老城區三校聯考2023-2024學年八年級下學期7月期末考試數學試卷(含答案)
- 橋梁施工技術與質量控制考核試卷
- 紙質航空航天材料研發與性能評價考核試卷
- 玩具企業的產品線拓展與市場定位考核試卷
- 等離子體刻蝕設備的安全控制考核試卷
- 比例尺單元測試卷及答案
- 北京市朝陽區2025屆高三下學期一模試題 數學 含答案
- 食品工廠5S管理
- 運輸公司安全管理制度
- 2025屆吉林省長春市高三下學期4月三模政治試題(原卷版+解析版)
- 2025屆江蘇省揚州市中考一模語文試題(含答案)
- 2025年河北省唐山市中考一模道德與法治試題(含答案)
- 2025年一級注冊計量師考試題庫大全及答案
- 衛生院全國預防接種日宣傳活動總結(8篇)
- 2024國家電投集團中國電力招聘(22人)筆試參考題庫附帶答案詳解
- 大數據在展覽中的應用-全面剖析
評論
0/150
提交評論