linux4.0新增32位ARM的系统调用

修改内核源码 

Linux系统为每一个系统调用赋予一个系统调用号。当应用程序执行一个系统调用时,应用程序就可以知道执行和调用到哪个系统调用了,从而不会造成混乱。系统调用号一旦分配之后就不会有任何变更,否则已经编译好的应用程序就不能运行了。对于ARM32系统来说,其系统调用号定义在arch/arm/include/uapi/asm/unistd.h头文件中。

添加的内容:arch\arm\include\uapi\asm\unistd.h文件

#define __NR_lkmao_hello		(__NR_SYSCALL_BASE+388)

 修改文件:arch\arm\include\asm\unistd.h

vi arch/arm/include/asm/unistd.h

/*
 * This may need to be greater than __NR_last_syscall+1 in order to
 * account for the padding in the syscall table
 */
//#define __NR_syscalls  (388)//原来的值
#define __NR_syscalls  (392)//修改后的值

修改文件kernel/sys.c,添加内容

 vi kernel/sys.c 

SYSCALL_DEFINE0(lkmao_hello)
{
	printk("%s:%s:%d -- sys_lkmao_hello is called\n",
		__FILE__,__func__,__LINE__);
	return 0;
}

修改文件include/linux/syscalls.h,添加如下内容:

asmlinkage long sys_hello_lkmao(void);

修改系统调用表,修改文件arch/arm/kernel/calls.S,添加CALL(sys_lkmao_hello)

修改的文件统计

1 arch/arm/include/uapi/asm/unistd.h

2 arch/arm/include/asm/unistd.h

3 kernel/sys.c

4 include/linux/syscalls.h

5 arch/arm/kernel/calls.S

 应用测试代码

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>   /* For SYS_xxx definitions */

#define DEBUG_INFO(format, ...) printf("%s:%d -- "format"\n",\
__func__,__LINE__,##__VA_ARGS__)

#define __NR_lkmao_hello 388

int main(int argc, char**argv){
    int ret = syscall(__NR_lkmao_hello);
    DEBUG_INFO("ret = %d\n", ret);
    return 0;
}

编译代码测试

在系统调用中打印PID和UID

在kernel/sys.c文件中,修改SYSCALL_DEFINE0(lkmao_hello)的定义,如下所示,修改后重新编译内核。


SYSCALL_DEFINE0(lkmao_hello)
{
	const struct cred *cred = current_cred();
	printk("%s:%s:%d -- sys_lkmao_hello is called\n",
		__FILE__,__func__,__LINE__);



	printk("%s:%s:%d -- pid = %d,%d,uid = %d\n",
		task_pid_nr(current),
		task_pid_nr_ns(current),
		cred->uid;,
		__FILE__,__func__,__LINE__);
	return 0;
}

 测试结果

 

小结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

runtime error: member access within misaligned address(力扣最常见错误之一)

runtime error: member access within misaligned address&#xff08;力扣最常见错误之一&#xff09; 前言原因和解决办法总结 前言 最近博主在刷力扣时&#xff0c;明明代码逻辑都没问题&#xff0c;但总是报下面这个错误&#xff1a; runtime error: member access within…

SQL-每日一题【1251. 平均售价】

题目 Table: Prices Table: UnitsSold 编写SQL查询以查找每种产品的平均售价。average_price 应该四舍五入到小数点后两位。 查询结果格式如下例所示&#xff1a; 解题思路 1.题目要求查询每种产品的平均售价。给出了两个表&#xff0c;我们用聚合查询来解决此问题。 2.首先我…

腾讯会议:云上协奏,远程韶华

腾讯会议的原理及历史 摘要 本论文介绍了腾讯会议的原理和历史。腾讯会议是一款基于云计算和通信技术的在线会议平台,由腾讯公司推出。通过分析腾讯会议的工作原理和演进历史,我们可以深入了解该平台是如何实现高效、便捷、安全的远程协作和沟通的。 1. 引言 近年来,随着…

ruby send call 的简单使用

refer: ruby on rails - What does .call do? - Stack Overflow Ruby使用call 可以调用方法或者proc m 12.method("") # > method gets the method defined in the Fixnum instance # m.class # > Methodm.call(3) #> 15 # 3 is passed inside the…

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…

如何在Stream流中分组统计

