读出nand flash中的内核、bootloader、文件系统
概述:现在有一个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:写一个读取磁盘的程序,将kernel从nand 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("image",O_WRONLY | O_CREAT); if(fdw == -1) { ??????? perror("open file"); ??????? return -2; }
?
char buf[0x
?
int cnt = read(fdr,buf,0x
if(cnt < 0) { ??????? perror("read"); ??????? return -3; }
?
if(write(fdw,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,生成image ????????????? cd /mnt ????????????? ./read_kernel ????????????? 会在mnt目录下生成image文件,这个文件就是我们要的内核镜像文件
?
?????? Setp 7:测试image是否可用 ????????????? 在PC上把image复制到tftp目录下,并把image名字改成正确的名字,比如我的板子的bootloader的bootcmd指定的kernel文件名为uImage ????????????? 启动开发板并进入u-boot,将bootcmd改为用tftp下载内核,系统能正常启动,测试成功 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |