深入理解bootargs
在嵌入式系统中,bootargs是非常重要的参数。它保存着Linux内核启动的相关信息,如启动参数和控制台信息等。而在ARM架构的系统中,bootargs参数则是在U-Boot引导时设置的。
一、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) |
参考资料
- 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
更多推荐
所有评论(0)