rootfs文件_clang编译android内核

rootfs文件_clang编译android内核ramdisk.img是编译Android生成的一个镜像文件,最后和kernel一起打包生成boot.img镜像。ramdisk.img中主要是存放android启动后第一个用户进程init可执行文件和init.*.rc等相关启动脚本以及sbin目录下的adbd工具。fileramdisk.img//ramdisk.img:gzipcompresseddata,fromUnix看出为g…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

ramdisk.img是编译Android生成的一个镜像文件,最后和kernel一起打包生成boot.img镜像。ramdisk.img中主要是存放android启动后第一个用户进程init可执行文件和init.*.rc等相关启动脚本以及sbin目录下的adbd工具。

file ramdisk.img

//ramdisk.img: gzip compressed data, from Unix

看出为gzip压缩过的文件,将ramdisk.img重命名为ramdisk.img.gz .

mv ramdisk.img ramdisk.img.gz

gunzip ramdisk.img.gz

file ramdisk.img

//ramdisk.img: ASCII cpio archive (SVR4 with no CRC)

cpio -i -F ramdisk.img

rootfs之所以存在,是因为需要在VFS机制下给系统提供最原始的挂载点。

1.initrd (init:initialized, rd:ramdisk)

在早期的linux系统中,一般只有硬盘或者软盘被用来作为linux根文件系统的存储设备,因此也就很容易把这些设备的驱动程序集成到内核中。但是现在的嵌入式系统中可能将根文件系统保存到各种存储设备上,包括scsi、sata,u-disk等等。因此把这些设备的驱动代码全部编译到内核中显然就不是很方便。

为了解决这一矛盾,于是出现了基于ramdisk的initrd( bootloader initialized RAM disk )。Initrd是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。当系统启动的时候,bootloader会把initrd文件读到内存中,然后把initrd文件在内存中的起始地址和大小传递给内核

内核在启动初始化过程中会解压缩initrd文件,然后将解压后的initrd挂载为根目录,

然后执行根目录中的/linuxrc脚本(cpio格式的initrd为/init,而image格式的initrd为/initrc),

2.Initramfs

initramfs,它的作用和initrd类似,只是和内核编译成一个文件(该initramfs是经过gzip压缩后的cpio格式的数据文件),该cpio格式的文件被链接进了内核中特殊的数据段.init.ramfs上

其中全局变量__initramfs_start和__initramfs_end分别指向这个数据段的起始地址和结束地址。内核启动时会对.init.ramfs段中的数据进行解压,然后使用它作为临时的根文件系统。

支持initrd的内核配置(需要内核支持内存盘驱动):

General setup->Initial RAM filesystem and RAM disk(initramfs/initrd) support

RamDisk内存盘驱动

Device Drivers->Block devices->RAM block device support

启动参数

Boot options->Default kernel command string

填写如下:mem=32M console=ttySAC0 root=/dev/ram initrd=0xc1000000,0x00600000 ramdisk_size=8192 rw

cpio

cpio 可以从 cpio 或 tar 格式的归档包中存入和读取文件, 归档包是一种包含其他文件和有关信息的文件。 有关信息包括:文件名, 属主, 时标(timestamp), 和访问权限。 归档包可以是磁盘上的 其他文件, 也可以是磁带或管道。

cpio命令有三种操作模式:copy-out、copy-in、copy-pass,生成 ramdisk.img 用的是它的copy-out模式,即把文件打包的操作模式。cpio的copy-out操作模式使用 -o 命令行选项指定

cd ~/root

find . | cpio -o -Hnewc |gzip -9 > ../image.cpio.gz

rootfs 启动过程

rootfs是ramfs或tmpfs的一种实例,它不能被umount,对于内核而言,rootfs体积小且简单,主要用于确保某些目录不能为空。

ramfs是一种非常简单的RAM系统,它基于linux系统硬盘缓冲机制,可以动态改变大小。

__init start_kernel(void)

vfs_caches_init_early();

dcache_init_early();

inode_init_early();

–> vfs_caches_init(num_physpages);

dcache_init();

inode_init();

files_init(mempages);

–> mnt_init();

–> init_rootfs();

–> init_mount_tree();

以上代码中,从start_kernel开始,初始化虚拟文件系统,包括dcache、inode初始,创建内核对象fs,然后开始初始化rootfs。

内核挂载rootfs之后需要将ramdisk中的解压到rootfs中,因此内核必须知道ramdisk在内存上的地址。已知有三种方式可以通知内核ramdisk的位置。

1.通过cmdline传入

2.bootloader 通过setup_initrd_tag函数把initrd_start设置到内核 tag中,内核通过parse_tag解析

