How to burn Linux Kernel into nor flash and rootfs in USB stick at Mindspeed c1k

本文详细介绍了如何将USB闪存盘格式化为ext3文件系统,并通过复制rootfs目录将其作为Linux系统的根文件系统使用。包括格式化过程、复制文件系统到USB、挂载并初始化USB作为根文件系统等步骤。

1. 启动板子

2. Hit any key to stop autoboot and enter into u-boot env. 进入u-boot环境

3. tftp 81000000 ${kernelimage} #you can also use nfs command in uboot: nfs 81000000 /path/to/${kernelimage};

4. protect off 1:3-127

5. erase 1:3-127

6. cp.b 81000000 20060000 ${filesize} # filesize is hex number

7. norargs=setenv bootargs init=${init_process} root=/dev/uba1

8. boot_nor=run norargs addeth addip addtty;bootm 20060000

9. boocmd=boot_nor

Steps to create rootfs in USB stick and use it as root:

1. format your USB stick to ext3 file system on your host:

sudo mkfs.ext3 /dev/sda1

2. copy rootfs into USB stick

sudo mount /dev/sda1 /mnt

cd /mnt

sudo tar jxvf /path/to/mindspeed_c1000-standard-glibc_std-dist.tar.bz2

cd ../; sudo umount mnt

3. plug USB stick into c1k board

Note: to use USB stick as rootfs device, a kernel option need be enabled:

Device Drivers --->

Block devices --->

Low Performance USB Block driver

### unpack_to_rootfs 函数的作用 `unpack_to_rootfs` 是 Linux 内核中用于解压和加载初始 RAM 磁盘(initrd)或初始 RAM 文件系统(initramfs)的核心函数之一。该函数的主要作用是将压缩的根文件系统镜像解压到临时的根文件系统中,以便在系统启动的早期阶段提供必要的文件系统支持,从而完成内核的初始化过程。这个过程通常发生在内核启动阶段,是启动流程中的关键一步。 在 Linux 内核启动的早期阶段,内核可能无法直接访问实际的根文件系统,因为驱动程序尚未加载或硬件初始化尚未完成。为了应对这种情况,Linux 使用了 initramfs 或 initrd 作为临时的根文件系统。这些镜像通常是压缩的,以减少存储空间和加载时间。`unpack_to_rootfs` 的作用就是解压这些压缩的镜像,并将其内容加载到 rootfs 中,以便后续的挂载操作能够顺利进行。 ### unpack_to_rootfs 函数的代码结构 `unpack_to_rootfs` 函数的代码通常位于 Linux 内核源码的 `init/initramfs.c` 文件中。其基本结构如下: ```c long unpack_to_rootfs(char *buf, unsigned len, int check) { ... } ``` 函数接受三个参数: - `buf`:指向压缩镜像的指针。 - `len`:压缩镜像的长度。 - `check`:一个标志,用于指示是否仅进行解压检查而不实际解压。 函数的核心逻辑包括以下几个步骤: 1. **初始化解压上下文**:创建并初始化解压所需的上下文结构,例如 `struct cpio_data` 和 `struct cpio_string`。 2. **循环读取压缩数据**:通过循环读取压缩数据块,并将其解压到临时缓冲区中。 3. **处理解压后的数据**:将解压后的数据写入到 rootfs 中,创建相应的文件和目录结构。 4. **清理资源**:解压完成后释放相关的资源。 ### 解压过程的关键细节 在解压过程中,`unpack_to_rootfs` 会处理多种压缩格式,例如 gzip、xz 和 lz4 等。内核会根据压缩镜像的头部信息自动判断使用的压缩算法,并调用相应的解压函数。例如,对于 gzip 压缩格式,内核会使用 `inflate` 函数进行解压。 解压过程中,`unpack_to_rootfs` 会逐块读取压缩数据,并将其解压到临时缓冲区中。解压后的数据通常以 cpio 归档格式存储,因此需要进一步解析 cpio 归档的内容。cpio 归档包含文件头和文件数据,文件头描述了文件的类型、权限、大小等信息,而文件数据则需要被写入到 rootfs 中。 ### 根文件系统的加载 解压完成后,`unpack_to_rootfs` 会将解压后的文件内容加载到 rootfs 中。rootfs 是一个基于内存的文件系统,通常由 tmpfs 实现。tmpfs 是一种虚拟文件系统,允许文件和目录存储在内存中,从而提供快速的访问速度。 加载文件内容时,`unpack_to_rootfs` 会根据 cpio 归档中的文件头信息创建相应的文件和目录,并将文件数据写入到对应的文件中。最终,rootfs 中会包含完整的临时根文件系统,包括必要的设备文件、配置文件和可执行程序。 ### 示例代码 以下是一个简化的 `unpack_to_rootfs` 函数的伪代码示例,展示了其核心逻辑: ```c long unpack_to_rootfs(char *buf, unsigned len, int check) { struct cpio_data cpio; struct cpio_string name; char *data; long written = 0; // 初始化解压上下文 cpio_init(&cpio); // 循环读取压缩数据并解压 while ((data = read_next_cpio_block(&cpio, buf, len)) != NULL) { // 解析 cpio 归档 if (parse_cpio_header(data, &name, &cpio) < 0) break; // 创建文件和目录 if (!check) { create_file_in_rootfs(name.str, &cpio); written += cpio.size; } } // 清理资源 cpio_cleanup(&cpio); return written; } ``` ### 相关问题 1. `unpack_to_rootfs` 函数如何处理不同的压缩格式? 2. 解压后的 cpio 归档是如何解析的? 3. rootfs 是如何实现的?它与 tmpfs 有什么关系? 4. 在 Linux 内核启动过程中,`unpack_to_rootfs` 的调用时机是什么时候? 5. 如果解压失败,`unpack_to_rootfs` 会如何处理?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值