概述:现在有一个Arm开发板,bootloader、内核、文件系统都在nand flash上,要把这三个部分读出来。

 

环境:

       PC上系统为linux系统,任一发行版的OS都可

       PC上已经安装了arm的交叉编译工具,要用到arm-linux-gcc

       PC与开发板通过串口线、网线连接起来;串口作为开发板的控制台,网线在两者之间传输文件

 

一、文件系统:

       文件系统的读取方法比较简单。将板子启动起来,在板子上使用NFS挂载PC上的一个目录。然后把板子根目录下的所有文件和目录都复制到挂载目录中,即可完成文件系统的读取。

 

二、内核:

       内核和bootloader是直接烧写在nand flash上的,他们两个不依赖于文件系统,所以是看不到内核和bootloader这两个文件。这两个的读取原理一致,所以在此只讲内核(即kernel)的读取方法。

 

       Step 1:启动开发板,观察控制台输出,获取板子在启动过程中的输出信息,主要查看内核对nand flash分区的信息,我信息如下:

 

       0x00000000-0x00040000 : "Bootloader"

       0x00040000-0x00400000 : "Kernel"

       0x00400000-0x05400000 : "Rootfs"

       0x05400000-0x10000000 : "File System"

       从上面信息得知,内核(kernel)在nand flash的第1分区(从0分区开始计)上,且这一分区在nand flash上的地址范围是0x40000 – 0x400000

 

       Step 2:启动好后,在控制台上输入 ls –l /dev/mt*

 

       [root@urbetter /]# ls -l /dev/mt*

crw-rw----    1 root     root      90,   0 Mar 13  2000 /dev/mtd0

crw-rw----    1 root     root      90,   1 Mar 13  2000 /dev/mtd0ro

crw-rw----    1 root     root      90,   2 Mar 13  2000 /dev/mtd1

crw-rw----    1 root     root      90,   3 Mar 13  2000 /dev/mtd1ro

crw-rw----    1 root     root      90,   4 Mar 13  2000 /dev/mtd2

crw-rw----    1 root     root      90,   5 Mar 13  2000 /dev/mtd2ro

crw-rw----    1 root     root      90,   6 Mar 13  2000 /dev/mtd3

crw-rw----    1 root     root      90,   7 Mar 13  2000 /dev/mtd3ro

brw-rw----    1 root     root      31,   0 Mar 13  2000 /dev/mtdblock0

brw-rw----    1 root     root      31,   1 Mar 13  2000 /dev/mtdblock1

brw-rw----    1 root     root      31,   2 Mar 13  2000 /dev/mtdblock2

brw-rw----    1 root     root      31,   3 Mar 13  2000 /dev/mtdblock3

       从上面信息看到kernel所在的磁盘分区在linux系统下对应的设备文件是/dev/mtdblock1

      

       Step 3:写一个读取磁盘的程序,将kernelnand flash的对应分区中读出来,我写的代码如下:

 

       文件名    read_kernel.c

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

#include <fcntl.h>

 

#define DEV "/dev/mtdblock1"

 

int main()

{

int fdr = open(DEV, O_RDONLY);

if(fdr == -1)

{

        perror("open dev");

        return -1;

}

 

int fdw = open("p_w_picpath", O_WRONLY | O_CREAT);

if(fdw == -1)

{

        perror("open file");

        return -2;

}

 

char buf[0x3c0000] = {};

 

int cnt = read(fdr, buf, 0x3c0000);

if(cnt < 0)

{

        perror("read");

        return -3;

}

 

if(write(fdw, buf, cnt) < 0)

{

        perror("write");

        return -4;

}

 

close(fdr);

close(fdw);

 

return 0;

}

 

       Setp 4:编译

              arm-linux-gcc read_kernel.c –o read_kernel

 

       step 5:将read_kernel复制到开发板上

              cp read_kernel NFS目录/            将程序拷到PC上可NFS挂载的目录

              mount –t nfs –o nolock PCIP:/NFS目录 /mnt    PC上的NFS目录挂载到/mnt目录

             

       step 6:在开发板上运行read_kernel,生成p_w_picpath

              cd /mnt

              ./read_kernel

              会在mnt目录下生成p_w_picpath文件,这个文件就是我们要的内核镜像文件

 

       Setp 7:测试p_w_picpath是否可用

              PC上把p_w_picpath复制到tftp目录下,并把p_w_picpath名字改成正确的名字,比如我的板子的bootloaderbootcmd指定的kernel文件名为uImage

              启动开发板并进入u-boot,将bootcmd改为用tftp下载内核,系统能正常启动,测试成功