Android 启动分析 --- init.c (system/core/init/init.c)

本文从androidsrc/system/core/init.c的main函数出发,详细解析Android系统的启动过程,包括读取init.rc配置文件,解析service和trigger,加载硬件相关脚本,并按照触发器顺序执行命令。在无限循环中,系统不断轮询并执行action队列,重启必要服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

洪荒之初(其实不算是,kernel已经起来了)

从androidsrc/system/core/init.c开始


int main(){

......

init_parse_config_file("/init.rc");

/******************************************

*这里去打开文件系统根目录下的init.rc文件,这里可以去先看下init.rc文件内部的格式

*内部调用parse_config(fn, data);

*parse_config(fn, data);会把init.rc文件解析后传给parse_new_section(&state, kw, nargs, args);

void parse_new_section(struct parse_state *state, int kw,
                       int nargs, char **args)
{
    printf("[ %s %s ]\n", args[0],
           nargs > 1 ? args[1] : "");
    switch(kw) {
    case K_service:
        state->context = parse_service(state, nargs, args);
        if (state->context) {
            state->parse_line = parse_line_service;
            return;
        }
        break;
    case K_on:
        state->context = parse_action(sta
### 解决方案分析 在开发嵌入式项目时,遇到 `undefined reference` 的错误通常表明链接阶段缺少必要的目标文件或库。以下是针对该问题的具体解决方案: #### 1. **确认源码实现** 确保函数 `TM1650_Init` 已经被正确定义并存在于项目的源代码中。如果此函数未定义,则需要补充其实现[^1]。 ```c // 示例:TM1650_Init 函数的可能实现 void TM1650_Init(void) { // 初始化逻辑... } ``` #### 2. **检查CMakeLists.txt配置** 验证 CMake 配置文件是否正确包含了所有相关的源文件和头文件路径。例如,在 `CMakeLists.txt` 中应有如下设置[^3]: ```cmake # 添加源文件 add_executable(target_name source_file.c) # 设置头文件路径 include_directories(${PROJECT_SOURCE_DIR}/include) # 如果存在外部库,需指定其位置 target_link_libraries(target_name PRIVATE external_lib) ``` #### 3. **工具链配置校验** 对于 ARM 平台,使用 GNU Arm Embedded Toolchain 编译时,必须正确配置交叉编译工具链。通过以下方式设定工具链路径: ```cmake set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(TOOLCHAIN_PREFIX /path/to/toolchain/bin/arm-none-eabi-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g++) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}as) set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy CACHE INTERNAL "") set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}size CACHE INTERNAL "") # 指定链接脚本(可选) set(LINKER_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/linker.ld") set(CMAKE_EXE_LINKER_FLAGS "-T${LINKER_SCRIPT}") ``` #### 4. **链接器选项调整** 当出现 `undefined reference` 错误时,可能是由于链接顺序不当引起的。可以通过重新排列目标文件来解决问题。例如,在 CMake 中可以这样操作: ```cmake add_library(utils STATIC utils.c) add_executable(main main.c) target_link_libraries(main PRIVATE utils) ``` 此外,还需注意 `-Wl,--start-group ... --end-group` 参数的应用,它可以帮助解决依赖循环的问题: ```bash -Wl,--start-group -lm -lc -lgcc -Wl,--end-group ``` #### 5. **清理构建环境** 有时旧的目标文件可能导致冲突,建议彻底清除之前的构建产物后再尝试重新编译: ```bash rm -rf build/ mkdir build && cd build cmake .. make ``` --- ### 总结 上述方法涵盖了从源码完整性到工具链配置以及构建过程中的多个方面。逐一排查以上环节即可有效定位并修复 `undefined reference to 'TM1650_Init'` 的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值