调试redboot和内核的心得--MTD partition相关

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命令把文件的内容设置为机器名。

 

 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值