今天调试redboot和内核的心得

调试redboot和内核的心得

1、Linux内核MTD驱动获取flash布局的方式:
1)利用redboot
内核支持Redboot建立的flash分区表,在编译内核时打开下面选项:

#支持Redboot的FIS分区表
CONFIG_MTD_REDBOOT_PARTS=y
#FIS分区表存放在flash倒数第二个block中
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2

在Device Drivers -> MTD ->RedBoot partition table parsing

2)利用内核命令行,比如:

console=ttyS0,115200  root=31:02 rootfstype=jffs2 mtdparts=ar7100-nor0:256k(boot),0x130000(kernel),0x600000(jffs2),-(config) init=/sbin/init

指定root在MTD的第3个分区(31为MTD设备号,02表示第3个分区),rootfs的文件系统格式为jffs2,MTD分区为ar7100-nor0的Flash设
备,第一个分区为boot,大小为256k,第2个分区为kernel,大小为0x130000,第3个分区为jffs2文件系统,大小为0x600000,剩下的为
config配置分区。

注意:指定这些分区大小时,要以Flash的block大小对齐,比如64k的Block大小就必须能被0x10000整除,否则内核启动后这些没有对
block对齐的分区将被限制为只读,以便擦除到别分区的内容。

需要打开内核编译选项:

CONFIG_MTD_CMDLINE_PARTS=y

也就是menuconfig中MTD下的“Command line partition table parsing ”

2、Redboot的启动脚本中传递命令行参数给内核
使用exec -c 选项,例如:

fis load -d vmlinux
exec -c "console=ttyS0,115200  root=31:02 rootfstype=jffs2 mtdparts=ar7100-nor0:256k(boot),0x130000(kernel),0x600000(jffs2),-(config) init=/sbin/init"


3、如何使jffs2的根文件系统可写
在rootfs的/etc/init.d/rcS中加入:

mount -a
mount -o remount +w /

第一个命令是mount /etc/fstab中的内容(如果/etc/fstab存在的话),第二个命令为重新mount根文件夹为可写。
示例:
# cat /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / jffs2 ro 0 0
null /proc proc rw 0 0
none /tmp ramfs rw 0 0
none /var ramfs rw 0 0
# mount -o remount +w /
# mount
rootfs on / type rootfs (rw)
/dev/root on / type jffs2 (rw)
null on /proc type proc (rw)
none on /tmp type ramfs (rw)
none on /var type ramfs (rw)

4、创建可写的/tmp和/var

  mount -t ramfs -n none /tmp
  mount -t ramfs -n none /var
 
5、jffs2文件系统的创建
mkfs.jffs2 --root=/nfsroot --eraseblock=0x10000 -b -D dev.txt --squash -o rootfs-jffs2 --pad=0x600000

把/nfsroot下的文件打包为rootfs-jffs2文件,-b参数指定大端字节模式,--squash参数忽略要打包文件的权限属性,
设置root为这些文件的属主,--pad=0x600000参数指定填充打包后的文件为0x600000大小,-D指定打包的/dev目录来自
dev.txt文件,--eraseblock=0x10000指定擦除块大小为64k。

注意:一定要加--pad参数来指定jffs2文件系统的大小,否则mount后就会发现该文件系统已经满了,无法创建任何文件。

dev.txt文件的内容:
/dev/tty        c       666     0       0       5  0
/dev/console    c       666     0       0       5  1
/dev/mem        c       666     0       0       1  1
/dev/kmem       c       666     0       0       1  2
/dev/null       c       666     0       0       1  3
/dev/random     c       666     0       0       1  8
/dev/urandom c  666 0   0   1  9
/dev/zero       c       666     0       0       1  5
/dev/ptmx       c       666     0       0       5  2    1       10
/dev/ptyp0      c       666     0       0       2  0    1       10
/dev/ptyp1      c       666     0       0       2  1    1       10
/dev/ptyp2      c       666     0       0       2  2    1       10
/dev/ram0       b       666     0       0       1  0    1       4
/dev/tty0       c       666     0       0       4  0    1       10
/dev/tty1       c       666     0       0       4  1    1       10
/dev/tty2       c       666     0       0       4  2    1       10
/dev/ttyS0      c       666     0       0       4  64   1       2
/dev/ttyS1      c       666     0       0       4  65   1       2
/dev/ttyS2      c       666     0       0       4  66   1       2
/dev/ttyp0      c       666     0       0       3  0    1       10
/dev/ttyp1      c       666     0       0       3  1    1       10
/dev/ttyp2      c       666     0       0       3  2    1       10
/dev/mtd0       c       666     0       0       90  0   1       4
/dev/mtdr0      c       666     0       0       90  1   1       4
/dev/mtdblock0  b       666     0       0       31  0   1       4
/dev/mtdblock1  b       666     0       0       31  1   1       4
/dev/mtdblock2  b       666     0       0       31  2   1       4
/dev/mtdblock3  b       666     0       0       31  3   1       4
/dev/mtdblock4  b       666     0       0       31  4   1       4
/dev/mtdblock5  b       666     0       0       31  5   1       4
/dev/mtdblock6  b       666     0       0       31  6   1       4

如果在/etc/fstab没有
devpts  /dev/pts        devpts  defaults        0 0
则需要增加以下内容供telnetd使用:
/dev/pts/0      c       666     0       0       136 0
/dev/pts/1      c       666     0       0       136 1
/dev/pts/2      c       666     0       0       136 2
/dev/pts/3      c       666     0       0       136 3
/dev/pts/4      c       666     0       0       136 4
/dev/pts/5      c       666     0       0       136 5

6、如何建立嵌入式系统中的passwd, group, shadow等文件

在编译busybox时如果不选择shadow功能将不需要shadow文件。
这些文件至少要包含 root用户的定义,如下所示:
passwd:
root:x:0:0:root:/root:/bin/sh

group:
root:x:0:

shadow:
root::12179:0:99999:7:::其中,如果shadow (对于不支持shadow的系统则是passwd )文件的第一个冒号和第二个冒号之间没有内容,表示这个用户登录不需要密码。如果需要设定密码或者增加新的登录用户,就可以参考开发主机上的相应文件,或者在目标系统启动之后用passwd命令和adduser命令完成。

给目标机起一个名字,在/etc目录下建立文件hostname,将起好的名字写到里面。在启动脚本rcS,通过hostname命令把文件的内容设置为机器名。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值