ARM64系统中兼容系统调用表compat_sys_call_table的定义和初始化
在我使用的某国产ARM64笔记本上(安装的统信UOS系统), Linux内核有2个系统调用表sys_call_table
和compat_sys_call_table
其中sys_call_table
为原生64位程序使用, 而compat_sys_call_table
是为了在ARM64中兼容32位ARM应用程序而实现的
今天我们简单研究下这个兼容的系统调用表compat_sys_call_table
是如何定义和初始化的
compat_sys_call_table
的定义在/arch/arm64/kernel/sys32.c
中:
#undef __SYSCALL
#define __SYSCALL(nr, sym) asmlinkage long __arm64_##sym(const struct pt_regs *);
#include <asm/unistd32.h>#undef __SYSCALL
#define __SYSCALL(nr, sym) [nr] = __arm64_##sym,const syscall_fn_t compat_sys_call_table[__NR_compat_syscalls] = {[0 ... __NR_compat_syscalls - 1] = __arm64_sys_ni_syscall,
#include <asm/unistd32.h>
};
这里的关键是出现了2次的#include <asm/unistd32.h>
, 其中的部分定义如下, 为了方便理解我删除了一些代码
...
#define __NR_write 4
__SYSCALL(__NR_write, sys_write)
#define __NR_open 5
__SYSCALL(__NR_open, compat_sys_open)
...
#define __NR_ftruncate64 194
__SYSCALL(__NR_ftruncate64, compat_sys_aarch32_ftruncate64)
可以看到这里就是简单调用了__SYSCALL
宏, 所以:
- 第1次
#include <asm/unistd32.h>
声明了所有系统调用的函数原型 - 第2次
#include <asm/unistd32.h>
完成了对系统调用表compat_sys_call_table
的初始化, 即把上面声明的函数赋值给系统调用表相应的项
值得注意的是这些系统调用的名字
- 有些和传统的系统调用名字一样, 没有
compat_
的前缀, 说明这些系统调用和ARM64的一样, 可以直接使用ARM64实现好的 - 有些有
compat_
前缀, 这说明这些系统调用需要额外实现, 并且其他已经实现好了, 我们直接使用即可, 例如上面的compat_sys_open
已经在/fs/open.c
中实现了 - 有些有
compat_sys_aarch32_
前缀, 这些是需要我们自己实现的, 例如aarch32_ftruncate64
在/arch/arm64/kernel/sys32.c
中实现
参考资料
https://elixir.bootlin.com/linux/v4.19.274/source/arch/arm64/kernel/sys32.c#L143
https://elixir.bootlin.com/linux/v4.19.274/source/arch/arm64/include/asm/unistd32.h#L21
https://elixir.bootlin.com/linux/v4.19.274/source/arch/arm64/include/asm/syscall_wrapper.h#L18
https://elixir.bootlin.com/linux/v4.19.274/source/fs/open.c#L1129
ARM64系统中兼容系统调用表compat_sys_call_table的定义和初始化相关推荐
- html表单居中_如何在IE低版本中兼容HTML5表单属性placeholder属性
WEB开发数据提交是必不可少的,为了更友好的用户体验,通常需要给输入框一个默认的提示信息.HTML5技术提供了一个表单属性placeholder专门用于输入框默认提示,但是在IE低版本中根本不兼容. ...
- sap 新增科目表_SAP系统中四大科目表的总结
操作科目表定义-OB13 2 国家科目表定义-OB13 3 集团科目表定义-OB13 4 合并科目表(ECCS)定义-CX10 4 分配操作科目表到公司代码-OB62 5 分配国家科目表到公司代码-O ...
- linux系统中db2创建表空间,为DB2数据库创建表空间
数据库中的表空间(tablespace) 是一个逻辑层,一些数据库对象(比如表.视图和索引)驻留在这里.一个数据库可以有多个表空间.在首次创建数据库时,DB2 会自动地创建一组表空间. 在 Contr ...
- 粤嵌实验板 linux 环境,粤嵌linux基础入门学习 linux系统中添加系统调用
linux系统中添加系统是怎样调用的?从linux基础入门学习出发,一起来看看: 1.每个体系下面均有对应的系统调用列表: arch/arm/kernel/calls.S 在最后添加一个新的系统调用标 ...
- input搜索框在ios系统中兼容问题
input搜索与ios适配兼容问题 场景:h5页面在手机上嵌入时,会有搜索框并且改变键盘"搜索"字体的需求 问题1:ios下input中type="search" ...
- linux系统中查看gcc内置宏定义的命令方法
GNU C预定义了一系列的宏,这些宏都是以双下划线开始的 查看内置宏的命令 gcc -dM -E - < /dev/null [qipa250@localhost ~]$ gcc -dM -E ...
- Oracle数据库中的dual表
select user from dual; select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;--获得当前系统时间 select S ...
- K8s(Kubernetes), docker中的registry是什么意思?和windows中的注册表registry有什么区别?
相信很多初学者会对K8s(Kubernetes)中的registry这个概念感到很困惑,因为翻译成中文实在是不好翻译,直译"注册"就让人觉得非常费解.网上对于这方面的中文资料也很少 ...
- 什么是Linux系统调用system call?(Linux内核中设置的一组用于实现各种系统功能的子程序)(区别于标准C库函数调用)核心态和用户态的概念、中断的概念、系统调用号、系统调用表
文章目录 什么是系统调用? 为什么要用系统调用? 系统调用是怎么工作的? 如何使用系统调用? _syscall*()是什么? errno是什么? 调用性能问题 Linux系统调用列表 进程控制 文件系 ...
最新文章
- mysql中的 explain 关键字学习笔记
- java通过ftp上传文件到服务器_java-通过FTP将文件传输到服务器,但结果以零...
- android studio安装教程博客园独王,Android Studio安装与配置
- vue2.0 $router和$route的区别
- zsh关于.zprofile .zlogin .zshrc .zshenv文件中环境变量的加载
- Elasticsearch--高级-映射mapping_添加行的字段映射---全文检索引擎ElasticSearch工作笔记018
- 20165305 第十周课下补做
- matlab 去掉矩阵中某些元素,怎么修改矩阵中的某些元素 或者简单点说保留矩阵中的元素...
- 拳魂觉醒服务器维护怎么办,拳魂觉醒 哪些不为人知的的小秘密
- java JButton计算器布局
- Exp4 恶意代码分析 20154328 常城
- 没啥用的纯前端打造一个实时 markdown 编辑器
- 高考2021加3科目成绩查询,官方解读:2021新高考实施方案正式公布,首选科目按原始分计入总成绩!...
- UVa 1586 Molar mass
- 【U8+】U8+自动备份不成功BackupDB日志中显示“数据源.未找到”
- 周子明:大道无疆,“驰”之以恒,在数字化时代纵横驰骋
- git报错-The file will have its original
- CAP原则(CAP定理)
- 读书:SQL必知必会
- mysql主从 主机宕机_MySQL主从宕机的解决方法