zoukankan      html  css  js  c++  java
  • nand烧写分析/内核在启动过程中式如何将这个文件映射成/目录及各子目录的?

    我用的是ramdisk.image.gz,烧写在flash的0x10140000处
    我不太明白内核在启动过程中式如何将这个文件映射成/目录及各子目录的?
    如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊?

    答:

    你的问题,要分2方面和你解释:

    1.将这个文件映射成/目录及各子目录的
    不是将这个文件映射根目录成及各子目录的,
    而是对应的根文件系统,简称rootfs(root file system),
    对应着/根目录及其各个子目录和文件。

    发现要解释清楚,要简单说清楚整个系统启动的过程:
    【系统启动过程简介】
    初始化代码读取uboot到内存里面,然后跳转到uboot那里去执行uboot,
    uboot初始化必要的硬件,加载一些驱动,其中包括nand flash的驱动,
    然后根据你的uboot里面设置的一个启动命令:

    nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
    意思就是,先去读取nand flash,从0x100000开始,长度为0x200000的数据到memory的0x30007FC0处,
    然后bootm表示从memory的0x30007FC0开始运行。
    也就是去运行你的内核镜像了。
    此处也就是你的ramdisk.image.gz。
    而你的地址是0x10140000,所以,上面中的启动命令,至少0x100000要改成你的地址0x10140000。
    然后,内核会自己解压缩,然后执行,
    初始化硬件,
    加载驱动模块,
    最后去挂载rootfs,
    而此文件系统是什么格式的,是从uboot里面定义的:
    #define CONFIG_BOOTARGS   "root=/dev/mtdblock2 rw init=/linuxrc console=ttyS0,115200 mem=16M rootfstype=yafffs2"
    并在从uboot掉转到内核运行时候,传递给内核的,
    这样内核在加载rootfs的时候,才知道,要以什么格式,比如上面的yaffs2格式,
    去加载此文件系统。
    此文件系统,也是你实现自己用相应的文件系统制作工具,制作的,然后烧写到对应的位置的。
    上面中root=/dev/mtdblock2,表示,要去/dev/mtdblock2,也就是你的mtd的第3个分区,去加载。
    而这里的mtd的第3个分区具体对应的nand flash中的的地址,
    是你在内核中,一般是在core.c自己定义的的nand flash的分区。
    一般是uboot是第一个分区,内核kernel是第二个,然后就是rootfs是第三个分区,也就是/dev/mtdblock2。
    随便网上给你找个别人的分区:
    static struct mtd_partition rm9200_partitions[3] =
    {
            {        /* uboot 256K */
                    .name = "uboot",
                    .size = 0x40000,
                    .offset = 0
            },
            {        /* kernel 1.768M */
                    .name = "kernel",
                    .size = 0x1C0000,
                    .offset = 0x40000
            },
            {        /* rootfs 2M */
                    .name = "rootfs",
                    .size = 0x200000,
                    .offset = 0x200000
            },
    };

    如果按照上面分区,定义的/dev/mtdblock2的起始地址是0x200000,还算成大小是2M的位置,
    然后,内核启动挂载rootfs的时候,就是,以上面从uboot传过来的参数中yaffs2格式,
    到nand flash 的2M的地址读取并加载rootfs,
    加载完成后,这样,里面对应的,你说的根目录,以及所有的文件,文件夹就都可以识别了。
    然后才会去读取并运行初始化脚本相关的东西,
    最后初始化console控制台,然后你才能看到那个常见的#,才可以输入命令,比如ls,才可以和系统交互。

    所以,你说的位置或地址如何映射成/根目录的,实际就是这个rootfs,对应着mtdblock2,
    对应的某个nand flash上的地址,比如此处的2M的地方。而不是内核kernel这个文件映射的。

    内核kernel,对应着是分区里面的mtdblock1,比如上面的地址0x40000。

    2.
    如果ramdisk.image.gz在flash中的位置发生了变化,应该如何修改内核啊?
    如果地址变化了,那么
    uboot中定义的启动参数:
    nand read 0x30007FC0 0x100000 0x200000;bootm 0x30007FC0
    中的0x100000就要换成你的新的地址就可以了。

    例子,kermit烧写

    Linux 系统的烧写


          Uboot的烧写***烧写内核***烧写文件系统


    1> Uboot的烧写(把Uboot写入NAND-FLASH中地址0x30000000)


    步骤:


    把开发板与PC机连接好


    打开H-JTAG中的H-Flasher


    ·在1.Flash-Selection中的NAND-FLASH中选择S3C2440+K9F1G08


    ·在2.Configuration中的RAN Start Address中写入0x30000000


    ·在5.Programming中选择Check(擦除),Reset(复位)


    ·在Program中选择目标文件最后选择Program进行烧写。


    2>在超级终端中操作:


    指定内存中内核地址为0x33000000,内核在Nand起始地址为0x60000 ,大小为0x3a0000.


    内存中文件系统地址为0x30008000,文件系统在Nand起始地址为0x500000 ,大小为0x3e00000.


    串口烧写: 
         命令步骤:


    1>烧写内核


    loadb 0x33000000      //通过串口下载内核


                     //同时在超级终端的发送框中以kermit协议发送uImage文件


    nand erase 0x60000 0x3a0000   //擦除指定的flash区域


    nand write 0x33000000 0x60000 0x3a0000
                //将指定的内存区域内容写至flash指定位置




    2>烧写文件系统


    loadb 0x30008000        //通过串口下载文件系统


                //同时在超级终端的发送框中以kermit协议发送root.cramfs文件


    nand erase 0x500000 0x3e00000   //擦除指定的flash区域


    nand write 0x30008000 0x500000 0x3e00000    
                     //将指定的内存区域内容写至flash指定位置


    3>设置环境变量
    setenv bootargs root=/dev/mtdblock2 console=ttySAC0 init=/linuxrc 


    saveenv   //保存变量设置


    reset   //重启




    4>开启Linux系统


    nand read 0x33000000 0x60000 0x3a0000    
                    //从指定的flash区域读到内存指定位置


    bootm 0x33000000         //引导uImage内核


    5>进入系统


    网络烧写: 
         命令步骤:


    先用printfenv查看一下设备的server IP


    把PC机IP修改成server IP 打开tftp服务器


    1>烧写内核


    tftp 0x33000000 uImage  


                       //通过网口下载内核发送uImage文件


    nand erase 0x60000 0x3a0000   //擦除指定的flash区域


    nand write 0x33000000 0x60000 0x3a0000
                            //将指定的内存区域内容写至flash指定位置




    2>烧写文件系统


    tftp 0x30008000    root.cramfs   


                      //通过网口下载文件系统发送root.cramfs文件


    nand erase 0x500000 0x3e00000   //擦除指定的flash区域


    nand write 0x30008000 0x500000 0x3e00000    
                              //将指定的内存区域内容写至flash指定位置


    3>设置环境变量
    setenv bootargs root=/dev/mtdblock2 console=ttySAC0 init=/linuxrc 


    saveenv   //保存变量设置


    reset   //重启




    4>开启Linux系统


    nand read 0x33000000 0x60000 0x3a0000    
                                 //从指定的flash区域读到内存指定位置


    bootm 0x33000000    //引导uImage内核


    5>进入系统

  • 相关阅读:
    设计模式课程 设计模式精讲 2-1 本章导航
    数字 日期 格式化方法
    jQuery事件委托之Safari失效的解决办法--摘抄
    css3鼠标点击穿透--摘抄
    字符串日期转换为周
    在echars上发布的半圆环形图
    一些框架源码中的代码
    webSQL 增删改查
    Android 根据版本号更新
    Android 永久保存简单数据
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3306509.html
Copyright © 2011-2022 走看看