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。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • WrapPanel水平布局保持不换行的写法示例[通俗易懂]

    WrapPanel水平布局保持不换行的写法示例[通俗易懂]UI需求宽高:235px*285px内容宽度:191px要求:每行2个,右边距15,下边距10代码写法:测量后发现两个item+margin=191,所以让wrappanel定宽191item中grid套个border,在border中设置左右间距7.5,这样两个元素加起来的宽就是15,由于左边距多了7.5,所以在上一层grid左缩进7.5拉回来就可以了效果:…

  • CSS3之opacity属性的简单使用

    CSS3之opacity属性的简单使用什么是opacity?opacity属性设置元素的不透明级别。 怎么使用?<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title> CSS3之opacity属性的简单使用</title&gt

  • android Gradle 教程

    android Gradle 教程发现一个官方翻译后的gradle教程:http://avatarqing.github.io/Gradle-Plugin-User-Guide-Chinese-Verision/index.html

  • CSS 颜色代码大全 CSS颜色对照表[通俗易懂]

    CSS 颜色代码大全 CSS颜色对照表[通俗易懂]转载地址:https://blog.csdn.net/u012117917/article/details/41604711HTML及CSS常用颜色英文词汇  黑色 银色 灰色 白色 茶色 红色 紫色 紫红 black silver gray white maroon …

  • 动态规划之背包问题及输出背包具体方案[通俗易懂]

    动态规划之背包问题及输出背包具体方案[通俗易懂]题型1:LintCode92.背包问题题目:在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。分析:dp[i][j]:当背包总重量为j且目前有i个物品时,背包最多装满dp[i][j]的空间。      状态转移方程为:dp[i][j]=max{dp[i-1][j-A[i-1]]+A[i-1],dp[i-1][j]},其中dp[i-1][j-A[…

  • 【Windows】Win10家庭版启用组策略gpedit.msc

    【前言】大家都认为,Windows10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已。那么我们让系统允许你使用就好了。【操作步骤】1、首先你需要在桌面上新建一个txt文本文档。然后将以下代码复制到这个新建的txt文本文档中,修改其后缀.txt变成.cmd以管理员身份运行即可使用组策略gpedit.msc了

发表回复

您的电子邮箱地址不会被公开。

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