深入理解bootargs

一、bootargs参数

在嵌入式系统中,bootargs是非常重要的参数。它保存着Linux内核启动的相关信息,如启动参数和控制台信息等。而在ARM架构的系统中,bootargs参数则是在U-Boot引导时设置的。

bootargs参数通常包括以下几个方面:

1. 内核命令行参数

内核命令行参数是Linux内核启动时必要的参数,它们会告诉内核应该如何进行初始化和配置。常见的内核命令行参数包括rootfs、serial等。

root=/dev/mmcblk0p2 rootwait rw console=ttyS0,115200n8

2. 内存分配参数

内存分配参数通常由Linux内核自动处理,但在某些情况下需要手动设置。它们包括mem等。

mem=256MB


3. U-Boot环境变量

U-Boot环境变量是指在U-Boot引导时设置的全局变量。常见的U-Boot环境变量包括bootdelay、bootcmd等。

bootdelay=3
bootargs=root=/dev/mmcblk0p2 rootwait rw console=ttyS0,115200n8
bootcmd=run bootargs; bootm ${kernel_addr_r} - ${fdt_addr_r}

二、机顶盒bootargs是什么意思

机顶盒bootargs参数和嵌入式系统中的bootargs参数基本相同,也是由U-Boot引导时设置的命令行参数。其主要作用是为Linux内核初始化和配置提供必要的信息。常见的机顶盒bootargs参数包括:

1. rootfs

rootfs参数指定Linux内核的根文件系统,即Linux内核启动后挂载的根文件系统。在机顶盒中,通常指定为NFS、TFTP或者SD卡等。

bootargs=root=/dev/nfs nfsroot=192.168.0.10:/nfs/rootfs ip=dhcp rw

2. serial

serial参数指定Linux内核使用的串口设备,用于调试和输出控制台信息。

bootargs=console=ttyS0,115200n8

三、参数

  • init: 用来指定内核启动后执行的第一个程序,比如 init=/linuxrc 表示执行 /linuxrc 程序1。

  • mem: 用来指定内核使用的内存大小,比如 mem=64M 表示使用 64M 的内存1。

  • ip: 用来指定网络相关的参数,比如 ip=192.168.0.2::192.168.0.1:255.255.255.0::eth0:on 表示设置 IP 地址、网关、子网掩码和网络设备1。

  • video: 用来指定显示相关的参数,比如 video=omapfb:vram:2M,vram:4M 表示设置显存大小2。

  • mtdparts: 用来指定 flash 的分区情况,比如 mtdparts=hi_sfc:1M(boot);hinand:4M(baseparam),4M(pqparam),4M(logo),8M(kernel),96M(rootfs),-(others) 表示使用 hi_sfc 和 hinand 两个设备,并且分别指定了各自的分区大小和名称2。

  • mmz: 用来指定内存管理区域,比如 mmz=ddr,0,0,300M 表示使用 ddr 设备,并且从地址 0 开始,分配 300M 的内存空间。

  • panic: 用来指定内核发生崩溃时的行为,比如 panic=10 表示在内核崩溃后等待 10 秒后重启3。

  • quiet: 用来减少内核启动时的打印信息,只显示重要的错误信息3。

  • console: 用来指定使用的串口设备和波特率,比如 console=ttyPS0,115200 表示使用 ttyPS0 设备,并且设置波特率为 11520023。

  • earlyprintk: 用来打印早期启动信息,比如 earlyprintk 表示打印内核解压缩和设备树加载等信息2。

  • rootfstype: 用来指定 rootfs 的文件系统类型,比如 rootfstype=yaffs2 表示使用 yaffs2 文件系统2。

  • initrd: 用来指定使用 ramdisk 启动系统时的 ramdisk 镜像文件,比如 initrd=0x80000000,8M 表示从地址 0x80000000 开始,加载大小为 8M 的 ramdisk 镜像文件2。

四、举个例子


mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),38272k(user),256k(env),384k(uboot)
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::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.1
netmask=255.255.255.0
tekkaman=bmp d 70000
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000

Environment size: 470/131068 bytes


console

console=ttyS0,115200 表示终端为ttyS0,串口波特率为115200

root

用来指定rootfs(文件系统)的位置, 常见的情况有:

root=/dev/mtdblock5 表示根文件系统在第五分区

    root=/dev/ram rw
    root=/dev/ram0 rw
    请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。此种方法用的也很少,因为大多数是用nandflash。

    root=/dev/mtdx rw
    root=/dev/mtdblockx rw
    root=/dev/mtdblock/x rw
    上面的这几个在一定情况下是通用的,当然这要看你当前的系统是否支持,不过mtd是字符设备,而mtdblock是块设备,有时候你的挨个的试到底当前的系统支持上面那种情况下,不过root=/dev/mtdblockxrw比较通用。
    此外,如果直接指定设备名可以的话,那么使用此设备的设备号也是可以的。这个地方要看你的系统启动时MTD分区情况确认是哪个分区存放文件系统,在内核源码的arch/arm/mach-davinci/board-dm365.evm.或者arch/am/plat-s3c24xx/common-smdk.c中的smdk_default_nand_part结构数组中查看,注意是从mtdblock0开始的

    **这种配置是在nand中已经拷贝好文件系统时这样配置(**如果nand中没有,此参数这样配置会找不到文件系统的,出现的错误很多,可能会说unmount….或者panic –not syncing:VFS:unable timount root fs on unknown-block)

    此时的解决方法最好是把板子nand全部擦出,重新烧写。

    root=/dev/nfs
    在文件系统为基于nfs的文件系统的时候使用,也就是说文件系统不在板子上,而是用NFS共享的服务器上的。当然指定root=/dev/nfs之后,还需要指定nfsroot=serverip:nfs_dir,serverip是服务器的IP,dir即指明文件系统存在那个主机的那个目录下面。

