arm linux启动是靠uboot来引导的,而u-boot的一个作用就是探测arm内存分区及大小。然后通过tags的形式传递给内核。
这就给了我们对内存分区进行修改或者说自定义的机会。主要有一下三种方法:
一,在u-boot源代码中,通过修改arm板文件的形式来定义内存分区。
分区方法
1)MTD层的分区
2)通过U-boot传递给内核的命令行中的mtdparts=...
3)其他可以让内核知道分区信息的任何办法,(内核默认的命令参数)
下面说到mtdparts,及它的用法:
mtdparts
mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),382
72k(user),256k(env),384k(uboot)要想这个参数起作用,
内核中的mtd驱动必须要支持,即内核配置时需要选上
Device Drivers
mtdparts的格式如下:
因此你在使用的时候需要按照下面的格式来设置:
这有几个需要注意的地方:
当前平台的flash的mtd-id?在bootargs参数列表中,可以指定当前flash的mtd-id,指定 mtdid
s:nand0=gen_nand.1,前面的nand0则表示第一个flash
关信息可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。
U-boot环境变量有两个,他们分别是: bootcmd 和bootargs。
至于在我们自己的at91sam9263ek板子上为了实现mtdparts分区命令的支持需要在U-boot
-2010.06/include/configs/at91sam9263ek.h中添加相关的宏定义:
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
加入MTD分区信息:
#define MTDIDS_DEFAULT "nand0=atmel_nand"
#define MTDPARTS_DEFAULT
保存后退出,回到根目录,重新make
[root@localhost u-boot-2010.06]#make at91sam9263ek_dataflash_cs0_config
[root@localhost u-boot-2010.06]#make all
将重新编译的u-boot.bin烧到dataflash中,使用mtdparts查看分区:
U-Boot> mtdparts
device nand0 <atmel_nand>, # parts = 4
active partition: nand0,0 - (cramfs) 0x00f00000 @ 0x00000000
defaults:
mtdids : nand0=atmel_nand
mtdparts: mtdparts=atmel_nand:15M@0(cramfs),15M(jffs2),30M(yaffs2),-(user)
重新设置分区:
U-Boot> setenv mtdparts mtdparts=atmel_nand:30M@0(a),30M(b),-(c)
U-Boot> save
Saving Environment to dataflash...
U-Boot> mtdparts
device nand0 <atmel_nand>, # parts = 3
active partition: nand0,0 - (a) 0x01e00000 @ 0x00000000
defaults:
mtdids : nand0=atmel_nand
mtdparts: mtdparts=atmel_nand:15M@0(cramfs),15M(jffs2),30M(yaffs2),-(user)
可以看到,我们可以手动设置分区了。最后还要恢复默认。
U-Boot>mtdparts default
二,在u-boot启动后,通过参数mem=xxM的方式告诉内核分区信息。不仅有内存大小,还可以包括分区大小及各个分区的起始位置信息。
对于目前的U-boot而言,是的.而且,
set
事实上,bootargs中的"root=/dev/mtdblockx"只是告诉内核,root
1)
2)
3)
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下: setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下: setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’ 注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下 setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
4). 假设文件系统是基于nfs的,bootargs的设置应该如下 setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs
ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’ 或者 setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
三,在内核源代码中,自定义分区信息。
修改linux-2.6.26.2/arch/arm/plat-s3c24xx/common-smdk.c的smdk_default_nand_part结构数组值,用清单56的内容替代清单55的内容。
static struct mtd_partition smdk_default_nand_part[] = {
};
--------------------------------------------------------------------------------
清单56 修改后smdk_default_nand_part结构数组值
--------------------------------------------------------------------------------
static struct mtd_partition smdk_default_nand_part[] = {
};
--------------------------------------------------------------------------------
6.3.2.
修改linux-2.6.26.2/arch/arm/plat-s3c24xx/common-smdk.c的smdk_nand_info结构的值,用清单58的内容替代清单57的内容。
清单57 修改前smdk_nand_info结构数组值
static struct s3c2410_platform_nand smdk_nand_info = {
};
清单58 修改后smdk_nand_info结构数组值
--------------------------------------------------------------------------------
static struct s3c2410_platform_nand smdk_nand_info = {
};
转载:http://blog.sina.com.cn/s/blog_af9acfc601016j9a.html