上面是今天碰到需求,之前就做过类似的分组统计,这个相对来说比较简单,统计的也少,序号和总预约人数这两部分交给前端了,不需要由后端统计,后端统计一下预约日期和检查项目和预约人数就行; Overridepublic List<ItemStatisticsVo> statistics(ItemStatisticsModel itemSta…

智能与本体

世界的本体是一个复杂而广泛的话题&#xff0c;可以根据不同的学科、思想体系和信仰背景来进行不同的解释和理解。它涉及到人类对于现实和存在的思考&#xff0c;以及对于世界本质的追寻和探索。 在哲学上&#xff0c;世界的本体指的是存在的实质或基本特征。它探讨了世界的本源…

[保研/考研机试] KY85 二叉树 北京大学复试上机题 C++实现

题目链接&#xff1a; 二叉树https://www.nowcoder.com/share/jump/437195121692000296981 描述 如上所示&#xff0c;由正整数1&#xff0c;2&#xff0c;3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是&#xff0c;结点m所在的子树中一共包…

线程记录(2)

1.线程状态 NEW : 分配内存地址&#xff0c;创建线程 RUNNABLE&#xff1a;&#xff08;就绪/运行&#xff09;调用start()之后&#xff08;/没有调度CPU调度&#xff09; BLOCKED&#xff1a;还未拿到锁&#xff0c;等待、被阻塞&#xff08;拿到synchronized失败状态&…

AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

大家好&#xff0c;我是风雨无阻。 本文适合人群&#xff1a; 想要了解AI绘图基本原理的朋友。 对Stable Diffusion AI绘图感兴趣的朋友。 本期内容&#xff1a; Stable Diffusion 能做什么 什么是扩散模型 扩散模型实现原理 Stable Diffusion 潜扩散模型 Stable Diffu…

TFRecords详解

内容目录 TFRecords 是什么序列化(Serialization)tf.data 图像序列化&#xff08;Serializing Images)tf.Example函数封装 小结 TFRecords 是什么 TPU拥有八个核心&#xff0c;充当八个独立的工作单元。我们可以通过将数据集分成多个文件或分片&#xff08;shards&#xff09;…

初始多线程

目录 认识线程 线程是什么&#xff1a; 线程与进程的区别 Java中的线程和操作系统线程的关系 创建线程 继承Thread类 实现Runnable接口 其他变形 Thread类及其常见方法 Thread的常见构造方法 Thread类的几个常见属性 Thread类常用的方法 启动一个线程-start() 中断…

[保研/考研机试] KY109 Zero-complexity Transposition 上海交通大学复试上机题 C++实现

描述&#xff1a; You are given a sequence of integer numbers. Zero-complexity transposition of the sequence is the reverse of this sequence. Your task is to write a program that prints zero-complexity transposition of the given sequence. 输入描述&#xf…

Docker的基本概念及镜像加速器的配置

1.Docker的概念 由于代码运行环境不同&#xff0c;代码运行会出现水土不服的情况。运用docker容器会把环境进行打包&#xff0c;避免水土不服。docker是一种容器技术&#xff0c;它解决软件跨环境迁移的问题。 2&#xff0c;安装Docker 3.Docker架构 4.Docker镜像加速器的配…

11、Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow Pytorch版本

Nvidia显卡驱动、CUDA、cuDNN、Anaconda及Tensorflow-GPU版本 一、确定版本关系二、安装过程1.安装显卡驱动2、安装CUDA3、安装cudnn4、安装TensorFlow5、安装pytorch 三、卸载 一、确定版本关系 TensorFlow Pytorch推出cuda和cudnn的版本&#xff0c;cuda版本推出驱动可选版本…

【boost网络库从青铜到王者】第二篇:asio网络编程中的socket的监听和连接

文章目录 1、网络编程基本流程2、终端节点endpoint的创建2.1、客户端终端节点endpoint的创建2.2、服务器终端节点endpoint的创建 3、服务器与客户端通信套接字socket的创建4、服务器监听套接字socket的创建5、绑定accpet监听套接字6、客户端连接指定的端点7、服务器接收连接8、…

网工最常犯的9大错误,越早知道越吃香

下午好&#xff0c;我的网工朋友 我们常说&#xff0c;人要学会避免错误&#xff0c;尤其是对在职场生活的打工人来说&#xff0c;更是如此。 学生时代&#xff0c;我们通过错题本收集错误&#xff0c;提高刷题正确率和分数&#xff0c;但到了职场&#xff0c;因为没有量化的…

WebAPIs 第四天

1.日期对象 2.节点操作 3.M端事件 4.JS插件 一.日期对象 实例化时间对象方法时间戳 日期对象&#xff1a;用来表示时间的对象 作用&#xff1a;可以得到当前系统时间 1.1 实例化 ① 概念&#xff1a;在代码中发现了new关键字时&#xff0c;一般将这个操作称为实例化 …

九、多态(2)

本章概要 构造器和多态 构造器调用顺序继承和清理构造器内部多态方法的行为 协变返回类型使用继承设计 替代 vs 扩展向下转型与运行时类型信息 构造器和多态 通常&#xff0c;构造器不同于其他类型的方法。在涉及多态时也是如此。尽管构造器不具有多态性&#xff08;事实上…

DoIP学习笔记系列:(五)“安全认证”的.dll从何而来?

文章目录 1. “安全认证”的.dll从何而来?1.1 .dll文件base1.2 增加客户需求算法传送门 DoIP学习笔记系列:导航篇 1. “安全认证”的.dll从何而来? 无论是用CANoe还是VFlash,亦或是编辑cdd文件,都需要加载一个与$27服务相关的.dll(Windows的动态库文件),这个文件是从哪…