Linux访问ioctl访问失败的问题

2023-10-29

今天遇到一个ioctl访问失败的问题,做个记录,主要是用户态是32位,内核态时64位的。对于字符设备,内核中ioctl的挂接有不同,

一:写64位driver驱动时,必须实现compat_ioctl实现,用户态是32位时,会调用这个接口,否则会出现ioctl调用失败的情况。

https://www.cnblogs.com/pengdonglin137/p/8111272.html

Linux内核中struct file_operations含有下面两个函数指针:

struct file_operations {
        ... ...
    long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
    long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
        ... ...
};

注意:

1、compat_ioctl:支持64bit的driver必须要实现的ioctl,当有32bit的userspace application call 64bit kernel的IOCTL的时候,这个callback会被调用到。如果没有实现compat_ioctl,那么32位的用户程序在64位的kernel上执行ioctl时会返回错误:Not a typewriter

2、如果是64位的用户程序运行在64位的kernel上,调用的是unlocked_ioctl,如果是32位的APP运行在32位的kernel上,调用的也是unlocked_ioctl

#ifdef CONFIG_COMPAT
static long debussy_compat_ioctl (struct file *filp, unsigned int cmd, unsigned long arg)
{
    return
debussy_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
}
#endif

static const struct file_operations debussy_fops = {
    .owner        = THIS_MODULE,
    .unlocked_ioctl = debussy_ioctl,
#ifdef CONFIG_COMPAT
    .compat_ioctl = debussy_compat_ioctl,
#endif

};

二:特别是在写IOCTL的时候,由于有32bit userspace + 64bit kernel的问题,而且由于architecture的不同,不同data type的length也不同,所以在IOCTL中建议用u32, u64, s32这样无视architecture fix size的data type。

参看LDD十一章中有关Nature Alignment的描述。Alignment主要是牵涉到性能问题,不对齐的数据在fetch的时候会有exception,从而降低performance。

这里是网上搜到的一些建议。

