核心啟動引數詳解、引數為什麼這麼設定
1 檢視核心啟動引數
在uboot介面中輸入printenv,即可檢視啟動引數。
示例:
jz2440:
OpenJTAG> printenv bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0 bootdelay=2 baudrate=115200 ethaddr=08:00:3e:26:0a:5b ipaddr=192.168.7.17 serverip=192.168.7.11 netmask=255.255.255.0 mtdids=nand0=nandflash0 mtdparts=mtdparts=nandflash0:[email protected]
(bootloader),128k(params),2m(kernel),-(root) bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 bootatgs=noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0 console=ttySAC0 filesize=791340 bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 stdin=serial stdout=serial stderr=serial partition=nand0,0 mtddevnum=0 mtddevname=bootloader Environment size: 742/131068 bytes
hi3518e淘寶:
hisilicon # printenv baudrate=115200 bootfile="uImage" da=mw.b 0x82000000 ff 1000000;tftp 0x82000000 u-boot.bin.img;sf probe 0;flwrite du=mw.b 0x82000000 ff 1000000;tftp 0x82000000 user-x.cramfs.img;sf probe 0;flwrite dr=mw.b 0x82000000 ff 1000000;tftp 0x82000000 romfs-x.cramfs.img;sf probe 0;flwrite dw=mw.b 0x82000000 ff 1000000;tftp 0x82000000 web-x.cramfs.img;sf probe 0;flwrite dc=mw.b 0x82000000 ff 1000000;tftp 0x82000000 custom-x.cramfs.img;sf probe 0;flwrite up=mw.b 0x82000000 ff 1000000;tftp 0x82000000 update.img;sf probe 0;flwrite ua=mw.b 0x82000000 ff 1000000;tftp 0x82000000 upall_verify.img;sf probe 0;flwrite tk=mw.b 0x82000000 ff 1000000;tftp 0x82000000 uImage; bootm 0x82000000 dd=mw.b 0x82000000 ff 1000000;tftp 0x82000000 mtd-x.jffs2.img;sf probe 0;flwrite ipaddr=192.168.1.10 serverip=192.168.1.107 netmask=255.255.255.0 ethaddr=00:12:12:22:b4:71 HWID=8043420004048425 bootargs=mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs) bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000 bootdelay=5 stdin=serial stdout=serial stderr=serial verify=n ver=U-Boot 2010.06-svn (Mar 27 2014 - 11:56:37) Environment size: 1179/65532 bytes
hi3518e自己:
hisilicon # printenv bootdelay=1 baudrate=115200 ethaddr=00:00:23:34:45:66 ipaddr=192.168.1.10 serverip=192.168.1.2 netmask=255.255.255.0 bootfile=uImage bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000 bootargs=mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs) stdin=serial stdout=serial stderr=serial verify=n ver=U-Boot 2010.06 (Jun 01 2017 - 02:38:54) Environment size: 424/262140 bytes
2 主要的啟動引數有bootargs、bootcmd
2.1 bootargs
示例:jz2440:
bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
bootatgs=noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox
ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
hi3518e淘寶:bootargs=mem=38M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)
hi3518e自己:
bootargs=mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs)
詳解:
console=ttySAC0 :
console=ttySAC0 使用虛擬串列埠終端裝置 .
為什麼是ttySAC0:
這個網址將的比較透徹:
在核心中有一個串列埠驅動和我們的console引數比較的一個過程,所以兩者要一致;
jz2440為什麼是ttySAC0:
S3C2410的驅動檔案drivers/serial/s3c2410.c中將串列埠驅動的名字定義為:.name = S3C24XX_SERIAL_NAME, // 這個巨集被定義為"ttySAC"
driver/serial/s3c2410.c有:#define S3C24XX_SERIAL_NAME"ttySAC"
hi3518e為什麼是ttyAMA0:
因為海思原始碼:drivers/tty/serial/amba-pl011.c中將串列埠驅動的名字定義為:.name = "ttyAMA",
mem:mem=xxM 指定記憶體的大小,不是必須的
root=/dev/mtdblock2:
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x就是說你的root分割槽在你flash的第幾分割槽,在第幾分割槽就是mtdblockx幾,如:mtdblock3\mtdclock2;
hi3518e的板子設定mtdparts分割槽資訊時,設定了三個分割槽第三個是root分割槽所以是root=/dev/mtdblock2
上面的這幾個在一定情況下是通用的,當然這要看你當前的系統是否支援,不過mtd是字元裝置,而mtdblock是塊裝置,有時候你的挨個的試到底當前的系統支援上面那種情況下,不過root=/dev/mtdblockx rw比較通用。此外,如果直接指定裝置名可以的話,那麼使用此裝置的裝置號也是可以的。
root=/dev/nfs
在檔案系統為基於nfs的檔案系統的時候使用。當然指定root=/dev/nfs之後,還需要指定nfsroot=serverip:nfs_dir,即指明檔案系統存在那個主機的那個目錄下面
rootfstype=jffs2:
rootfstype 設定檔案系統型別rootfstype=jffs2;
這個選項需要跟root一起配合使用,一般如果根檔案系統是ext2的話,有沒有這個選項是無所謂的,但是如果是jffs2,squashfs等檔案系統的話,就需要rootfstype指明檔案系統的型別,不然會無法掛載根分割槽.
mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs):
flash分割槽資訊;
要想這個引數起作用,核心中的mtd驅動必須要支援
按這個格式來設定:mtdparts=mtd-id:@(),@()
mtd-id 必須要跟你當前平臺的flash的mtd-id一致,不然整個mtdparts會失效
init:
init指定的是核心啟起來後,進入系統中執行的第一個指令碼,一般init=/linuxrc, 或者init=/etc/preinit,preinit的內容一般是建立console,null裝置節點,執行init程式,掛載一些檔案系統等等操作。請注意,很多初學者以為init=/linuxrc是固定寫法,其實不然,/linuxrc指的是/目錄下面的linuxrc指令碼,一般是一個連線罷了。
2.2 bootcmd引數
bootcmd=sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000
uboot引導完的最後一步就是呼叫bootcmd引數驅動核心:怎麼啟動呢,就是把在flash中的核心燒寫到ram中,並執行那段程式碼;
前面有說過bootcmd是自動啟動時預設執行的一些命令,因此你可以在當前環境中定義各種不同配置,不同環境的引數設定,然後設定bootcmd為你經常使用的那種引數。
3 修改啟動引數
其實開啟uboot介面輸入?,就會返回uboot下我們可以使用的命令,其中包括引數設定的相關引數。修改:bootargs引數
YAFFS啟動引數設定:set bootargs console=ttySAC0,115200 root=/dev/mtdblock3; save //實測有效jffs2設定啟動引數:set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2; savenfs系統啟動:
改後的資訊:setenv bootargs noinitrd root=/dev/nfs nfsroot=192.168.7.21:/home/book/workspace/jz2440/systems/firstbusybox ip=192.168.7.17:192.168.7.21:192.168.7.1:255.255.255.0::eth0:off init= /linuxrc console=ttySAC0
原資訊:set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
saveenv
修改:bootcmd引數
setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs) 'setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'
saveenv