1. 程式人生 > >核心啟動引數詳解、引數為什麼這麼設定

核心啟動引數詳解、引數為什麼這麼設定

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; save

nfs系統啟動:

改後的資訊: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 bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000'
saveenv

setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),4M(kernel),9M(rootfs) '