RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。

【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频B站搜索】嵌入式学习之Linux驱动(驱动基础进阶篇_全新升级)_基于RK3568

进阶6 内核运行ko文件实验——系统调用

在前面的学习中,我们了解到insmod命令的功能。当我们使用insmod命令加载ko文件时,它会调用系统调用init_module或finit_module。那么,什么是系统调用呢?接下来我们来进一步探索系统调用。


6.1 什么是系统调用

系统调用(system call)是操作系统提供给应用程序的编程接口,用于访问操作系统的服务和功能。它是应用程序与操作系统之间的桥梁,允许应用程序请求操作系统执行特定的操作,例如文件操作,进程管理,网络通信等。在计算机系统中,应用程序运行在用户态下,而操作系统运行在内核态下。用户态的应用程序无法直接访问操作系统的内核功能和资源,只能通过系统调用来向操作系统发出请求。当应用程序需要执行操作系统提供的服务或访问底层资源时,它会通过系统调用接口向操作系统发送请求,并传递必要的参数。操作系统接收到请求后,会在内核态下执行相应的操作,并将结果返回给应用程序。

举个例子来说明,假设小A同学去饭店吃饭。饭店提供了菜单,厨师会根据顾客点的菜来准备食物。在这个例子中,顾客相当于上层应用程序,顾客想要吃鱼香肉丝,可以通过服务员(类比系统调用)点这道菜。服务员接收到顾客的点菜请求后,将其传达给厨师(类比操作系统)。厨师根据订单准备食物,最后将食物交给服务员,服务员再将食物送到顾客面前。

这个例子说明了上层应用程序无法直接操作底层硬件,而是通过系统调用接口与操作系统进行交互来实现对硬件的访问。系统调用是与特定的CPU架构相关的,并且与操作系统的内核版本也有关系。

回到init_module和finit_module这俩个系统调用,它们是应用程序调用的系统调用。当应用程序调用这些系统调用时,操作系统内核会执行加载和运行ko文件的操作。这样,应用程序就能通过系统调用向操作系统请求加载内核模块的功能。


6.2 系统调用的流程

以init_module为例,init_module的原型为如下所示:

#include <linux/module.h>

int init_module(void *module_image, unsigned long len, const char *param_values);

参数说明:

module_image:指向内核模块的内存映像的指针。

len:内核模块的大小(以字节为单位)。

 param_values:用于传递内核模块参数的字符串。

返回值:成功加载并初始化内核模块时,返回0。加载和初始化内核模块失败时,返回负数值,表示错误代码。

syscall函数是一个系统调用的包装函数,用于在C/C++程序中调用系统调用。每个系统有一个唯一的系统调用号来标识对应的函数。它的原型如下:

long syscall(long number, ...);

参数说明:

number:系统调用的编号。不同的系统调用有不同的编号,可以在系统调用的文档或头文件中找到相应的编号。

...:可变参数,用于传递系统调用的参数。具体的参数个数和类型取决于不同的系统调用。

返回值:系统调用执行成功时,返回系统调用的结果或返回值。系统调用执行失败时,返回负数值,表示错误代码。错误代码的具体含义可以在系统调用的文档或头文件中找到相应的定义。

作用:根据系统调用号,调用相应的系统调用

那__NR_init_module 和哪个函数绑定了呢?打开include/uapi/asm-generic/unistd.h文件,找到以下代码:

/* kernel/module.c */

#define __NR_init_module 105

__SYSCALL(__NR_init_module, sys_init_module)

#define __NR_delete_module 106

__SYSCALL(__NR_delete_module, sys_delete_module)

__SYSCALL将系统调用号与sys_init_module函数绑定。这里有一个规律,在用户空间我们使用xxx函数,对应的系统调用的函数就是sys_xxx;

sys_init_module函数定义在kernel/module.c文件中。sys_init_module函数定义是一个宏定义。如下图所示

在上面的系统调用函数将用户空间的模块数据复制到内核空间,并调用load_module函数加载和初始化该模块。在load_module函数中,完成模块的加载过程,返回do_init_module函数进行模块的初始化。在do_init_module函数中,如果模块的init函数不为空,调用do_one_initcall函数执行模块的初始化函数。在do_one_initcall函数中,执行一个初始化调用函数,这个函数通常在内核初始化过程中使用,用于执行各个模块的初始化函数。

这个宏定义非常复杂,大家只要记住SYSCALL_DEFINE3(init_module, void __user *, umod,

unsigned long, len, const char __user *, uargs)等价于__se_sys_init_module函数即可。这也就解释了为什么当我调用这个系统调用的时候会调用__se_sys_init_module函数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护&#xff0c;并不能getshell。只能通过orw的方式拿到flag。 fdopen&#xff08;‘./flag’); # 打开flag文件&#xff0c;得到fd…

