struct param_struct {
union {
struct {
unsigned long page_size; /* 0 */
unsigned long nr_pages; /* 4 */
unsigned long ramdisk_size; /* 8 */
unsigned long flags; /* 12 */
#define FLAG_READONLY 1
#define FLAG_RDLOAD 4
#define FLAG_RDPROMPT 8
unsigned long rootdev; /* 16 */
unsigned long video_num_cols; /* 20 */
unsigned long video_num_rows; /* 24 */
unsigned long video_x; /* 28 */
unsigned long video_y; /* 32 */
unsigned long memc_control_reg; /* 36 */
unsigned char sounddefault; /* 40 */
unsigned char adfsdrives; /* 41 */
unsigned char bytes_per_char_h; /* 42 */
unsigned char bytes_per_char_v; /* 43 */
unsigned long pages_in_bank[4]; /* 44 */
unsigned long pages_in_vram; /* 60 */
unsigned long initrd_start; /* 64 */
unsigned long initrd_size; /* 68 */
unsigned long rd_start; /* 72 */
unsigned long system_rev; /* 76 */
unsigned long system_serial_low; /* 80 */
unsigned long system_serial_high; /* 84 */
unsigned long mem_fclk_21285; /* 88 */
} s;
char unused[256];
} u1;
union {
char paths[8][128];
struct {
unsigned long magic;
char n[1024 - sizeof(unsigned long)];
} s;
} u2;
char commandline[COMMAND_LINE_SIZE];
};
结论: 丢一些参数 到 固定内存位置,然后, 从nandflash加载内核和文件系统.
struct param_struct *params = (struct param_struct *)0x30000100;
"root=/dev/mtdblock2 init=/linuxrc load_ramdisk=0 console=ttySAC0,0 mem=0x04000000K devfs=mount %s",
//最后调用函数,就是启动linux内核, 传递给内核2个函数参数 : 第一个为0 ,第二个为机器码
call_linux(0, boot_params.machine.val, buf);
问题 :内核 怎么知道哪里为文件系统的开始的位置,只是告诉内核nandflash有多少个页 ,一个页有多大.
内核怎么知道要传递的参数放在 0x30000100 位置?
答:
NAND闪存支持两种分区形式,一种是MTD分区格式,另一种是BON分区格式。MTD技术
实现对内存设备支持的统一接口,提供FLASH设备到字符设备和块设备的驱动的转换,包含
对各种不同类型NOR、NAND FLASH等的支持。BON文件系统是韩国mizi公司提供的NAND F
LASH块设备驱动。通常多采用MTD分区格式。对NAND设备分区可以通过bootloader完成,
如常用的mizi公司的vivi可用part相关命令进行分区,并可用part show查看mtdpart
信息,如图2所示。
图2 在vivi中查看NAND闪存的MTD分区信息
该分区信息将和Linux系统中/dev/mtd目录下的分区信息相对应,其中vivi、param、
kernel、root分区分别依次对应为mtd/0、mtd/1、mtd/2 、mtd/3。编译内核时候,内核源
代码中NAND分区信息必须和实际的NAND设备分区信息一致, 否则YAFFS文件系统移植后将
无法正确挂载。内核源代码中关于NAND设备MTD分区信息在/drivers/mtd/nand/smc_s3c2
410.c中。根据bootloader中查看的信息修改 smc_s3c2410.c中mtd分区信息如下:
static struct mtd_partition smc_partitions[] =
… …
name: "vivi",
size: 0x20000, //0x000c0000,
… …
name: "param",
size: 0x10000, //0x00a00000,
… …
name: "kernel",
size: 0x100000, //0x000c0000,
… …
name: "root",
size: 0x03ec8000, //0x00a00000,
… …
完成以上步骤的修改后,即可以开始编译内核。编译内核时,在配置内核时需
AFFS、NAND、MTD等相关支持选项。编译成功后得到的是支持YAFFS文件系统的新
新内核下载到NAND闪存中的kernel分区。