参考资料: https://www.cnblogs.com/super119/archive/2012/12/03/2799967.html

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux访问ioctl访问失败的问题 的相关文章

  • i5 11300h和R5 5600H 参数对比哪个好

    酷睿i5 11300H配置为4个内核及8个线程 具备8MB的L3缓存和5MB的L2缓存 基础频率3 10GHz最高睿频4 40GHz Intel的显卡将集成Xe GPU内核 至于TDP i5 11300H TDP为35W 最高可配置为45W
  • Kconfig内容(详细)总结附示例快速掌握

    目录 一 简介 二 内容解析 2 1 menuconfig 2 2 choice endchoice 2 3 comment 2 4 menu endmunu 2 5 if endif 2 6 source 2 7 mainmenu 2 8
  • 解析 Linux 内核可装载模块的版本检查机制

    解析 Linux 内核可装载模块的版本检查机制 王 华东 系统工程师 自由职业者 简介 为保持 Linux 内核的稳定与可持续发展 内核在发展过程中引进了可装载模块这一特性 内核可装载模块就是可在内核运行时加载到内核的一组代码 通常 我们会
  • linux下如何清理缓存

    手头的路由本身内存就比较少 上面又跑了一个nginx php的环境 简直慢的爆炸 check的时候发现内存经常被占了很多 linux的虚拟内存机制 很多时候回导致内存得不到及时释放 有时候内存很少了 kill了很多进程 但是内存还是没有释放
  • 为WinDbg设置符号文件路径

    WinDbg可以通过加载Symbol文件 pdb 即时的调试程序 WinDbg如何找到相应的符号文件呢 WinDbg首先在 exe或者 dll所在目录下寻找同名的 pdb文件 如果找不到 WinDbg在Symbol File Path中查找
  • 操作系统课程设计3_系统调用

    一 实验目的 1 学习怎样重新编译 Linux 内核 2 理解 掌握 Linux 标准内核和发行版本内核的区别 二 实验内容 1 通过重新编译Linux来实现系统调用 2 通过增加模块来实现系统调用 三 实验步骤和结果 一 通过重新编译内核
  • 读《自己动手写操作系统》(于渊著)第一节

    最近开始看 自己动手写操作系统 虽然很早以前就读过一点点 但一直没有机会动手实践 本着光说不练假把式的原则 今天动手实践了开头的一部分 说得这么正经其实你就是看了一点点吧 囧 废话不多说 在这里做一个小小的总结 实验环境 操作系统 win7
  • 内核调试手段

    1 内核调试配置选项 内核拥有多项用于调试的功能 但是这些功能会造成额外的输出并导致性能下降 因此 内核通常都是禁止掉调试功能 内核调试相关的配置项主要集中在内核配置菜单 Kernel hacking 中 在使用下面的调试手段时 先确保内核
  • Linux内核memcpy的不同实现

    目录 1 概述 2 高级SIMD和浮点寄存器介绍 2 NEON指令 2 1 VLDR 2 2 VLDM 2 3 VSTR 2 4 VSTM 3 ARM架构程序调用寄存器使用规则 3 1 ARM寄存器使用规则 3 2 NEON寄存器使用规则
  • 进程管理(十三)---进程调度基本原理

    1 为什么需要调度 进程调度的概念比较简单 我们假设在一个单核处理器的系统中 同一时刻只有一个进程可以拥有处理器资源 那么其他的进程只能在就绪队列中等待 等到处理器空闲之后才有计划获得处理器资源来运行 在这种场景下 操作系统就需要从众多的就
  • 华为鸿蒙到底是不是安卓系统套了个壳?

    余承东在2月份宣布 鸿蒙将于4月份全面上线 果然没有食言 华为鸿蒙2 0来了 首批升级机型名单包括 Mate X2 Mate40以及P40系列 需要注意的是这次上线的鸿蒙OS依旧只是开发者测试版 还不是正式版本 另外花粉们必须前往官网申请加
  • 基于mykernel的简单时间片轮转多道程序内核代码分析

    一 实验环境 1 mykernel mykernel是由科大孟宁老师建立的一个用于开发您自己的操作系统内核的平台 它基于Linux Kernel 3 9 4 source code 我们可以在这里找到mykernel的源代码 https g
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • qemu 启动自定义文件系统命令

    kvm qemu aarch64 bin qemu system aarch64 M virt smp 8 cpu cortex a76 m 4G nographic kernel out kernel arm64 Image append
  • 一文讲透!Windows内核 & x86中断机制详解

    搞内核研究的经常对中断这个概念肯定不陌生 经常我们会接触很多与中断相关的术语 按照软件和硬件进行分类 硬件CPU相关 IRQ IDT cli sti 软件操作系统相关 APC DPC IRQL 一直以来对中断这一部分内容弄的一知半解 操作系
  • late_initcall和module_init

    late initcall和module init 分类 linux驱动程序设计 2012 11 04 15 14 3680人阅读 评论 0 收藏 举报 所有的 init函数在区段 initcall init中还保存了一份函数指针 在初始化
  • Windows内核面试题(持续更新,目前完成度30%约1.8万字)

    WINDOWS内核编程问题与答案 1 WDK和SDK的区别是什么 2 WDK全称叫做 3 如何创建WDK程序 4 WinDbg如何连接虚拟机 5 Windows内核符号表的作用 6 如何设置内核符号表与源文件 7 如何设置断点与源码调试 8
  • 字符设备驱动相关函数

    Linux内核中 a 使用cdev结构体来描述字符设备 b 通过其成员dev t来定义设备号 分为主 次设备号 以确定字符设备的唯一性 c 通过其成员file operations来定义字符设备驱动提供给VFS的接口函数 如常见的open
  • 【Linux】向Linux 5.11.8内核加入新的系统调用

    目录 特殊声明 A mathcal A A 获取root权限
  • Linux内核之pid为0和pid为1【转】

    转自 https blog csdn net jingyilin2008 article details 7815508 ops request misc 257B 2522request 255Fid 2522 253A 25221592

随机推荐