本文介绍如何在 qemu 中运行我们写的测试代码
1. 驱动相关
1.1 代码准备阶段
# 创建测试目录
mkdir -p drivers/test/buddy# 创建如下文件
touch drivers/test/Makefiledrivers/test/buddy/Makefile
diff --git a/drivers/Makefile b/drivers/Makefile
index aaef17cc6..915b52736 100644
--- a/drivers/Makefile
+++ b/drivers/Makefile
@@ -186,3 +186,4 @@ obj-$(CONFIG_SIOX) += siox/obj-$(CONFIG_GNSS) += gnss/obj-$(CONFIG_INTERCONNECT) += interconnect/obj-$(CONFIG_COUNTER) += counter/
+obj-y +=test/
diff --git a/drivers/test/Makefile b/drivers/test/Makefile
new file mode 100644
index 000000000..e0102fce3
--- /dev/null
+++ b/drivers/test/Makefile
@@ -0,0 +1 @@
+obj-y += buddy/
diff --git a/drivers/test/buddy/Makefile b/drivers/test/buddy/Makefile
new file mode 100644
index 000000000..831b5c3ca
--- /dev/null
+++ b/drivers/test/buddy/Makefile
@@ -0,0 +1 @@
+obj-m += buddy_test_alloc_free.o
我们增加 如下源码文件 drivers/test/buddy/buddy_test_alloc_free.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gfp.h>
#include <linux/mm.h>#define ORDER 3 // 分配8个页面(2^3)static int __init buddy_test_init(void)
{struct page *page;unsigned long addr;printk(KERN_INFO "Buddy system test module loaded\n");// 分配页面addr = __get_free_pages(GFP_KERNEL, ORDER);if (!addr) {printk(KERN_ERR "Failed to allocate pages\n");return -ENOMEM;}printk(KERN_INFO "Allocated %lu pages at address 0x%lx\n", (1UL << ORDER), addr);// 获取page结构page = virt_to_page(addr);printk(KERN_INFO "Page info: pfn=%lx, flags=%lx\n", page_to_pfn(page), page->flags);// 释放页面free_pages(addr, ORDER);printk(KERN_INFO "Pages freed\n");return 0;
}static void __exit buddy_test_exit(void)
{printk(KERN_INFO "Buddy system test module unloaded\n");
}module_init(buddy_test_init);
module_exit(buddy_test_exit);MODULE_LICENSE("GPL");
MODULE_AUTHOR("cbx");
MODULE_DESCRIPTION("Buddy System Test Module");
1.2 编译对应驱动
这里选择单独编译这个 驱动
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build INSTALL_PATH=build/arch/$ARCH/boot drivers/test/buddy/buddy_test_alloc_free.ko
file build/drivers/test/buddy/buddy_test_alloc_free.kobuild/drivers/test/buddy/buddy_test_alloc_free.ko: ELF 64-bit LSB relocatable, ARM aarch64, version 1 (SYSV), BuildID[sha1]=4eee30c29424e99fb92e3d1a64c140d24805a8dc, with debug_info, not stripped
1.3 打包进文件系统
我们将我们的 buddy_test_alloc_free.ko 直接打包进入 我们的文件系统。
我们在之前已经做好了我们的文件系统 initrd.ext4, 我们只需要挂载 ,然后将 ko 拷贝进入即可
# 挂载
sudo mount initrd.ext4 mntleo@leo:~/data_4t/github/kernel_version/mnt$ ls
bin dev etc linuxrc lost+found mnt proc sbin sys tmp usr# 创建目录 拷贝到 文件系统中
mnt$ sudo mkdir test
mnt$ sudo cp ../linux-5.4/build/drivers/test/buddy/buddy_test_alloc_free.ko test/# 卸载
kernel_version$ sudo umount mnt
1.4 运行
/test #
/test # insmod buddy_test_alloc_free.ko
[ 32.305024] buddy_test_alloc_free: module verification failed: signature and/or required key missing - tainting kernel
[ 32.319391] Buddy system test module loaded
[ 32.319755] Allocated 8 pages at address 0xffffff807c3d8000
[ 32.320079] Page info: pfn=bc3d8, flags=ffff000000000
[ 32.320344] Pages freed
/test #
2. 应用侧
// 查看伙伴系统状态
#include <stdio.h>
#include <stdlib.h>int main() {printf("test app.\n");system("cat /proc/buddyinfo");system("cat /proc/pagetypeinfo");return 0;
}
all:aarch64-linux-gnu-gcc -static test_main.c -o test_appclean:rm test_app *.o
- 这里使用 static 方式编译, 由于我们的 busybox 也是使用静态的方式编译的,里面没有 * .so 所以我们的测试程序 也使用 静态编译的方式。不然找不到库。
- 打包参考 1.3 小节。