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

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe