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


相关推荐

  • docker dockerfile详解_进入docker容器命令

    docker dockerfile详解_进入docker容器命令前言Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。Dockerfile简介Dockerfile是用来构建Docker镜像的构建文件,是由一系列

    2022年7月30日
    7
  • Lytro光场相机上手视频

    Lytro光场相机上手视频这会儿大家都知道光场相机Lytro了,用一个词来形容的话,应该是“新颖”,你在生活中肯定很难想到相机还可以这么玩。相信你第一印象应该是其微小的体积。如果要你坦率地说,毫无疑问你希望得到一个单反。其细小的身躯,精细的做工让我们想到了iPodNano和iSight,而其桌面的软件当前也只支持Mac,Windows版本正在开发中。视频1…

    2025年8月23日
    4
  • win10电脑一插u盘就重启_u盘启动盘复制到另一个u盘

    win10电脑一插u盘就重启_u盘启动盘复制到另一个u盘不知道大家有没有遇到过这样的情况,就是当你用U盘复制东西的时候,电脑莫名其妙自动重启,可是只要讲U盘拔下来就没事了,而用杀毒软件杀毒也没有查出任何病毒,重新安装了一次系统也是一样的无济于事,这究竟是什么问题?带着这个问题往下看,U盘量产网将为你解答。这个问题几率不大,但首先要百分之百确认U盘里没有病毒或者木马,杀毒软件可能检查不出来,所以建议您将U盘格式化,格式化时注意要选择FAT而不是FAT32…

    2022年9月8日
    2
  • 排序-冒泡排序

    排序-冒泡排序排序算法之【冒泡排序】在写代码之前我们需要对冒泡排序有一个逻辑上的理解:即什么是冒泡排序呢?冒泡排序是排序算法的其中一种,该排序的逻辑理解起来较为容易,理解上可以有两种方式,一种中正向的思维,一种是逆向的思维,什么意思呢?所谓的正向思维就是从前往后,从左往右,从上到下。那么逆向思维呢就正好与之相反。下面来说一正向思维下的冒泡排序:…

    2022年6月17日
    29
  • linux设置ip默认,Linux设置ip地址与默认网关[通俗易懂]

    linux设置ip默认,Linux设置ip地址与默认网关[通俗易懂]1.设置ip地址打开终端,取得root权限(sudosu)。输入命令:#ifconfigeth0192.168.0.20netmask255.255.255.0详解:ifconfig—设置ip的命令eth0—要设置的网卡,可以只输入ifconfig查看已安装网卡192.168.0.20—预设置的IP值。netmask255.255.255.0—子网掩…

    2022年5月27日
    56
  • 如何在java中输出保留两位小数「建议收藏」

    如何在java中输出保留两位小数「建议收藏」在输出时用以下的代码:System.out.println(String.format(“%.2f”,sum));其中”%.2f”为保留两位小数,sum为要输出的数字。当然,用print输出也是可以的:System.out.print(String.format(“%.2f”,sum));…

    2022年7月7日
    79

发表回复

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

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