常用的內核啟動參數
Linux的內核參數是以空格分開的一個字符串列表,通常具有如下形式:
name[=value_1][,value_2]。。。[,value_10]
比如你在啟動時設置參數name=a,b,c,d,內核搜索bootsetups數組,如果發現“name”已注冊,則調用“name”的設置函數如name_setup(),并把a,b,c,d傳遞給name_setup()執行。
所有型如“name=value”參數,如果沒有被上面所述的設置函數接收,將被解釋為系統啟動后的環境變量,比如“TERM=vt100”就會被作為一個啟動時參數。
所有沒有被內核設置函數接收也沒又被設置成環境變量的參數都將留給init進程處理,比如“single”。
1、init=。。。
設置內核執行的初始化進程名,如果該項沒有設置,內核會按順序嘗試/etc/init,
/bin/init,/sbin/init, /bin/sh,如果所有的都沒找到,內核會拋出 kernel panic:的錯誤。
2、nfsaddrs=。。。
設置從網絡啟動時NFS的啟動地址,已字符串的形式給出。
3、nfsroot=。。。
設置網絡啟動時的NFS根名字,如果該字符串不是以 “/”、“,”、“?!遍_始,默認指向“/tftp-boot”。
以上2、3在無盤站中很有用處。
4、no-hlt
該選項僅當定義了CONFIG_BUGi386時才能用,一些早期的i486DX-100芯片在處理“hlt”指令時會有問題,執行該指令后不能可靠的返回操作系統,使用該選項,可以讓linux系統在CPU空閑的時候不要掛起CPU。
5、root=。。。
該參數告訴內核啟動時使用哪個設備作為根文件系統。比如可以指定根文件為hda8:root=/dev/hda8。
6、ro和rw
ro參數告訴內核以只讀方式加載根文件系統,以便進行文件系統完整性檢查,比如運行fsck;rw參數告訴內核以讀寫方式加載根文件系統,這是默認值。
7、reserve=。。。
保留端口號。格式:reserve=iobase,extent[,iobase,extent]。。。,用來保護一定區域的I/O端口不被設備驅動程序自動探測。在某些機器上,自動探測會失敗,或者設備探測錯誤或者不想讓內核初始化設備時會用到該參數;比如: reserve=0x300,32 device=0x300,除device=0x300外所有設備驅動不探測 0x300-0x31f范圍的I/O端口。
8、mem=。。。
限制內核使用的內存數量。早期BIOS設計為只能識別64M以下的內存,如果你的內存數量大于64M,你可以指明,如果你指明的數量超過了實際安裝的內存數量,系統崩潰是遲早的事情。如:mem=0x1000000意味著有16M內存,如果是 mem=0x6000000,就是96M內存了。
9、panic=N
默認情況,內核崩潰--kernel panic 后會宕機而不會重啟,你可以設置宕機多少秒之后重啟機器;也可以在/proc/sys/kernel/panic文件里設置。
10、reboot=[warm|cold][,[bios|hard]]
該選項僅當定義了CONFIG_BUGi386時才能用。2.0.22的內核重啟默認為cool reboot,warm reboot 更快,使用“reboot=bios”可以繼承bios的設置。
11、debug
linux的日志級別比較多(詳細信息可以參看linux/kernel.h),一般地,日志的守護進程klogd只把比DEBUG級別高的日志寫進磁盤;如果使用該選項,klogd也把內核的DEBUG信息寫進日志。
12、profile=N
在做內核開發的時候,如果想清楚的知道內核在什么地方耗用了多少CPU的時鐘周期,可以使用核心的分析函數設置變量prof_shift為非0值,有兩種方式可以實現:一種是在編譯時指定,另一種就是通過“profile=”來指定; 他給出了一個相當于最小單位--即時鐘周期;系統在執行內核代碼的時候, profile[address 》;》; prof_shift]的值就會累加,你也可以從 /proc/profile得到關于它的一些信息。
13、swap=N1,N2,N3,N4,N5,N6,N7,N8
設置內核交換算法的八個參數:max_page_age, page_advance, page_decline,page_initial_age, age_cluster_fract, age_cluster_min, pageout_weight,bufferout_weight。
14、buff=N1,N2,N3,N4,N5,N6
設置內核緩沖內存管理的六個參數:max_buff_age, buff_advance, buff_decline,buff_initial_age, bufferout_weight, buffermem_grace。
在Linux中,給kernel傳遞參數以控制其行為總共有三種方法:
1.build kernel之時的各個configuration選項。
2.當kernel啟動之時,可以參數在kernel被GRUB或LILO等啟動程序調用之時傳遞給kernel。
3.在kernel運行時,修改/proc或/sys目錄下的文件。
這里我簡單講的就是第二種方式了,kernel在grub中配置的啟動參數。
首先,kernel有哪些參數呢? 在linux的源代碼中,有這樣的一個文檔Documentation/kernel-parameters.txt,它介紹了kernel的各個參數及其意義。
其次,kernel啟動參數以空格分隔,而且是嚴格區分大小寫的(如:mem和MEM是不一樣的)。
再次,對于module特有的kernel參數寫法是這樣的,[module name]。[parameter=XX],例如,igb.max_vfs=7這個kernel啟動參數的效果就是相當于這樣來動態加載module: modprobe igb max_vfs=7
另外,kernel是怎樣處理這些啟動參數的呢? 啟動參數通常是這樣的形式: name[=value_1][,value_2]。。。[,value_10]
“name”是關鍵字,內核用它來識別應該把“關鍵字”后面的值傳遞給誰,也就是如何處理這個值,是傳遞給處理進程還是作為環境變量或者拋給“init”。值的個數限制為10,你可以通過再次使用該關鍵字使用超過10個的參數。 首先,kernel檢查關鍵字是不是 ‘root=’, ‘nfsroot=’, ‘nfsaddrs=’, ‘ro’, ‘rw’, ‘debug’或‘init’,然后內核在bootsetups數組里搜索于該關鍵字相關聯的已注冊的處理函數,如果找到相關的已注冊的處理函數,則調用這些函數并把關鍵字后面的值作為參數傳遞給這些函數。比如,你在啟動時設置參數name=a,b,c,d,內核搜索bootsetups數組,如果發現“name”已注冊,則調用“name”的設置函數如name_setup(),并把a,b,c,d傳遞給name_setup()執行。 所有型如“name=value”參數,如果沒有被上面所述的設置函數接收,將被解釋為系統啟動后的環境變量,比如“TERM=vt100”啟動參數就會被作為一個啟動后的環境變量。所有沒有被內核設置函數接收也沒又被設置成環境變量的參數都將留給init進程處理,比如“single”。
軟件子系統各組成部分之間的層次與關聯,怎樣相互識別、配置與加載?
一、系統啟動流程
bootloader(uboot) ————》 Linux Kernel(uImage) ————》 Rootfs(Init) ————》 Applications1
二、啟動環境配置
uboot環境變量: printenv setenv saveenv tftpboot nand read/write …等等
baudrate 115200
bootdelay
bootcmd :在uboot命令行中輸入boot或bootd運行bootcmd變量指定的命令進行啟動
ipaddr, serverip, ethaddr,gatewayip
bootargs
bootargs內核啟動參數:
root, rootfstype, nfsroot
root=/dev/nfs nfsroot=nfsserver:path
root=/dev/mtdblock2
mtdparts: mtdparts=mtd-id:@(),@()
mtdparts=s5pv210-nand:1M(boot),5M(kernel),80M(rootfs),426M(usrfs)
要想這個參數起作用,內核中的mtd驅動必須要支持,即內核配置時需要選上
`Device Drivers ---》 Memory Technology Device (MTD) support ---》 Command line partition table parsing`
rootfstype=jffs2/yaffs2/squashfs/ubifs/…
ip:使用nfs時必須進行設置
ip=ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
init, console
mem 限制linux內核的使用內存 mem=128M
三、啟動參數設置:在uboot命令行中輸入以下內容:
系統起來以后,可以敲 cat /proc/cmdline 來查看內核啟動參數
總結:
1. 收集信息:flash類型與分區(nand/nor/spi.etc), 內存大小, 根文件系統類型,網絡參數等(參考SDK開發手冊)
2. 配置參數:setenv bootargs ‘…’;saveenv;
3. 測試參數:確保內核鏡像可以成功加載,必不可少的步驟
評論
查看更多