Android系统10 RK3399 init进程启动(四十八) init第一阶段分析

文章详细介绍了Android系统启动过程中init进程的第一阶段,包括挂载tmpfs、devpts、proc、sysfs、selinuxfs等虚拟文件系统,创建设备节点,以及设置标准输入输出。这一阶段主要任务是建立基础文件系统结构,为后续系统启动做准备。

配套系列教学视频链接:

安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

本文通过代码梳理的方式,给大家介绍Android init祖先进程第一阶段的工作流程。


第一阶段整理框架:执行在boot.img(ramdisk)中,主要创建必须的文件夹,挂载虚拟文件系统,挂载system,vendor分区。

代码如下:system/core/init/first_stage_init.cpp

int FirstStageMain(int argc, char** argv) {
    if (REBOOT_BOOTLOADER_ON_PANIC) {
        InstallRebootSignalHandlers();
    }

    boot_clock::time_point start_time = boot_clock::now();

    std::vector<std::pair<std::string, int>> errors;
#define CHECKCALL(x) \
    if (x != 0) errors.emplace_back(#x " failed", errno);

    // Clear the umask.
    umask(0);

    CHECKCALL(clearenv());
    CHECKCALL(setenv("PATH", _PATH_DEFPATH, 1));
    // Get the basic filesystem setup we need put together in the initramdisk
    // on / and then we'll let the rc file figure out the rest.
    //将tmpfs文件系统挂载到dev目录
    CHECKCALL(mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755"));
    // 创建dev/pts目录 :是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录
    CHECKCALL(mkdir("/dev/pts", 0755));
    //创建dev/socket目录,rc脚本中service启动时,会创建很多域套接字在此目录
    CHECKCALL(mkdir("/dev/socket", 0755));
    CHECKCALL(mount("devpts", "/dev/pts", "devpts", 0, NULL));
#define MAKE_STR(x) __STRING(x)
    CHECKCALL(mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC)));
#undef MAKE_STR
    // Don't expose the raw commandline to unprivileged processes.
    CHECKCALL(chmod("/proc/cmdline", 0440));
    gid_t groups[] = {AID_READPROC};
    CHECKCALL(setgroups(arraysize(groups), groups));
    //将sysfs文件系统挂载到sys目录,用来访问内核和驱动的信息
    CHECKCALL(mount("sysfs", "/sys", "sysfs", 0, NULL));
    //将selinuxfs文件系统挂载到目录/sys/fs/selinux ,通过该路径可以完成和内核selinux模块
Firefly-RK3399Android10中的pdf_20211123_1657.7z a4_portrait_rgbb.pdf a5_portrait_rgbb.pdf a5_portrait_rgbb_1_6_printscaling_default.pdf a5_portrait_rgbb_1_6_printscaling_none.pdf aacDecoder.pdf aacEncoder.pdf about_blank.pdf Android_malloc_debug.pdf annotation_highlight_long_content.pdf annotation_highlight_rollover_ap.pdf annotation_highlight_square_with_ap.pdf annotation_ink_multiple.pdf annotation_stamp_with_ap.pdf annotiter.pdf barcode_test.pdf BHUSA2014-capstone.pdf black.pdf bookmarks.pdf bookmarks_circular.pdf brotli-comparison-study-2015-09-22.pdf bug_113.pdf bug_213.pdf bug_216.pdf bug_298.pdf bug_325_a.pdf bug_325_b.pdf bug_343.pdf bug_344.pdf bug_355.pdf bug_360.pdf bug_451265.pdf bug_451830.pdf bug_452455.pdf bug_454695.pdf bug_455199.pdf bug_459580.pdf bug_481363.pdf bug_487928.pdf bug_507316.pdf bug_544880.pdf bug_547706.pdf bug_551248.pdf bug_551460.pdf bug_552046.pdf bug_554151.pdf bug_555784.pdf bug_557223.pdf bug_57.pdf bug_572871.pdf bug_583.pdf bug_601362.pdf bug_602650.pdf bug_603518.pdf bug_620428.pdf bug_631912.pdf bug_634394.pdf bug_634716.pdf bug_644.pdf bug_650.pdf bug_664284.pdf bug_679649.pdf bug_680376.pdf bug_707673.pdf bug_709793.pdf bug_713197.pdf bug_717.pdf bug_750568.pdf bug_757705.pdf bug_765384.pdf bug_779.pdf bug_781804.pdf bug_782596.pdf bug_921.pdf bug_xrefv4_loop.pdf CameraITS.pdf camera_engine_rkisp_user_manual_v2.2.pdf camera_hal3_user_manual_v2.3.pdf checkerboard.pdf circular_viewer_ref.pdf combobox_form.pdf control_characters.pdf default-values-ip.pdf DngNoiseModel.pdf Drm_Vendor_Modules_v1.pdf dynamic_list_box_allow_multiple_selection.pdf dynamic_password_field_background_fill.pdf dynamic_table_color_and_width.pdf EASLibrary3_5.pdf EAS_API_Reference.pdf EAS_Library_Integration_Guide.pdf Efuse process explain .pdf email_recommended.pdf embedded_attachments.pdf embedded_images.pdf encrypted.pdf feature_linearized_loading.pdf fieldsmanagement.pdf first.pdf hello_world.pdf ic_brightness_medium_24dp.pdf ic_radio_button_check
<think>嗯,用户询问了RK3399芯片的内存布局知识。从引用内容看,我需要整合多个来源的信息来构建完整回答。 引用[1]直接提到"内存布局"这个关键词,说明这是核心信息点。引用[2]提供的硬件设计资源可能包含物理内存映射信息,但用户更关注软件层面的布局。引用[3]描述的Android系统架构里,内存管理模块应该涉及用户空间布局。引用[4]的启动流程中提到复位向量地址0xFFFF0000,这是关键硬件地址。引用[5]的寄存器调试方法对理解内存映射寄存器很有帮助。 用户可能是嵌入式开发工程师,正在调试或移植系统。需要区分三个层面的内容:硬件固定映射(如启动地址)、内核管理的物理内存区域、以及操作系统划分的用户空间。特别要注意RK3399的大小核架构,A53和A73可能有不同内存访问特性。 回答应该从硬件层开始说明:启动地址0xFFFF0000属于ROM空间,然后是bootloader加载区域。物理内存布局要说明DDR控制器如何管理4GB地址空间,包括保留区域(如GPU显存)。最后补充Linux内核的虚拟内存划分,特别是用户空间布局。 考虑到用户可能进行底层开发,需要强调调试方法:引用[5]的devmem工具可以直接查看寄存器,比如通过DMC控制器寄存器获取实际内存配置。另外提醒查阅芯片手册第3章有详细内存映射表。 </think> 根据引用内容,以下是RK3399芯片内存布局的关键信息整合: ### 一、硬件级内存布局 1. **启动存储器映射** - 复位后Cortex-A53核心从固定地址`0xFFFF0000`执行ROM Code[^4] - 内置ROM空间包含初始引导代码,负责探测启动设备(eMMC/SPI Flash/SD卡) ```c /* 典型启动地址映射 */ 0xFFFF0000 → BootROM (64KB) 0x00000000 → Bootloader (e.g. U-Boot SPL) ``` 2. **DDR物理内存布局** | 地址范围 | 用途 | 说明 | |----------------|-----------------------|--------------------------| | 0x00000000 | ARM Trusted Firmware | 安全监控程序 | | 0x00200000 | OP-TEE | 安全执行环境 | | 0x00400000 | U-Boot | 主引导加载程序 | | 0x02000000 | Linux Kernel | 内核映像与设备树 | | 0x10000000+ | Android系统层 | Zygote/System Server[^3] | | 高端地址 | GPU专用区域 | Mali-T860显存保留区[^1] | ### 二、系统级内存管理 1. **多核协同机制** - **2×Cortex-A53集群**:处理低功耗任务,共享L2缓存 - **4×Cortex-A73集群**:高性能运算时激活,独立L2缓存 - **Cortex-M0协处理器**:实时任务处理,有专用SRAM区域 2. **Android系统布局** ```mermaid graph LR A[Linux Kernel] --> B[Android Init] B --> C[Zygote] C --> D[System Server] D --> E[Launcher] ``` 用户空间内存按进程隔离,通过Bionic libc管理堆/栈分配[^3] ### 三、调试与配置 1. **寄存器级访问** 使用`devmem`工具直接读写内存控制器寄存器: ```bash # 查看DMC(DDR Memory Controller)配置 devmem 0xFFA80000 32 # 读取DMC寄存器0 ``` 通过`/proc/iomem`可查看内核管理的物理地址映射[^5] > **重要提示**:完整内存映射表需查阅《RK3399 TRM》第3章,不同固件版本可能调整保留区域边界。开发板设计中的PCB布线会直接影响DDR信号完整性[^2]。 --- ### 相关问题 1. RK3399的DDR控制器支持的最大内存容量是多少? 2. 如何配置RK3399的大小核任务调度策略? 3. Android系统RK3399上如何进行内存优化? 4. RK3399启动时如何从SPI Flash加载二级引导程序? [^1]: RK3399大小核架构与多媒体能力说明 [^2]: 硬件设计资源对内存布线的影响 : Android系统层的内存管理机制 [^4]: 启动流程中的存储设备探测逻辑 [^5]: 寄存器调试工具的使用方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值