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