优龙bios 启动linux 笔记

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分区。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值