Android MTE技术详解

1.MTE概念 MTE&#xff08;内存标记扩展&#xff09;是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中&#xff0c;类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂&#xff0c;不适用于广泛部署&#xff08;仅调试使用&#xff09;。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi&#xff0c;大家好&#xff0c;我是源于花海。本文主要使用数据标注工具 Labelme 对猫&#xff08;cat&#xff09;和狗&#xff08;dog&#xff09;这两种训练样本进行标注&#xff0c;使用预训练模型 VGG16 作为卷积基&#xff0c;并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi&#xff0c; Iro Laina&#xff0c; Christian Rupprecht&#xff0c; Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面&#xff0c;下面是 Django 系统决定执行哪个 Python 代码使用的算法&#xff1a; Django确定要使用的根URLconf模块&#xff0c;一般是在settings中的ROOT_URLCONF设置的值&#xff0c;但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 简单灵活&#xff0c;容易上手&#xff1b;支持参数化&#xff1b;能够支持简单的单元测试和复杂的功能测试&#xff0c;还可以用来做selenium/appnium等自动化测试、接口自动化测试&#xff08;pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了&#xff0c;同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测&#xff0c;由于其对C#不熟练&#xff0c;可能会影响公司后续的开发进度&#xff0c;所以趁着还在&#xff0c;赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…

LabVIEW动态数据交换实现数据通信

LabVIEW动态数据交换实现数据通信 介绍了LabVIEW软件在驱动一般多功能接口卡中的应用。LabVIEW作为一种图形化编程平台&#xff0c;被广泛应用于自动测量系统、工业过程自动化等领域。利用LabVIEW驱动实验室中常用的多功能接口卡&#xff0c;以实现数据采集和分析。 系统主要…

bxCAN 主要特性

bxCAN 主要特性 ● 支持 2.0 A 及 2.0 B Active 版本 CAN 协议 ● 比特率高达 1 Mb/s ● 支持时间触发通信方案 发送 ● 三个发送邮箱 ● 可配置的发送优先级 ● SOF 发送时间戳 接收 ● 两个具有三级深度的接收 FIFO ● 可调整的筛选器组&#xff1a; — CAN1 和…

Go语言的100个错误使用场景(一)|代码和项目组织

前言 大家好&#xff0c;这里是白泽。 《Go语言的100个错误以及如何避免》 是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析100…

ASP .NET Core Api 使用过滤器

过滤器说明 过滤器与中间件很相似&#xff0c;过滤器&#xff08;Filters&#xff09;可在管道&#xff08;pipeline&#xff09;特定阶段&#xff08;particular stage&#xff09;前后执行操作。可以将过滤器视为拦截器&#xff08;interceptors&#xff09;。 过滤器级别范围…

MATLAB环境下一种音频降噪优化方法—基于时频正则化重叠群收缩

语音增强是语音信号处理领域中的一个重大分支&#xff0c;这一分支已经得到国内外学者的广泛研究。当今时代&#xff0c;随着近六十年来的不断发展&#xff0c;己经产生了许多有效的语音增强算法。根据语音增强过程中是否利用语音和噪声的先验信息&#xff0c;语音增强算法一般…

基于springboot游戏分享网站源码和论文

网络的广泛应用给生活带来了十分的便利。所以把游戏分享管理与现在网络相结合&#xff0c;利用java技术建设游戏分享网站&#xff0c;实现游戏分享的信息化。则对于进一步提高游戏分享管理发展&#xff0c;丰富游戏分享管理经验能起到不少的促进作用。 游戏分享网站能够通过互…

快手社招一面算法原题

快手面试 最近收到一位读者的留言&#xff0c;是跟我吐槽「快手社招面试」的。 但是由于交谈内容太多东西需要脱敏&#xff0c;我打完马赛克之后&#xff0c;发现上下文都不连贯了。 遂罢。 但一转念&#xff0c;我想如果这真的是这个公司的普遍性问题&#xff0c;而非独立个例…

【极数系列】Flink环境搭建Linux版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

verdaccio搭建npm私服

一、安装verdaccio 注&#xff1a;加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注&#xff1a;首次启动后才会生成 C:\Users\h…

Idea上操作Git回退本地版本,怎么样保留已修改的文件,回退本地版本的四种方式代表什么?

Git的基本概念:Git是一个版本控制系统,用于管理代码的变更历史记录。核心概念包括仓库、分支、提交和合并。 1、可以帮助开发者合并开发的代码 2、如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 3、代码文件版本管理 问题描述 当我们使用git提交代码…