compat_ioctl 32位运行环境下调用64位的ioctl内核

2024-06-20 06:58

本文主要是介绍compat_ioctl 32位运行环境下调用64位的ioctl内核,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

compat_ioctl 被使用在用户空间为32位模式,而内核运行在64位模式时常使用.unlocked_ioctl 属性指定ioctl,。这时候,需要将64位转成32位。例如PCBA测试

如何转换?

请参考下面的方式在内核中添加

 

1.   file_operations 中添加属性并指定函数

static const struct file_operations bcm2079x_dev_fops = {

.owner = THIS_MODULE,

.llseek = no_llseek,

.poll = bcm2079x_dev_poll,

.read = bcm2079x_dev_read,

.write = bcm2079x_dev_write,

.open = bcm2079x_dev_open,

.unlocked_ioctl = bcm2079x_dev_unlocked_ioctl,

.compat_ioctl = bcm2079x_dev_compat_ioctl

};

 

2. 实现新指定的函数,实现指针的转换

static long bcm2079x_dev_compat_ioctl(struct file *file,

 unsigned int cmd, unsigned long arg)

{

void __user *arg64 = compat_ptr(arg);

int result = 0;

if (!file->f_op || !file->f_op->unlocked_ioctl) {

printk("%s >> file->f_op or file->f_op->unlocked_ioctl is null\n",__func__);

return -ENOTTY;

}

switch (cmd) {

// 这里表省略.....

case BCMNFC_CHANGE_ADDR:

if (file->f_op->unlocked_ioctl)

result = file->f_op->unlocked_ioctl(file, BCMNFC_CHANGE_ADDR, (unsigned long)arg64);

break;

case BCMNFC_POWER_CTL:

if (file->f_op->unlocked_ioctl)

result = file->f_op->unlocked_ioctl(file, BCMNFC_POWER_CTL, (unsigned long)arg64);

break;

default:

printk("%s  unknown cmd \n", __func__);

 

return 0;

}

 

return 0;

}


这篇关于compat_ioctl 32位运行环境下调用64位的ioctl内核的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077422

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

22.手绘Spring DI运行时序图

1.依赖注入发生的时间 当Spring loC容器完成了 Bean定义资源的定位、载入和解析注册以后,loC容器中已经管理类Bean 定义的相关数据,但是此时loC容器还没有对所管理的Bean进行依赖注入,依赖注入在以下两种情况 发生: 、用户第一次调用getBean()方法时,loC容器触发依赖注入。 、当用户在配置文件中将<bean>元素配置了 lazy-init二false属性,即让

21.手绘Spring IOC运行时序图

1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让 容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置文件。 DI(Dependency Injection)依赖注入:就是指对象是被动接受依赖类

java中查看函数运行时间和cpu运行时间

android开发调查性能问题中有一个现象,函数的运行时间远低于cpu执行时间,因为函数运行期间线程可能包含等待操作。native层可以查看实际的cpu执行时间和函数执行时间。在java中如何实现? 借助AI得到了答案 import java.lang.management.ManagementFactory;import java.lang.management.Threa

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手