玩转u-boot之【初探环境变量env/bootcmd/bootargs】
在linux下玩過boot的人都知道,任何一款linux下的boot程序都會有一些運行參數(shù),也可以叫環(huán)境變量或者環(huán)境參數(shù)。比如友善之臂給mini2440開發(fā)板標配的SuperViVi這款boot程序,輸入q進入命令行模式之后,再輸入param show命令,就可以看到下面的信息:
Supervivi> param show Number of parameters: 9 name : hex integer ------------------------------------------------------------- mach_type : 000007cf 1999 media_type : 00000003 3 boot_mem_base : 30000000 805306368 baudrate : 0001c200 115200 xmodem : 00000001 1 xmodem_one_nak : 00000000 0 xmodem_initial_timeout : 000493e0 300000 xmodem_timeout : 000f4240 1000000 boot_delay : 01000000 16777216 Linux command line : noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0這就是SpuerViVi自帶的缺省環(huán)境變量。
而作為更高級的u-boot,它自然也有環(huán)境變量,而且種類更加繁多,應(yīng)用更加深入。在uboot啟動過程中,可以通過printenv命令讓其輸出:
[u-boot@MINI2440]# printenv bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M bootcmd=nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm bootdelay=1 baudrate=115200 ethaddr=08:08:11:18:12:27 ipaddr=192.168.0.2 serverip=192.168.0.1 gatewayip=192.168.0.100 netmask=255.255.255.0 tekkaman=bmp d 70000 stdin=serial stdout=serial stderr=serial ethact=dm9000Environment size: 470/131068 bytes這就是我本人目前正在研究的tekkamanninja大神于2010.03移植過來的mini2440定制版的u-boot的原配環(huán)境變量全文。至于,環(huán)境變量到底是什么,起什么作用,如何修改,如何讀寫,等等問題,容我們逐一分析。
一、環(huán)境變量的概念
環(huán)境變量可以理解為用戶對軟件的全局配置信息,這部分信息應(yīng)該可以從永久性存儲器上讀取,能被查詢,能被修改。boot程序啟動過程中,應(yīng)該首先把環(huán)境變量讀取到合適的內(nèi)存區(qū)域,然后利用環(huán)境變量初始化硬件、啟動操作系統(tǒng)等等。
二、uboot的環(huán)境變量
| bootdelay | 執(zhí)行自動啟動的等候秒數(shù) |
| bootargs | 傳遞給內(nèi)核的啟動參數(shù) |
| bootcmd | 自動啟動時執(zhí)行的命令 |
| baudrate | 串口控制臺的波特率 |
| bootfile | 缺省的下載文件 |
| serverip | 服務(wù)器端的ip地址 |
| ipaddr | 本地ip地址 |
| netmask | 以太網(wǎng)接口的掩碼 |
| ethaddr | 以太網(wǎng)卡的網(wǎng)卡物理地址 |
| stdin | 標準輸入設(shè)備 |
| stdout | 標準輸出設(shè)備 |
| stderr | 標準出錯設(shè)備 |
上表中就是u-boot程序中最常見的一些環(huán)境變量,當然,不同的版本可能不太一樣,但是大同小異。環(huán)境變量存放在Flash中,使用下面的命令便可以讀取、打印、更改、保存環(huán)境變量。
printenv - print environment variables setenv - set environment variables saveenv - save environment variables to persistent storage這里要注意的是,當u-boot第一次在板子上運行時,此時Flash里是空的,程序嘗試從Flash中讀取環(huán)境變量時會讀取失敗,給出下面的提示信息:
Warning - bad CRC or NAND, using default environment那么,此時所有的變量是以宏的形式定義在程序代碼頭文件中的(該文件存放于include/configs/<你的板子名稱>.h中,如include/configs/mini2440.h),只有你更改了其中某個值并執(zhí)行了保存的命令之后,所有的參數(shù)才會形成一個鏡像文件保存到Flash中去,之后所有的操作則是基于Flash而進行的。
下面我們就針對上述表格中的各項變量逐一進行分析:
1、bootcmd
bootcmd=nfs 0x30008000 192.168.1.149:/opt/FriendlyARM/uImage;bootm表示uboot以nfs的方式加載位置在于192.168.1.149:/opt/FriendlyARM/這個目錄下面的uImage文件,加載之后再執(zhí)行bootm(bootm指令是專門用于啟動在SDRAM中的用U-boot的mkimage工具處理過的內(nèi)核映像。因此在執(zhí)行bootm命令的時候必須確保image文件已經(jīng)在內(nèi)存中)。
2、bootargs
bootargs是環(huán)境變量中的重中之重,甚至可以說整個環(huán)境變量都是圍繞著bootargs來設(shè)置的。bootargs的種類非常的多,我們平常只是使用了幾種而已,而且隨著kernel的發(fā)展還會再出現(xiàn)一些新的參數(shù)。bootargs非常的靈活,內(nèi)核和文件系統(tǒng)的不同搭配就會有不同的設(shè)置方法。
下面對幾種常見的bootargs示例進行分析:
- 假設(shè)文件系統(tǒng)是ramdisk,且直接就在內(nèi)存中,bootargs的設(shè)置應(yīng)該如下:
- 假設(shè)文件系統(tǒng)是ramdisk,且在flash中,bootargs的設(shè)置應(yīng)該如下(注意這種情況下你應(yīng)該要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)):
- 假設(shè)文件系統(tǒng)是jffs2類型的,且在flash中,bootargs的設(shè)置應(yīng)該如下:
- 假設(shè)文件系統(tǒng)是基于nfs的,bootargs的設(shè)置應(yīng)該如下:
最后我們再針對mini2440開發(fā)板中的bootargs參數(shù)進行一次詳細的實例解析。參數(shù)原文如下:
bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M含義如下:
- noinitrd:表示不使用ramdisk啟動系統(tǒng)。
- root=/dev/nfs rw:表示使用基于NFS的文件系統(tǒng)來啟動系統(tǒng),后面的rw表示對該文件系統(tǒng)具有可讀可寫的權(quán)限。
- nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs:表示NFS文件系統(tǒng)的具體地址。
- ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0:依次表示本機(即開發(fā)板)的IP地址、NFS服務(wù)器的IP地址、本機的網(wǎng)關(guān)、子網(wǎng)掩碼。
- console=ttySAC0,115200:表示使用串口0當做輸出設(shè)備,波特率115200。
- init=/linuxrc:表示內(nèi)核啟起來后,進入系統(tǒng)中運行的第一個腳本,一般init=/linuxrc, 或者init=/etc/preinit。要注意的是,這里的init=/linuxrc并不是一個固定寫法,它指的是/目錄下面的linuxrc腳本,一般是一個連接罷了,可以自行更改的。
- mem=64M:表示指定內(nèi)存大小為64M。
好了,關(guān)于u-boot的環(huán)境變量,本次就先介紹到這里,后續(xù)還會繼續(xù)推出其他方面的解讀專題,敬請關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的玩转u-boot之【初探环境变量env/bootcmd/bootargs】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 贴膜、保养!华为2月服务日开启 六大特色
- 下一篇: 大数据最懂你 2023年春节荣耀Magi