uboot设置uboot下的bootargs参数

Posted Evan_ZGYF丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uboot设置uboot下的bootargs参数相关的知识,希望对你有一定的参考价值。

关键字:
【bootargs】、【uboot】、【boot】、【bootloader】、【】、【】、【】、【】、【】、【】、

描述:

因为项目需要,常常要修改uboot代码。
其中比较重要的就有“bootargs”参数

什么是bootargs?

简单来说:bootargs就是传递给内核的启动参数。
在uboot加载内核时,会将bootargs参数传递给内核(指定内存地址)。
在内核启动过程中,会获取bootargs参数,并解析其中的信息。用于启动过程中用于配置相关的驱动模块信息。

如何设置bootargs?

bootargs的设置有多种方式:
1.通过代码中设置
setenv("bootargs", boot_args);

2.通过uboot下的命令行设置
setenv bootargs 'xxx...'

bootargs参数解析

root:
    目前很多新的开发板都是使用FLASH作为存储。因为很多都直接使用MTD驱动程序。
    MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的支持、更好的管理和基于扇区的擦除和读写操作的更好的接口。
    Linux 下的 MTD 驱动程序接口被划分为两类模块:用户模块和硬件模块。
  有两个流行的用户模块可启用对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。 
  MTD_CHAR 提供对闪存的原始字符访问,而 MTD_BLOCK 将闪存设计为可以在上面创建文件系统的常规块设备(象 IDE 磁盘)。
    与 MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),而与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。
    由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的文件系统。
    常用的方式是:root=/dev/mtdblockx rw(x=0,1,2..这个是根据自己mtd的分区,看自己要将文件系统放在哪个分区中)
    还有其他格式:比如root=/dev/mtdx rw,root=/dev/ram rw。这个是根据自己内核和FLASH不同改变的。
    还有一种比较特殊的挂载文件系统的方法就是文件系统不在开发板上。而是用NFS共享的服务器上的。当然指定root=/dev/nfs之后,还需要指定服务器的IP地址。
    eg:root=/dev/nfs rw nfsroot=10.103.4.216:/nfsroot/rootfs ip=10.103.4.211
rootfstype:
    指明挂载哪种文件系统
  eg:  rootfstype=jffs2
console:
  console=ttyS0,115200     控制台使用串口0,波特率115200.
mem:
  mem=xxM 指定内存的大小,不是必须的。
  eg:mem=128M
ramdisk:
  首先介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,能把RAM disk和通常的硬盘分区(如/dev/hda1)同等对待来使用
  注意:在2.6版本后,Ramdisk的这一作用开始被tmpfs(Virtual memory file system support)取代。
  为了能够使用RAMdisk你的内核必须要支持RAM disk,即:在编译内核时,要选中RAM disk support这一选项,会在配置文件中定义CONFIG_BLK_DEV_RAM。为了让内核有能力在内核加载阶段就能装入RAMDISK,并运行其中的内容,要选中initial RAM disk(initrd) support选项,会在配置文件中定义CONFIG_BLK_DEV_INITRD。
  ramdisk一个作用就是用来解决boot过程中mount根文件系统的“先有鸡还是先有蛋”的问题的。一般来说,根文件系统在形形色色的存储设备上,不同的设备又要不同的硬件厂商的驱动,比如intel的南桥自然需要intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也有不同的文件系统的可能,比如ubuntu发行版可能一般用ext3,suse可能就不是了,不同的文件系统也需要不同的文件系统模块;假如把所有驱动/模块都编译进内核(注:即编一个通用的、万能的内核),那自然没问题,但是这样就违背了“内核”的精神或本质,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么“鸡蛋”问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了 .
  linux中RamDisk的三种实现方式:https://blog.csdn.net/alextanghao/article/details/2660656 ramdisk:
  首先介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,能把RAM disk和通常的硬盘分区(如/dev/hda1)同等对待来使用
  注意:在2.6版本后,Ramdisk的这一作用开始被tmpfs(Virtual memory file system support)取代。
  为了能够使用RAMdisk你的内核必须要支持RAM disk,即:在编译内核时,要选中RAM disk support这一选项,会在配置文件中定义CONFIG_BLK_DEV_RAM。为了让内核有能力在内核加载阶段就能装入RAMDISK,并运行其中的内容,要选中initial RAM disk(initrd) support选项,会在配置文件中定义CONFIG_BLK_DEV_INITRD。
  ramdisk一个作用就是用来解决boot过程中mount根文件系统的“先有鸡还是先有蛋”的问题的。一般来说,根文件系统在形形色色的存储设备上,不同的设备又要不同的硬件厂商的驱动,比如intel的南桥自然需要intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也有不同的文件系统的可能,比如ubuntu发行版可能一般用ext3,suse可能就不是了,不同的文件系统也需要不同的文件系统模块;假如把所有驱动/模块都编译进内核(注:即编一个通用的、万能的内核),那自然没问题,但是这样就违背了“内核”的精神或本质,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么“鸡蛋”问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了 .
  linux中RamDisk的三种实现方式:https://blog.csdn.net/alextanghao/article/details/2660656
initrd, noinitrd:
   当你没有使用ramdisk启动系统的时候,你需要使用noinitrd这个参数,但是如果使用了的话,就需要指定initrd=r_addr,size,r_addr表示initrd在内存中的位置,size表示initrd的大小。
  initrd是用来初始化ramdisk用的。
init:
  init 指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc,或者init=/etc/preinit,preinit的内容一般是创建console,null设备节点,运行init程序,挂载一些文件系统等等操作。请注意,很多初学者以为init=/linuxrc是固定写法,其实不然,/linuxrc指的是/目录下面的linuxrc脚本,一般是一个连接罢了
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.
  其中fc000000.nor_flash是mtd-id ,必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效。(可以在设备树中找到mtd-id)
  mtdparts=sa1100:256k(ARMboot)ro,-(root) → 有两个分区。其中 ‘-’表示剩余的空间。


 

以上是关于uboot设置uboot下的bootargs参数的主要内容,如果未能解决你的问题,请参考以下文章

uboot设置uboot下的bootargs参数

uboot环境变量(设置bootargs向linux内核传递正确的参数)

如何从uboot读取mac,然户传递到内核中

3U-boot的环境变量: bootcmd 和bootargs

Linux内核LCD驱动分析与换屏方法(Tiny4412)

Linux系统移植:官板 uboot 修改(下)