项目简介
本项目聚焦于 Android 系统内存管理,旨在通过编译 Android 内核、熟悉页面替换算法、获取目标进程的虚拟与物理地址以及实现全新页面替换算法,深入理解 Android 内存管理机制。
项目的主要特性和功能
- 内核编译:完成 Android 内核编译并开启相关特性,为后续功能提供基础。
- 地址获取:实现系统调用接口,开发
VATranslate
程序,可根据进程 ID 和虚拟地址获取物理地址。 - 地址空间调查:实现
vm_inspector
程序,可指定进程 ID 和地址范围,转储目标进程的页表项以调查地址空间。 - 算法替换:修改 Linux 内核的页面替换算法,添加新引用变量体现页面重要性,依据重要性管理和调度页面。
安装使用步骤
环境准备
确保已具备以下环境: - AVD(Android 虚拟设备)和 SDK(由 TA 提供) - Ubuntu 18.04 LTS 操作系统
编译内核
- 将以下路径添加到环境变量
PATH
中:shell ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin
- 修改
KERNEL_SOURCE/goldfish
目录下的Makefile
,将以下内容进行修改:ARCH ?= arm CROSS_COMPILE ?= arm-linux-androideabi
- 执行以下命令设置编译配置:
shell make goldfish_armv7_defconfig
- 依据 TA 提供的说明文件修改编译配置:
shell sudo apt-get install ncurses-dev make menuconfig
- 编译内核:
shell make -j4
获取物理地址
- 插入新模块:
shell cd YOUR_DIR insmod MODULE_NAME.ko
- 使用
VATranslate
程序获取物理地址:shell ./VATranslate #pid #VA
- 可使用
cat /proc/#PID/maps
命令验证进程是否有虚拟内存信息。
调查进程地址空间
- 插入模块后,使用
vm_inspector
程序转储目标进程的页表:shell vm_inspector #pid #begin_vaddr #end_vaddr
- 可使用
ps | grep zygote
和ps | grep calculator
命令查找进程 ID,使用cat /proc/#pid/maps
命令获取进程的内存映射信息。
更改页面替换算法
- 在
include/linux/mm_types.h
文件中,为page
结构体添加importance
变量。 - 修改
mm/vmscan.c
文件中的shrink_active_list
函数,依据页面的重要性移动页面。 - 修改
mm/swap.c
文件中的mark_page_accessed
函数,在引用页面时增加其重要性。 - 运行基准测试程序测试新的页面替换算法: ```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】