注意:要确保在服务器中把此路径下的文件添加到NFS共享,添加上共享的文件会有个小插头的样子。
用NFS共享服务器上的文件系统这种方法很好,这样板子上的系统就可以起来了,可以再板子的终端里输入命令了,在班子中将存放文件系统的分区挂载一下eg:mount /dev/mtdblock4 /mnt,这样将服务器上做好的文件系统直接拷贝到/mnt文件下就好了eg:cp –rm * /mnt ,*代表当前路径下的所有内容,无需再用maketools将文件系统制作成二进制文件的形式用tftp或者NFS烧写到nand中了。

  • root 参数
存储介质大小标识描述举例
nor flash16MByte~32MBytemtdXnone (built-in)
nand Flash128MByte+mtdblockX(X:0,1,2,3…)root=/dev/mtdblock1 rw root=/dev/mtdblock2 rw
emmc~mmcblkXpY(X=0~ n,Y=1~ n具体要看系统识别出来哪些)root=/dev/mmcblk0p1 rw root=/dev/mmcblk0p2 rw
SD/TF卡~mmcblkXpY(X=0~ n,Y=1~ n具体要看系统识别出来哪些)SD/TF卡本质上就是emmcroot=/dev/mmcblk0p1 rw root=/dev/mmcblk0p2 rw
内存~ram内存文件系统
网络网络文件系统

firmware_class.path

指定驱动放置的位置,一些不开源的驱动

rootfstype

这个选项需要跟root一起配合使用,一般如果根文件系统是ext2的话,有没有这个选项是无所谓的,但是如果是jffs2,squashfs等文件系统的话,就需要rootfstype指明文件系统的类型,不然会无法挂载根分区.(具体是怎样无法挂载的这个还待测,是无法挂载nand中的还是虚拟机中的,待测)

eg:rootfstype=yaffs2

root=/dev/mtdblock5 表示根文件系统在第五分区

mtdparts

分区情况:内核目录/drivers/mtd/cmdlinepart.c文件中有介绍。

rootwait rw

root 后面有“rootwait rw”,rootwait 表示等待 mmc 设备初始化完成以后再挂载,否则的话mmc 设备还没初始化完成就挂载根文件系统会出错的。

rw 表示根文件系统是可以读写的,不加 rw 的话可能无法在根文件系统中进行写操作,只能进行读操作。

earlycon

ARM64,在kernel未建立console之前,使用earlycon,实现打印。在bootargs中,要加入如下选项:

earlycon=pl011,0x70000000 

pl011表示针对pl011这个串口设备,0x70000000是串口的起始地址。

no_console_suspend

在kernel启动参数里面加上no_console_suspend,这个是最基本的,因为kernel在把console suspend掉以后,不管里面出了什么事情,从串口上都看不到。大部分在suspend/resume时候的死机都可以通过串口看到kernel Panic的信息,这样才会知道是哪里出了问题。因为有的时候resume出错,或者suspend到很后面出错的console不加这个参数都看不到。
bootargs中找到console在其后添加no_console_suspend例如

"console=ttyO0,115200n8 no_console_suspend"

或者在Uboot中直接设置后boot:

setenv console ttyO0,115200n8 no_console_suspend

initcall_debug
这个也许知道的人不多, 其实有的时候你不知道哪个driver在suspend/resume的时候出错的时候,很迷茫, 就想在哪里加上一些调试信息来看看是哪里的driver, 其实有些时候加的不合适的话, 会看不到很多有用的信息。其实kernel本身已经有这样的功能了(只不过不是很人性化)。

echo 1 > /sys/module/kernel/parameters/initcall_debugecho 9 > /proc/sys/kernel/printk

PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作
系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.
可以使用"pci=nomsi"内核引导参数关闭
在内核启动时,用 ‘pci=nomsi’选项可以禁用PCI MSI中断。这将在整个系统禁用MSI。

  • 否:[PCIE]如果启用了PCIEAER内核配置参数,则可以使用此内核引导选项来禁用对PCIE高级错误报告的使用。
  • nomsi:[MSI]如果启用了PCI_MSI内核配置参数,则此内核引导选项可用于在系统范围内禁用MSI中断的使用。

该指令旨在抑制此类宝贵的错误消息。

环境变量

环 境 变 量解 释 说 明
bootdelay执行自动启动(bootcmd中的命令)的等候秒数
baudrate串口控制台的波特率
netmask以太网的网络掩码
ethaddr以太网的MAC地址
bootfile默认的下载文件名
bootargs传递给Linux内核的启动参数
bootcmd自动启动时执行命令
serveripTFTP服务器端的IP地址
ipaddr本地的IP地址
stdin标准输入设备,一般是串口
stdout标准输出,一般是串口,也可是LCD(VGA)
stderr标准出错,一般是串口,也可是LCD(VGA)

参考资料

  • https://aijishu.com/a/1060000000136710
  • https://blog.csdn.net/qq_28877125/article/details/120785133
  • https://blog.csdn.net/skywalkzf/article/details/7913887
  • https://www.51c51.com/baike/xinxi/5/327083.html
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_Hcoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值