内核模块和主要数字

时间:2016-04-04 22:28:59

标签: linux linux-kernel ioctl

我一直在阅读作为内核模块实现的驱动程序,并且对系统调用的CMD参数感到困惑。似乎系统调用的CMD参数编码在其他信息中,即设备的主要编号。这是为什么?这些信息绝对必要吗?

假设我对我的设备执行了“echo 5> / dev / mytestdevice”的写操作。我没有指定主要编号,因此我相信内核已经有了将设备与其内核模块相关联的方法。如果是这种情况,为什么我需要在对设备的ioctl调用中提供该信息(因为我将fd作为第一个参数传递给设备)?

总结我的问题是: -

  1. 当我执行“echo 5> / dev / mytestdevice”时,内核如何找到与该设备对应的驱动程序?
  2. 为什么主要号码作为参数传递给ioctl调用?

2 个答案:

答案 0 :(得分:1)

我假设你只是在谈论ioctl系统调用。请记住,那里有许多系统调用,其中许多系统根本不在设备上运行。

为什么你认为cmd参数(第3个)必须在其中编码主编号?任何特定驱动程序的ioctl命令集往往会选择一个任意值并在其位中对其进行编码。这样就可以通过其他工具轻松解码。但该值不是(或不是必须的)主要数字。

open / valid fd用于路由基于文件的系统调用,如readwrite以及ioctl

您可能希望查看ioctl文档,例如Documentation/ioctl/ioctl-number.txtDocumentation/ioctl/ioctl-decoding.txt

答案 1 :(得分:1)

  
      
  1. 当我执行“echo 5> / dev / mytestdevice”时,内核如何找到与该设备对应的驱动程序?
  2.   
设备文件/dev/mytestdevice

Inode 是一个特殊内容:它不是与某个文件的内容相关联,而是包含主要和次要数字。当您尝试使用此类文件执行某些操作时,内核首先使用这些标识符搜索已注册的设备,然后重定向找到的设备的操作。

  
      
  1. 为什么主要号码作为参数传递给ioctl调用?
  2.   

这不是真的:cmd ioctl调用的0参数不包含主要数字。