Android 编译 error: do_inode_allocate_extents的问题

在将内核从1.3更新到2.0的过程中,遇到编译错误do_inode_allocate_extents。尝试调整sys_partional分区大小、检查启动方式、清理项目、注释掉mk文件中的部分KO文件等方法。最后发现是BoardConfig.mk中BOARD_SYSTEMIMAGE_PARTITION_SIZE和sys_partition.fex文件中nandd分区大小设置导致的问题。当两者都设置为1G时,编译成功,生成的固件大小为648M。

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

今天将内核从1.3转到2.0,在编译的时候出现如下错误:

+ make_ext4fs -s -l 536870912 -a system out/target/product/wing-chiphd/system.img out/target/product/wing-chiphd/system
Creating filesystem with parameters:
    Size: 536870912
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 2048
    Label: 
    Blocks: 131072
    Block groups: 4
    Reserved block group size: 31
error: do_inode_allocate_extents: Failed to allocate 3284 blocks

+ '[' 1 -ne 0 ']'
+ exit 4
error: failed to build out/target/product/wing-chiphd/system.img from out/target/product/wing-chiphd/system
make: *** [systemimage-nodeps] 错误 1

而Size: 536870912 为512M,而我在preinstall中引入的apk的大小为138M,并且在1.3中是没有此问题的。对比BoardConfig,也没什么举起出入。所以i感觉不是这个大小的问题。

又试着修改sys_partional中相关的分区大小,还是一样,

在晚上查找---h

<think>嗯,用户这次提出了一个非常具体的系统级问题:关于文件描述符泄露中的"anon_inode:sync_file"问题排查和解决方案。从问题表述的专业性来看,用户应该是Android/Linux开发领域的工程师,遇到了棘手的FD泄露问题。 用户引用了站内关于FD泄露导致程序异常的说明,但这次聚焦在sync_file这个特殊类型上。这让我想到几个关键点:首先,sync_file是Android图形系统中用于GPU-CPU同步的同步原语;其次,这类泄露往往与SurfaceFlinger/GraphicBuffer相关;最后,排查需要结合dumpsys和内核跟踪。 用户可能正在经历图形渲染异常或ANR问题,表面现象或许是界面卡顿或黑屏,但根本原因是FD耗尽。ta需要的是可操作的排查方案,而不仅仅是理论解释。考虑到Android系统的复杂性,应该从应用层、框架层到驱动层逐级分析。 特别要注意的是,用户提到的是"anon_inode:sync_file"而非普通文件描述符,这说明泄露源与内核的同步文件对象有关。在Android系统中,这通常涉及: - SurfaceTexture/ImageReader使用后未释放 - 跨进程传递GraphicBuffer时引用计数异常 - Vulkan/OpenGL ES的fence同步对象泄露 需要给出具体的诊断命令如lsof、dumpsys gfxinfo,同时提醒用户注意Binder事务中的FD传递问题。解决方案方面,要强调HAL层和Gralloc模块的嫌疑,因为驱动实现错误是常见根源。 用户可能已经尝试过常规的/proc/$pid/fd检查但没定位到问题,所以需要更深入的方案:比如建议使用ftrace跟踪sync_file_create/sync_file_release事件,或者检查dma_buf的引用计数。这些都需要root权限,但用户作为系统开发者应该具备这个条件。</think>针对文件描述符泄露中的 `anon_inode:sync_file` 问题,以下是系统级排查与解决方案: --- ### **问题根源分析** `anon_inode:sync_file` 是 Linux 内核为**同步栅栏(synchronization fence)** 创建的匿名文件描述符,常见于: 1. **图形渲染系统**(如 Android SurfaceFlinger/Vulkan/OpenGL ES) 2. **GPU-CPU 同步操作** 3. **DMA-BUF 跨进程共享内存** 泄露表明同步对象未正确释放,导致 FD 持续累积直至耗尽(`EMFILE` 错误)[^1]。 --- ### **排查步骤** #### 1. **定位泄露进程** ```bash # 检查所有进程的 FD 使用情况 adb shell lsof | grep "anon_inode:sync_file" # 按进程统计 FD 数量 adb shell ls -l /proc/<pid>/fd | grep "anon_inode:sync_file" | wc -l ``` #### 2. **分析堆栈轨迹** ```bash # 获取进程 FD 的创建堆栈 adb shell cat /proc/<pid>/fdinfo/<fd_num> # 内核层追踪(需 root) echo 1 > /sys/kernel/debug/tracing/events/sync/enable cat /sys/kernel/debug/tracing/trace_pipe | grep sync_file ``` #### 3. **检查图形子系统** ```bash # Android 图形状态分析 adb shell dumpsys SurfaceFlinger adb shell dumpsys gfxinfo <package_name> ``` #### 4. **监控系统调用** ```strace strace -p <pid> -e trace=open,close,dup,ioctl ``` --- ### **解决方案** #### 1. **代码层修复** - **图形 API 调用**:确保 `sync_fence_wait()` 后调用 `sync_fence_put()` - **资源释放**:检查 Vulkan/OpenGL ES 的 `vkQueueSubmit`、`eglCreateSyncKHR` 是否配对释放 - **跨进程传递**:Binder 传递的 FD 需在接收方显式关闭 #### 2. **框架层优化** - **Android SurfaceTexture**:调用 `release()` 释放 `GraphicBuffer` - **MediaCodec**:解码完成后调用 `releaseOutputBuffer()` - **Camera2 API**:`ImageReader` 使用后关闭 `acquireLatestImage()` #### 3. **内核补丁** 若泄露由内核驱动引起(常见于 GPU 驱动): ```diff // 示例:修复 sync_file 引用计数 - if (fence) - sync_file_create(fence); + if (fence) { + struct sync_file *sf = sync_file_create(fence); + if (sf) + fd_install(fd, sf->file); + } ``` --- ### **预防措施** 1. **FD 监控工具**: - 集成 `libfdcheck` 实时检测泄露 - 定期运行 `lsof -p <pid>` 审计 2. **压力测试**: ```bash while true; do adb shell input keyevent 26; done # 模拟唤醒/休眠 ``` 3. **限制 FD 数量**: ```bash ulimit -n 4096 # 防止单个进程耗尽全局 FD ``` --- ### **典型案例** > **某 Android 游戏闪退分析**: > 渲染循环中未释放 Vulkan 的 `VkSemaphore`,导致每秒泄露 60 个 `sync_file`。 > **修复**:在 `vkQueuePresentKHR()` 后增加 `vkDestroySemaphore()` 调用[^1]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值