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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSONObject与JSONArray的使用

    JSONObject与JSONArray的使用

    2021年12月9日
    68
  • SCI论文投稿信(Cover Letter)的写法及模版

    SCI论文投稿信(Cover Letter)的写法及模版一、写法投稿信(CoverLetter)应该简述所投稿件的核心内容、主要发现和意义,拟投期刊,对稿件处理有无特殊要求等(如“nottoreview”list)。另外,请附上主要作者的中文姓名、通讯地址、电话、传真和e-mail地址。此外有的杂志要求推荐几位审稿人及其联系方式。以及谁已经阅读过该文(当然是牛人)。一般来说,杂志通常要求说明你论文研究的意义,以及与这个杂志的相关性,另外还有…

    2022年5月8日
    128
  • 用 Windows Media Center 免费看大片 (二)

    用 Windows Media Center 免费看大片 (二)接本系列上篇文章用WindowsMediaCenter免费看大片(一)点击“确定”,然后选择WindowsMediaCenter中的“电视”功能:此时,可以看到在“电视”功能中,多了一个名为“指南”的功能项,选择并点击“指南”:这时,就能看到有很多网络资源供用户免费观看,任选其一,进行单击选择。此时,会弹出“免费观看互联网视频”…

    2022年7月11日
    38
  • vue根据下标获取数组中的值_document.getElementBy

    vue根据下标获取数组中的值_document.getElementBy关于<Element*at0x******>如何查看标签中的数据fromlxmlimportetreeimportrequestsurl=’https://www.pearvideo.com/’#首页地址data={}headers={“User-Agent”:”Mozilla/5.0(WindowsNT10.0;Win64;x64)””AppleWebKit/537.36(K

    2025年9月6日
    8
  • Java学习路线总结(思维导图篇)

    Java学习路线总结(思维导图篇)????Java学习路线:搬砖工逆袭Java架构师????简介:Java领域优质创作者????、CSDN哪吒公众号作者✌、Java架构师奋斗者????????扫描主页左侧二维码,加入群聊,一起学习、一起进步????欢迎点赞????收藏⭐留言????前情提要无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干活的,缺PM。也许这也是这个行业的现状,也是传说中的“35岁危机”的最好解释,如果你马上35岁了,但是你能干的,毕业生也能

    2022年5月17日
    36
  • 高德坐标拾取器_坐标拾取器百度地图

    高德坐标拾取器_坐标拾取器百度地图页面效果应用场景:你需要在一个弹窗中拾取一个高德的地址坐标。12345酸奶小妹的火星坐标672627282930坐标拾取工具(GCJ-02坐标)31说明:…

    2022年8月1日
    6

发表回复

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

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