littlebot
Published on 2025-04-09 / 0 Visits
0

【源码】基于 C 语言Linux 框架的 Android 内存管理项目

项目简介

本项目聚焦于 Android 系统内存管理,旨在通过编译 Android 内核、熟悉页面替换算法、获取目标进程的虚拟与物理地址以及实现全新页面替换算法,深入理解 Android 内存管理机制。

项目的主要特性和功能

  1. 内核编译:完成 Android 内核编译并开启相关特性,为后续功能提供基础。
  2. 地址获取:实现系统调用接口,开发 VATranslate 程序,可根据进程 ID 和虚拟地址获取物理地址。
  3. 地址空间调查:实现 vm_inspector 程序,可指定进程 ID 和地址范围,转储目标进程的页表项以调查地址空间。
  4. 算法替换:修改 Linux 内核的页面替换算法,添加新引用变量体现页面重要性,依据重要性管理和调度页面。

安装使用步骤

环境准备

确保已具备以下环境: - AVD(Android 虚拟设备)和 SDK(由 TA 提供) - Ubuntu 18.04 LTS 操作系统

编译内核

  1. 将以下路径添加到环境变量 PATH 中: shell ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
  2. 修改 KERNEL_SOURCE/goldfish 目录下的 Makefile,将以下内容进行修改: ARCH ?= arm CROSS_COMPILE ?= arm-linux-androideabi
  3. 执行以下命令设置编译配置: shell make goldfish_armv7_defconfig
  4. 依据 TA 提供的说明文件修改编译配置: shell sudo apt-get install ncurses-dev make menuconfig
  5. 编译内核: shell make -j4

获取物理地址

  1. 插入新模块: shell cd YOUR_DIR insmod MODULE_NAME.ko
  2. 使用 VATranslate 程序获取物理地址: shell ./VATranslate #pid #VA
  3. 可使用 cat /proc/#PID/maps 命令验证进程是否有虚拟内存信息。

调查进程地址空间

  1. 插入模块后,使用 vm_inspector 程序转储目标进程的页表: shell vm_inspector #pid #begin_vaddr #end_vaddr
  2. 可使用 ps | grep zygoteps | grep calculator 命令查找进程 ID,使用 cat /proc/#pid/maps 命令获取进程的内存映射信息。

更改页面替换算法

  1. include/linux/mm_types.h 文件中,为 page 结构体添加 importance 变量。
  2. 修改 mm/vmscan.c 文件中的 shrink_active_list 函数,依据页面的重要性移动页面。
  3. 修改 mm/swap.c 文件中的 mark_page_accessed 函数,在引用页面时增加其重要性。
  4. 运行基准测试程序测试新的页面替换算法: ```c

include

include

include

include

int main() { unsigned long p; unsigned long i, j; printf("Start to occupy 1GB memory.\n"); p = (unsigned long)malloc(1 << 15); if (!p) printf("Memory allocation failed.\n"); else { for (i = 0; i < (1 << 13); ++i) { p[i] = (unsigned long*)malloc(1 << 17); for (j = 0; j < 32; ++j) p[i][j << 10] = 0; } printf("Releasing after 1s.\n"); sleep(1); for (i = 0; i < (1 << 13); ++i) if(p[i]) free(p[i]); } if (p) free(p); return 0; } ```

实际操作时,请仔细参考相关文件和说明,遇问题可查看内核日志中的错误信息。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】