在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(); |
具體內容可以參考[http://lxr.linux.no/source/init/main.c]
Linux version 2.4.22-uc0 (root@local) (gcc version 2.95.3 20010315 (release)) #33 .?1.. 20 12:09:106 |
上面的代碼輸出信息,是跟蹤linux代碼分析后得到的,進入init目錄下的main.c的start_kernel啟動函數.
嵌入式linux使用的是linux內核版本為2.4.22
linux source code代碼中start_kernel中輸出的linux_banner信息。這個信息是每個linux kernel都會打印一下的信息,如果你沒有把這句去掉的話。
Found bootloader memory map at 0x10000fc0. |
bootloader經過內存映射后的地址為:0x10000fc0, 按上面的地址換算方法,1后面有7個0,那么虛擬地址256M左右處。
Processor: ARM pt110 revision 0 |
pT110是ARM微處理器arm核的一種,另一種為pT100。此處為顯示ARM的類型。
On node 0 totalpages: 20480 zone(0): 20480 pages. zone(0): Set minimum memory threshold to 12288KB Warning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000) zone(1): 0 pages. zone(2): 0 pages. |
預留內存大小,在節點0上總共20頁, zone(0) 設置小內存為12MB, zone(1)和zone(2)為0頁。警告:對齊不正確
Kernel command line: root=/dev/mtdblock3 |
Kernel 啟動命令設為:/dev/mtdblock3(在后面的說明中會看到mtdblock3是指的flash上的romfs分區。),用來指定根文件系統所在的位置,kernel會將塊設備mtdblock3當作文件系統來處理。
也就是說,內核會根據上面的kernel命令行,知道只讀文件系統romfs將是根文件系統rootfs。
start_kernel(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 BogoMIPS |
Calibrate:校準, 進入時延校準循環。檢查CPU的MIPS(每秒百萬條指令),Bogo是Bogus(偽)的意思。這里是對CPU進行一個實時測試,來得到一個大體的MIPS數值
Bogomips,是由linus Torvalds寫的, 是Linux操作系統中衡量計算機處理器運行速度的一種尺度。提供這種度量的程序被稱為BogoMips,當啟動計算機時,BogoMips能顯示系統選項是否處于性能。
linux內核中有一個函數calibrate_delay(),它可以計算出cpu在一秒鐘內執行了多少次一個極短的循環,計算出來的值經過處理后得到BogoMIPS值
你可以將計算機的bogomips與計算機處理器的bogomips進行比較。Torvalds稱這個程序為BogoMips來暗示兩臺計算機間的性能度量是錯誤的,因為并非所有起作用因素都能被顯示出來或被認可。盡管計算機基準中經常用到MIPS,但環境的變化容易導致度量的錯誤。Bogomips能測出一秒鐘內某程序運行了多少次。
察看/proc/cpuinfo文件中的一行也能得到這個數值。
上面這個輸出,在所有的linux系統啟動中都會打印出來。
進入內存初始化
mem_init(void), [arch/i386/mm/init.c] Memory: 80MB = 80MB total Memory: 76592KB available (1724K code, 2565K data, 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) Buffer 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:內存緩沖區
?、?Page Cache:頁緩沖區
Dentry目錄數據結構(目錄入口緩存),提供了一個將路徑名轉化為特定的dentry的一個快的查找機制,Dentry只存在于RAM中;
i節點(inode)數據結構存放磁盤上的一個文件或目錄的信息,i節點存在于磁盤驅動器上;存在于RAM中的i節點就是VFS的i節點,dentry所包含的指針指向的就是它;
buffer cache內存緩沖區,類似kupdated,用來在內存與磁盤間做緩沖處理;
Page Cache 用來加快對磁盤上映像和數據的訪問。
在內存中建立各個緩沖hash表,為kernel對文件系統的訪問做準備。
VFS(virtual filesystem switch)虛擬文件切換目錄樹有用到類似這樣的結構表。
上面的輸出信息,在一般的linux啟動過程中都會看到。
POSIX conformance testing by UNIFIX
conformance:順應, 一致。即POSIX適應性檢測。UNIFIX是一家德國的技術公司,Linux 原本要基于 POSIX.1 的, 但是 POSIX 不是免費的, 而且 POSIX.1 證書相當昂貴. 這使得 Linux 基于 POSIX 開發相當困難. Unifix公司(Braunschweig, 德國) 開發了一個獲得了 FIPS 151-2 證書的 Linux 系統. 這種技術用于 Unifix 的發行版 Unifix Linux 2.0 和 Lasermoon 的 Linux-FT。
在2.6的內核中就將上面的這句輸出給拿掉了。