init_mount_tree(void)

vfs_kern_mount(type, 0, “rootfs”, NULL);

rootfs_mount(struct file_system_type *fs_type,

//内核就把rootfs挂载起来了,此时rootfs还是个空目录,并且只有一个根目录‘/’。

do_initcalls(void)

define rootfs_initcall(fn) __define_initcall(“rootfs”,fn,rootfs)

populate_rootfs(void)

unpack_to_rootfs

//unpack_to_rootfs会先解压ramdisk成一个cpio文件,然后解析解析cpio文件中所有文件,并生成对应的文件到rootfs中

ramdisk的制作

out/host/linux-x86/bin/mkbootfs out/target/product//root | out/host/linux-x86/bin/minigzip > out/target/product//ramdisk.img

上述命令分两步进行:

out/host/linux-x86/bin/mkbootfs out/target/product/*/root

生成一个cpio文件,利用cpio 可将文件或目录从文件库获取出来或将散列文件拷贝到文件库。

out/host/linux-x86/bin/minigzip

将生成的cpio文件压缩成一个gzip格式的文件“out/target/product/*/ramdisk.img“

mkbootfs

mkbootfs 生成ramdisk.img ( 源码在system/core/cpio)

$(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@

mkbootimg

mkbootimg的源代码在system/core/mkbootimg中。

mkbootimg –kernel kernel –ramdisk ramdisk.img –output /tmp/boot.img

minigzip

minigzip的源代码在external/zlib中。

fs_config

源码位于:build/tools/fs_config。

其中的fs_config.c包含了system/core/include/private/android_filesystem_config.h,真正权限配置和fs_config的实现都在这个头文件中。

signapk

signapk的源码位于:build/tools/signapk。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184929.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • IT学生学习指南

    IT学生学习指南本文主要为了计算机相关专业的学生而写。内容是从本博主的工作经验和教学经验当中总结出来的一些干货,涵盖了从大一到大四期间学生所遇到的常见问题,包括如何找到满意的工作、如何选择适合自己的工作岗位、如何制定自己的学习计划、如何分辨自身适合考研还是就业、女生的IT之路怎么走、如何锻炼自己的技术等等大学生最关心的问题。如果大家觉得文本值得一看,那就请推荐给身边那些还在迷茫中的孩子们吧!

    2022年6月4日
    22
  • c中给字符数组,字符串指针赋值的方法总结[通俗易懂]

    在写程序的时候,总是搞混,现在总结一下以免以后再犯chara[10];怎么给这个数组赋值呢?谭浩强的书上明确指出,字符数组可以在定义时整体赋值,不能再赋值语句中整体赋值。1、定义的时候直接用字符串赋值chara[10]=”hello”;注意:不能先定义再给它赋值,如chara[10];a[10]=”hello”;这样是错误的!2、对数组中字符逐个赋值chara

    2022年4月15日
    49
  • kvm虚拟机xml文件在哪里_爱快kvm虚拟机

    kvm虚拟机xml文件在哪里_爱快kvm虚拟机virshxml创建kvm虚拟机准备工作sudoapt-getupdatesudoapt-getinstallqemu-kvmsudoapt-getinstallvnc4serversudoapt-getinstallbridge-utils增加网卡内容如下:root@zhangji16vm:/home/prj1#cat/etc/network/in…

    2022年8月11日
    4
  • hibernate.hbm2ddl.auto=update不能自动生成表结构[通俗易懂]

    在写上篇文章《spring整合springmvc和hibernate》的时候,曾遇到一个问题说是表t_user不存在,也就是说hibernate并没有自动生成表结构,hibernate.hbm2dd

    2022年2月16日
    42
  • webstorm 插件安装

    webstorm 插件安装1.打勾的表示已经安装2.没有安装的插件,可以在plugins搜索,在右边搜索结果里点install,然后重启webstorm3.这里有常用插件http://blog.csdn.net/xs20691718/article/details/52269027转载于:https://www.cnblogs.com/linsx/p/7770623.html…

    2022年9月8日
    0
  • docker使用教程视频_docker到底怎么用

    docker使用教程视频_docker到底怎么用前言docker主要用于运维,当然了,开发也可以用,可以在启动应用项目的时候使用docker方式,docker是虚拟化技术,每一个docker容器都是一个linux虚拟机,而且还可以根据不同的应用定制,最小的可以直接依赖linux内核,仅仅几M就可以运行。下面,正式开始。 注意:如果是使用docker-compose方式,只看到第三的第6即可。 一、安装dockercent…

    2022年10月15日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号