日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

玩转u-boot之【初探环境变量env/bootcmd/bootargs】

發布時間:2023/12/15 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转u-boot之【初探环境变量env/bootcmd/bootargs】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在linux下玩過boot的人都知道,任何一款linux下的boot程序都會有一些運行參數,也可以叫環境變量或者環境參數。比如友善之臂給mini2440開發板標配的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自帶的缺省環境變量。

而作為更高級的u-boot,它自然也有環境變量,而且種類更加繁多,應用更加深入。在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的原配環境變量全文。至于,環境變量到底是什么,起什么作用,如何修改,如何讀寫,等等問題,容我們逐一分析。

一、環境變量的概念

環境變量可以理解為用戶對軟件的全局配置信息,這部分信息應該可以從永久性存儲器上讀取,能被查詢,能被修改。boot程序啟動過程中,應該首先把環境變量讀取到合適的內存區域,然后利用環境變量初始化硬件、啟動操作系統等等。

二、uboot的環境變量

環境變量描述
bootdelay執行自動啟動的等候秒數
bootargs傳遞給內核的啟動參數
bootcmd自動啟動時執行的命令
baudrate串口控制臺的波特率
bootfile缺省的下載文件
serverip服務器端的ip地址
ipaddr本地ip地址
netmask以太網接口的掩碼
ethaddr以太網卡的網卡物理地址
stdin標準輸入設備
stdout標準輸出設備
stderr標準出錯設備

上表中就是u-boot程序中最常見的一些環境變量,當然,不同的版本可能不太一樣,但是大同小異。環境變量存放在Flash中,使用下面的命令便可以讀取、打印、更改、保存環境變量。

printenv - print environment variables setenv - set environment variables saveenv - save environment variables to persistent storage

這里要注意的是,當u-boot第一次在板子上運行時,此時Flash里是空的,程序嘗試從Flash中讀取環境變量時會讀取失敗,給出下面的提示信息:

Warning - bad CRC or NAND, using default environment

那么,此時所有的變量是以宏的形式定義在程序代碼頭文件中的(該文件存放于include/configs/<你的板子名稱>.h中,如include/configs/mini2440.h),只有你更改了其中某個值并執行了保存的命令之后,所有的參數才會形成一個鏡像文件保存到Flash中去,之后所有的操作則是基于Flash而進行的。

下面我們就針對上述表格中的各項變量逐一進行分析:

1、bootcmd

bootcmd=nfs 0x30008000 192.168.1.149:/opt/FriendlyARM/uImage;bootm

表示uboot以nfs的方式加載位置在于192.168.1.149:/opt/FriendlyARM/這個目錄下面的uImage文件,加載之后再執行bootm(bootm指令是專門用于啟動在SDRAM中的用U-boot的mkimage工具處理過的內核映像。因此在執行bootm命令的時候必須確保image文件已經在內存中)。

2、bootargs

bootargs是環境變量中的重中之重,甚至可以說整個環境變量都是圍繞著bootargs來設置的。bootargs的種類非常的多,我們平常只是使用了幾種而已,而且隨著kernel的發展還會再出現一些新的參數。bootargs非常的靈活,內核和文件系統的不同搭配就會有不同的設置方法。

下面對幾種常見的bootargs示例進行分析:

  • 假設文件系統是ramdisk,且直接就在內存中,bootargs的設置應該如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
  • 假設文件系統是ramdisk,且在flash中,bootargs的設置應該如下(注意這種情況下你應該要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)):
setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’
  • 假設文件系統是jffs2類型的,且在flash中,bootargs的設置應該如下:
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
  • 假設文件系統是基于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

最后我們再針對mini2440開發板中的bootargs參數進行一次詳細的實例解析。參數原文如下:

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啟動系統。
  • root=/dev/nfs rw:表示使用基于NFS的文件系統來啟動系統,后面的rw表示對該文件系統具有可讀可寫的權限。
  • nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs:表示NFS文件系統的具體地址。
  • ip=192.168.0.2:192.168.0.1:192.168.0.100:255.255.255.0:依次表示本機(即開發板)的IP地址、NFS服務器的IP地址、本機的網關、子網掩碼。
  • console=ttySAC0,115200:表示使用串口0當做輸出設備,波特率115200。
  • init=/linuxrc:表示內核啟起來后,進入系統中運行的第一個腳本,一般init=/linuxrc, 或者init=/etc/preinit。要注意的是,這里的init=/linuxrc并不是一個固定寫法,它指的是/目錄下面的linuxrc腳本,一般是一個連接罷了,可以自行更改的。
  • mem=64M:表示指定內存大小為64M。

好了,關于u-boot的環境變量,本次就先介紹到這里,后續還會繼續推出其他方面的解讀專題,敬請關注!

總結

以上是生活随笔為你收集整理的玩转u-boot之【初探环境变量env/bootcmd/bootargs】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。