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

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET