rk3188--3.initramfs_data.cpio的生成及使用
来源:互联网 发布:ubuntu重启网络命令 编辑:程序博客网 时间:2024/05/21 09:54
一. usr目录下initramfs_data.cpio的生成过程1.1 Makefile中控制整个流程
在usr/Makefile中
- cmd_initfs = $(initramfs)-o $@ $(ramfs-args) $(ramfs-input)
- $(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
- $(Q)$(initramfs)-l $(ramfs-input)> $(obj)/.initramfs_data.cpio.d //a.
- $(call if_changed,initfs) //b.
/bin/bash /rk/rk3188/kernel/scripts/gen_initramfs_list.sh -l -d > usr/.initramfs_data.cpio.d
作用: (没有什么实际的作用)
在文件usr/.initramfs_data.cpio.d中写入
deps_initramfs := /rk/rk3188/kernel/scripts/gen_initramfs_list.sh \
b. 就是执行cmd_initfs
/bin/bash /rk/rk3188/kernel/scripts/gen_initramfs_list.sh -o usr/initramfs_data.cpio -d
作用:
调用脚本 gen_initramfs_list.sh -o是生成的文件 -d是打印目录
1.2分析脚本gen_initramfs_list.sh
Makefile中的调用:
/bin/bash /rk/rk3188/kernel/scripts/gen_initramfs_list.sh -o usr/initramfs_data.cpio -d
- #!/bin/sh
- set -e
- default_initramfs() { //将默认的目录文件列表写入到临时的cpiolist中
- cat <<-EOF>> ${output}
- # This is a very simple, default initramfs
- dir /dev 0755 0 0
- nod /dev/console 0600 0 0 c 5 1
- dir /root 0700 0 0
- # file /kinit usr/kinit/kinit 0755 0 0
- # slink /init kinit 0755 0 0
- EOF
- }
- arg="$1"
- case "$arg" in
- "-o") # generate compressed cpio image named $1
- shift
- output_file="$1" //output_file= usr/initramfs_data.cpio
- cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)" //生成临时的cpiolist文件名
- output=${cpio_list}
- echo "$output_file" | grep -q "\.cpio$" && compr="cat" //如果output_file中有cpio字样
- shift //compr=cat
- ;;
- esac
- while [ $# -gt 0]; do
- arg="$1"
- shift
- case "$arg" in
- "-d") //生成默认initramfs的目录文件列表
- default_list="$arg"
- default_initramfs
- ;;
- esac
- done
- if [! -z ${output_file}]; then
- if [ -z ${cpio_file} ]; then
- cpio_tfile="$(mktemp ${TMPDIR:-/tmp}/cpiofile.XXXXXX)" //生成临时的cpio文件名
- #usr/gen_init_cpio /tmp/cpiolist.hWjXZa > /tmp/cpiofile.c6tWD2
usr/gen_init_cpio ${cpio_list} > ${cpio_tfile} //按照cpiolist的内容生成cpio文件 - fi
- rm ${cpio_list}
- if [ "${is_cpio_compressed}" = "compressed" ]; then
- cat ${cpio_tfile} > ${output_file} //不执行
- else
- #将临时的cpio文件,写入到正式的cpio文件中(usr/initramfs_data.cpio)
- (cat ${cpio_tfile} | ${compr} - > ${output_file}) || (rm -f ${output_file} ; false)
- fi
- [ -z ${cpio_file} ] && rm ${cpio_tfile}
- fi
- exit 0
a. 生成默认的cpiolist
b. 按照默认的cipiolist中的内容,生成/tmp/cpiofile.c6tWD
c. 将这个/tmp/cpiofile.c6tWD复制成usr/initramfs_data.cpio
1.3分析gen_init_cpio
gen_int_cpio的调用过程:
usr/gen_init_cpio /tmp/cpiolist.hWjXZa > /tmp/cpiofile.c6tWD2
其中/tmp/cpiolist.hWjXZa的内容如下:
- # This is a very simple, default initramfs
- dir /dev 0755 0 0
- nod /dev/console 0600 0 0 c 5 1
- dir /root 0700 0 0
- # file /kinit usr/kinit/kinit 0755 0 0
- # slink /init kinit 0755 0 0
- int main(int argc, char*argv[])
- {
- FILE *cpio_list;
- char line[LINE_SIZE];
- char *args,*type;
- int ec = 0;
- int line_nr = 0;
- const char *filename;
- default_mtime = time(NULL);
- ... //省略解析参数部分,因为调用时只有一个参数filename
- filename = argv[optind];
- FILE* cpio_list = fopen(filename,"r"); //打开cpiolist
- //进行cpiolist的解析
- while (fgets(line, LINE_SIZE, cpio_list)){ //每次读取一行
- int type_idx;
- size_t slen = strlen(line);
- line_nr++;
- if ('#'==*line) //跳过注释行
- continue;
- //分别解析出类型与文件
- type = strtok(line," \t"); //每行中" \t"以前的字符串代表类型
- args = strtok(NULL,"\n"); //剩下的是文件
- //调用与type相同项的函数指针,进行打包
- for (type_idx = 0; file_handler_table[type_idx].type; type_idx++){
- if (! strcmp(line, file_handler_table[type_idx].type))
- file_handler_table[type_idx].handler(args); //打包过程就不多说了,
- break;
- }
- }
- if (ec == 0)
- cpio_trailer(); //最后加上trailer
- }
http://blog.chinaunix.net/uid-26009923-id-4068594.html
二.将initramfs_data.cpio的编译进内核
2.1 initramfs_data.cpio的链接过程
在usr/initramfs_data.S中
- //将initramfs_data.cpio放在.init.ramfs这个section中
- .section.init.ramfs,"a"
- __irf_start:
- .incbin __stringify(INITRAMFS_IMAGE) //incbin将整个文件都包括进来
- __irf_end:
- //在init.ramfs.ramfs这个section中定义了size变量代表cpio文件的长度
- .section .init.ramfs.info,"a"
- .globl VMLINUX_SYMBOL(__initramfs_size)
- VMLINUX_SYMBOL(__initramfs_size):
- #ifdef CONFIG_64BIT
- .quad __irf_end - __irf_start
- #else
- .long __irf_end - __irf_start //没有64位支持就是个long
- #endif
- AFLAGS_initramfs_data.o+=-DINITRAMFS_IMAGE="usr/initramfs_data.cpio$(suffix_y)"
在arch/arm/kernel/vmlinux.lds中定义了section .init.ramfs 和.init.ramfs.info
- . = ALIGN(4); __initramfs_start= .;*(.init.ramfs). = ALIGN(8);*(.init.ramfs.info)
__initramfs_start是initramfs_data.cpio在内存中的首地址, __initramfs_size是initramfs_data.cpio的长度
四.initramfs_data.cpio在内核中解压缩
0 0
- rk3188--3.initramfs_data.cpio的生成及使用
- rk3188--3.initramfs_data.cpio的生成及使用
- rk3188 mkimage.sh及cpio打包过程分析
- rk3188--1.mkimage.sh及cpio打包过程分析
- cpio的使用
- cpio命令的使用
- 生成CPIO格式的initrd
- cpio使用
- Linux系统常用的cpio命令及scp命令
- rk3188+gps模组的调试
- linux 下cpio使用
- 使用rpm2cpio,cpio提取rpm包的中的特定文件
- 使用rpm2cpio,cpio提取rpm包的中的特定文件
- 使用cpio解压2.6内核的initrd.img
- 使用cpio解压2.6内核的initrd.img
- 使用cpio命令导致系统几乎崩溃的一次经历
- cpio 命令的用法
- cpio的用法
- 如何在VC中调用CLAPACK
- Android APK插件化——第三方专门做APK插件化的公司
- JAVA多线程和并发性知识点总结
- php匿名函数
- linux-centos65-jdk安装-亲测可用
- rk3188--3.initramfs_data.cpio的生成及使用
- tomcat配置https 单向 以及 双向 验证
- Android中AsyncTask的处理后台耗时操作(如list排序,进度加载)
- 一小时搞定DIV+CSS布局-固定页面开度布局
- oracle学习笔记 ---- 子查询
- js的调用
- Struts2中的配置问题
- Andriod Fragment——给Activity添加一个Fragment
- 【转】 只能输入数字, 正则限制input框只能输入数字,英文等