本文轉自 http://blogold.chinaunix.net/u3/94312/showart_1923637.html
個人Notes:
看到這個標題,可能覺得這個並沒有什麼的,其實不然,編好了 u-boot 了,但是如何來使用確不是那麼簡單的,想當初我將 uboot 製作出來後以爲全部都搞定了,屁顛屁顛的燒到板子上後可系統就是起不來,爲什麼了,折騰了很久以後才發現是 u-boot 的環境變量設置錯誤,在後來的工作中,我發現 一些有一定經驗 的人在這方面也是模模糊糊的扯不清,所以這裏要討論一下。
u-boot 的環境變量 是使用 u-boot 的關鍵,它 可以 由 你自己定義的,但是其中有一些也是大家經常使用,約定熟成的,有一些是 u-boot 自己定義的,更改這些名字會出現錯誤,下面的表中我們列出了一些常用的環境變量:
環境變量 |
描述 |
bootdelay |
執行自動啓動的等候秒數 |
baudrate |
串口控制檯的波特率 |
netmask |
以太網接口的掩碼 |
ethaddr |
以太網卡的網卡物理地址 |
bootfile |
缺省的下載文件 |
bootargs |
傳遞給內核的啓動參數 |
bootcmd |
自動啓動時執行的命令 |
serverip |
服務器端的 ip 地址 |
ipaddr |
本地 ip 地址 |
stdin |
標準輸入設備 |
stdout |
標準輸出設備 |
stderr |
標準出錯設備 |
上面只是一些最基本的環境變量,請注意,板子裏原本是沒有環境變量的, u-boot 的缺省情況下會有一些基本的環境變量,在你執行了 saveenv 之後,環境變量會第一次保存到 flash 中,之後你對環境變量的修改 , 保存都是基於保存在 flash 中的環境變量的操作。
U-boot 的環境變量值得注意的有 兩 個: bootcmd 和 bootargs 。
u bootcmd
前面有說過 bootcmd 是自動啓動時默認執行的一些命令,因此你可以在當前環境中定義各種不同配置,不同環境的參數設置,然後設置 bootcmd 爲你經常使用的那種參數。
u bootargs
bootargs 是環境變量中的重中之重,甚至可以說整個環境變量都是圍繞着 bootargs 來設置的。 bootargs 的種類非常非常的多,我們平常只是使用了幾種而已,感興趣的可以看看這篇文章說的很全: http://blog.chinaunix.net/u2/79570/showart_1675071.html 。 bootargs 非常的靈活,內核和文件系統的不同搭配就會有不同的設置方法,甚至你也可以不設置 bootargs, 而直接將其寫到內核中去(在配置內核的選項中可以進行這樣的設置),正是這些原因導致了 bootargs 使用上的困難。
下面介紹一下 bootargs 常用參數, bootargs 的種類非常的多,而且隨着 kernel 的發展會出現一些新的參數,使得設置會更加靈活多樣。
A. root
用來指定 rootfs 的位置, 常見的情況有 :
root=/dev/ram rw
root=/dev/ram0 rw
請注意上面的這兩種設置情況是通用的,我做過測試甚至 root=/dev/ram1 rw 和 root=/dev/ram2 rw 也是可以的,網上有人說在某些情況下是不通用的,即必須設置成 ram 或者 ram0 ,但是目前還沒有遇到,還需要進一步確認,遇到不行的時候可以逐一嘗試。
root=/dev/mtdx rw
root=/dev/mtdblockx rw
root=/dev/mtdblock/x rw
root=31:0x
上面的這幾個在一定情況下是通用的,當然這要看你當前的系統是否支持,不過 mtd 是字符設備,而 mtdblock 是塊設備,有時候你的挨個的試到底當前的系統支持上面那種情況下,不過 root=/dev/mtdblockx rw 比較通用。 此外,如果直接指定設備名可以的話,那麼使用此設備的設備號也是可以的。
root=/dev/nfs
在文件系統爲基於 nfs 的文件系統的時候使用。 當然指定 root=/dev/nfs 之後,還需要指定 nfsroot=serverip:nfs_dir ,即指明文件系統存在那個主機的那個目錄下面。
B. rootfstype
這個選項需要跟 root 一起配合使用,一般如果根文件系統是 ext2 的話,有沒有這個選項是無所謂的,但是如果是 jffs2,squashfs 等文件系統的話,就需要 rootfstype 指明文件系統的類型,不然會無法掛載根分區 .
C. console
console=tty<n> 使用虛擬串口終端設備 <n> .
console=ttyS<n>[,options] 使用特定的串口 <n> , options 可以是這樣的形式 bbbbpnx ,這裏 bbbb 是指串口的波特率, p 是奇偶校驗位, n 是指的 bits 。
console=ttySAC<n>[,options] 同上面。
看你當前的環境,有時用 ttyS<n> ,有時用 ttySAC<n> ,網上有人說,這是跟內核的版本有關, 2.4 用 ttyS<n> , 2.6 用 ttySAC<n> ,但實際情況是官方文檔中也是使用 ttyS<n> ,所以應該是跟內核版本沒有關聯的。可以查看 Documentation/serial-console.txt 找到相關描述。
D. mem
mem=xxM 指定內存的大小,不是必須的
E. ramdisk_size
ramdisk=xxxxx 不推薦
ramdisk_size=xxxxx 推薦
上面這兩個都可以告訴 ramdisk 驅動,創建的 ramdisk 的 size ,默認情況下是 4m (s390 默認 8M ) ,你可以查看 Documentation/ramdisk.txt 找到相關的描述,不過 ramdisk=xxxxx 在新版的內核都已經沒有提了,不推薦使用。
F. initrd, noinitrd
當你沒有使用 ramdisk 啓動系統的時候,你需要使用 noinitrd 這個參數,但是如果使用了的話,就需要指定 initrd=r_addr,size, r_addr 表示 initrd 在內存中的位置, size 表示 initrd 的大小。
G. init
init 指定的是內核啓起來後,進入系統中運行的第一個腳本,一般 init=/linuxrc, 或者 init=/etc/preinit , preinit 的內容一般是創建 console,null 設備節點,運行 init 程序,掛載一些文件系統等等操作。請注意,很多初學者以爲 init=/linuxrc 是固定寫法,其實不然, /linuxrc 指的是 / 目錄下面的 linuxrc 腳本,一般是一個連接罷了。
H. mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
要想這個參數起作用,內核中的 mtd 驅動必須要支持,即內核配置時需要選上 Device Drivers ---> Memory Technology Device (MTD) support ---> Command line partition table parsing
mtdparts 的格式如下:
mtdparts=<mtddef>[;<mtddef]
<mtddef> := <mtd-id>:<partdef>[,<partdef>]
<partdef> := <size>[@offset][<name>][ro]
<mtd-id> := unique id used in mapping driver/device
<size> := standard linux memsize OR "-" to denote all remaining space
<name> := (NAME)
因此你在使用的時候需要按照下面的格式來設置:
mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)
這裏面有幾個必須要注意的:
a. mtd-id 必須要跟你當前平臺的 flash 的 mtd-id 一致,不然整個 mtdparts 會失效
b. size 在設置的時候可以爲實際的 size(xxM,xxk,xx) ,也可以爲 '-' 這表示剩餘的所有空間。
舉例:
假設 flash 的 mtd-id 是 sa1100 ,那麼你可以使用下面的方式來設置:
mtdparts=sa1100:- → 只有一個分區
mtdparts=sa1100:256k(ARMboot)ro,-(root) → 有兩個分區
可以查看 drivers/mtd/cmdlinepart.c 中的註釋找到相關描述。
I. ip
指定系統啓動之後網卡的 ip 地址,如果你使用基於 nfs 的文件系統,那麼必須要有這個參數,其他的情況下就看你自己的喜好了。設置 ip 有兩種方法:
ip = ip addr
ip=ip addr:server ip addr:gateway:netmask::which netcard:off
這兩種方法可以用,不過很明顯第二種要詳細很多,請注意第二種中 which netcard 是指開發板上的網卡,而不是主機上的網卡。
說完常見的幾種 bootargs ,那麼我們來討論平常我經常使用的幾種組合:
1). 假設文件系統是 ramdisk ,且直接就在內存中, bootargs 的設置應該如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc ’
2). 假設文件系統是 ramdisk ,且在 flash 中, bootargs 的設置應該如下:
setenv bootargs ‘ mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
注意這種情況下你應該要在 bootm 命令中指定 ramdisk 在 flash 中的地址,如 bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假設文件系統是 jffs2 類型的,且在 flash 中, bootargs 的設置應該如下
setenv bootargs ‘ mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
4). 假設文件系統是基於 nfs 的, bootargs 的設置應該如下
setenv bootargs ‘ noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off ’
或者
setenv bootargs ‘ noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我們經常使用的幾種 bootargs 的組合,老實說, bootargs 非常非常的靈活,所以設置的方法有很多中形式,具體的還應該根據你的平臺具體的情況來設置。