概述:现在有一个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("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名字改成正确的名字,比如我的板子的bootloader的bootcmd指定的kernel文件名为uImage
启动开发板并进入u-boot,将bootcmd改为用tftp下载内核,系统能正常启动,测试成功
转载于:https://blog.51cto.com/mzjxjb/776106