加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

读出nand flash中的内核、bootloader、文件系统

发布时间:2020-12-15 06:24:41 所属栏目:百科 来源:网络整理
导读:概述:现在有一个 Arm 开发板, bootloader 、内核、文件系统都在 nand flash 上,要把这三个部分读出来。 ? 环境: ?????? PC 上系统为 linux 系统,任一发行版的 OS 都可 ?????? PC 上已经安装了 arm 的交叉编译工具,要用到 arm-linux-gcc ?????? PC 与开

概述:现在有一个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("image",O_WRONLY | O_CREAT);

if(fdw == -1)

{

??????? perror("open file");

??????? return -2;

}

?

char buf[0x 3c 0000] = {};

?

int cnt = read(fdr,buf,0x 3c 0000);

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名字改成正确的名字,比如我的板子的bootloaderbootcmd指定的kernel文件名为uImage

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读