arm-linux学习实践过程中的常见问题和坑

时间:2021-01-16 16:33:10

1.init和linuxrc区别?

     linuxrc文件是内核启起来后,进入系统中运行的第一个脚本,用于加载模块驱动等。它运行在init进程之前,退出后才调用init。在嵌入式领域,linuxrc文件一般是一个到bin/busybox的链接。

      linuxrc脚本运行完以后,init程序登场,它初始化控制台后,解析inittab配置文件启动其他程序,从而成为其他进程的老祖宗!

2.uboot环境变量中bootcmd和bootargs之间的区别?

    bootcmd指定了要从flash的哪里读数据,读多少数据,读到内存(一般为SDRAM)的什么地方。再从内存的哪里启动(执行)。

   举个栗子:bootcmd=nand read 30008000 100000 800000;bootm 30008000。其含义是bootcmd从flash的100000(即1M)处开始读800000(即8M)大小的数据到内存的30008000地址处,再从30008000地址处执行代码。
     bootargs是传递给内核启动参数。它是非常重要的一个环境变量,如果传递了错误的参数,内核便会启动失败。
举个栗子:bootargs=noinitrd root=/dev/mtdblock4 rootfstype=jffs2 init=/linuxrc console=ttyS0,115200
此处各参数的含义:
noinitrd:
当系统不是使用ramdisk文件系统(内嵌在内核里的文件系统)启动时,指定使用该参数。
如果使用ramdisk文件系统,需要指定initrd=r_addr,size, r_addr表示initrd在内存中的位置,size表示initrd的大小。
root:
用来指定rootfs(根文件系统)的挂载位置(root=/dev/mtdblock4在第四分区)
可在后面加上权限(如rw)
rootfstype:
当文件系统不是内嵌在内核中,而是与内核一起存放在flash中时(例如jffs2),需指定文件系统类型,否则无法挂载。
init:
init指定的是内核启起来后,进入系统中运行的第一个脚本,一般init=/linuxrc(linuxrc是系统启动时执行的脚本,用于加载模块驱动等,运行在init进程之前,退出后才调用init,一般linuxrc为一个链接,连接到bin/busybox,所以写法不固定)
console:
指定串口终端设备,指定与终端相应的串口波特率,指定之后可用secureCRT之类的终端仿真程序操作开发板。
上述各参数基本上是必须指定的,还有些可选定的参数可自行查找百度。

uboot环境变量除了bootcmd和bootargs之外,其余的变量在移植内核时,很少用到。

3.开发板vfs根文件系统挂载失败:Kernel panic - not syncing: VFS: Unable tomount root fs on unknown-block(2,0)?

      该问题可能由很多原因导致,参考如下:

     1.通过NFS挂载rootfs时,注意PC机上的挂载文件中/etc/init.d/rcS文件中不能出现修改开发板ip的指令,否则很可能导致开发板和PC机不在同一个网段。

        2.uboot环境变量中是否设置了bootcmd和bootargs这两个最重要的系统启动环境变量。

     3.通过NFS挂载rootfs时,注意上位机的被挂载文件中的一些文件的权限必须被设置为可执行权限。可以把整个挂载文件用chmod 777 -R *指令设好权限。

4.arm-linux内核哪个函数负责挂载根文件系统?

  prepare_namespace()这个函数负责挂载根文件系统

未完待续。。。