深入理解bootargs

简介: 深入理解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 flash 16MByte~32MByte mtdX none (built-in)
nand Flash 128MByte+ 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卡本质上就是emmc root=/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 自动启动时执行命令
serverip TFTP服务器端的IP地址
ipaddr 本地的IP地址
stdin 标准输入设备,一般是串口
stdout 标准输出,一般是串口,也可是LCD(VGA)
stderr 标准出错,一般是串口,也可是LCD(VGA)

目录
相关文章
|
6月前
|
缓存 安全 SoC
来看看ARM gicv2/gicv3的详解
来看看ARM gicv2/gicv3的详解
475 0
|
6月前
|
Linux Go SoC
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
266 0
|
Ubuntu Linux 网络安全
RK3588 开发板上根文件系统导出并制作img镜像
RK3588 开发板上根文件系统导出并制作img镜像
2298 1
|
6月前
|
安全 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 重启 reboot命令 使用指南
253 0
|
存储 缓存 算法
内存分配不再神秘:深入剖析malloc函数实现原理与机制
内存分配不再神秘:深入剖析malloc函数实现原理与机制
|
运维 前端开发 关系型数据库
高效调试与分析:利用ftrace进行Linux内核追踪(上)
高效调试与分析:利用ftrace进行Linux内核追踪
|
6月前
|
Linux 开发工具 异构计算
【ZYNQ】QSPI Flash 固化程序全攻略
【ZYNQ】QSPI Flash 固化程序全攻略
1082 0
|
6月前
|
存储 Linux Android开发
Android存储分区与Rockchip平台的分区命名及U-Boot配置
Android存储分区与Rockchip平台的分区命名及U-Boot配置
194 0
|
6月前
|
Ubuntu Linux 开发工具
U-Boot 中使用 nfs 命令加载文件报错指南
U-Boot 中使用 nfs 命令加载文件报错指南
296 0
|
Linux Go
[飞腾]Trace32使用概述(2)
[飞腾]Trace32使用概述(2)
693 0
[飞腾]Trace32使用概述(2)