当前位置: 首页 > news >正文

QEMU模拟32位ARM实现自定义系统调用

实现自定义系统调用

如何使用 QEMU 模拟32位 ARM 环境参考:使用Qemu模拟32位ARM系统

修改linux内核源码

使用 linux-4.4.240 源码,下载链接:下载链接

arch\arm\include\uapi\asm\unistd.h 文件下新增系统调用 sys_test

//added sys call
#define __NR_sys_test         	(__NR_SYSCALL_BASE+391) 

在这里插入图片描述
kernel/sys.c 添加系统调用函数 sys_test

//new sys_call sys_test
asmlinkage int sys_test(char * str, int count){int ret; char buf[256] = {0};if(count >= 256){ return -1; } ret = copy_from_user(buf, str, count);printk("[systest] Hello, %s. This is Kernel systest!\n", buf);return ret;
}

在这里插入图片描述

include/linux/syscalls.h 中添加 sys_test 的函数声明:

//new sys_call sys_test
asmlinkage int sys_test(char * str, int count);

在这里插入图片描述

arch/arm/kernel/calls.S 中添加 CALL(sys_test)

CALL(sys_test)

在这里插入图片描述

重新编译内核

依次执行

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)

测试系统调用

在共享目录 share 下,创建测试代码 sys_test.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <string.h>int main ()
{char * buffer = "i am dinggongwurusai";int ret;ret = syscall(391, buffer, strlen(buffer)+1);printf("syscall ret: %d\n", ret);return 0;
}

采用静态链接的方式编译程序:

arm-linux-gnueabi-gcc sys_test.c -o app -static

qemu模拟启动

qemu-system-arm \-M vexpress-a9 \-m 512M \-kernel /home/wurusai/workspace/linux-4.4.240/arch/arm/boot/zImage \-dtb /home/wurusai/workspace/linux-4.4.240/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \-nographic \-append "root=/dev/mmcblk0 rw console=ttyAMA0" \-drive file=rootfs.ext3,format=raw,if=sd,readonly=off \-fsdev local,id=host0,path=./shared,security_model=passthrough \-device virtio-9p-device,fsdev=host0,mount_tag=host0

进入共享目录 /mnt/shared ,执行程序 app
在这里插入图片描述

调用自定义系统调用 sys_test 成功。

注意:

对于大部分遇到的问题都参考 使用Qemu模拟32位ARM系统

相关文章:

  • CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜
  • RAG之大规模解析 PDF 文档全流程实战
  • 网络协议分析 实验四 ICMPv4与ICMPv6
  • web-ui开源程序是建立在浏览器使用的基础上,旨在使 AI 代理可以访问网站
  • MySQL 学习(八)如何打开binlog日志
  • sqli-labs靶场第四关——“)闭合
  • deepseek梳理java高级开发工程师微服务面试题
  • SQL、Oracle 和 SQL Server 的比较与分析
  • 一次讲清 FP32 / FP16 / BF16 / INT8 / INT4
  • MySQL 8.0 OCP(1Z0-908)英文题库(31-40)
  • UI-TARS Desktop:用自然语言操控电脑,AI 重新定义人机交互
  • YOLO11解决方案之物体模糊探索
  • 自然语言生成在商业智能中的应用实践
  • 【工作记录】Kong Gateway 入门篇之部署及简单测试
  • 基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
  • 【github】主页显示star和fork
  • STM32 __rt_entry
  • 详解注意力机制
  • RustDesk:开源电脑远程控制软件
  • Datawhale 5月coze-ai-assistant 笔记1
  • 人民日报任平:从汽车产销、外贸大盘看中国经济前景
  • 中保协发布《保险机构适老服务规范》,全面规范保险机构面向老年人提供服务的统一标准
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 最高降九成!特朗普签署降药价行政令落地存疑,多家跨国药企股价收涨
  • 中国恒大:清盘人向香港高等法院申请撤回股份转让
  • 最美西游、三星堆遗址等入选“2025十大年度IP”