Linux: 使用模块函数

Linux: Using module functions

假设我有一个具有此功能的模块 my_open:

int my_open( struct inode *inode, struct file *filp ) {

   filp->private_data = //allocate private data 

   if( filp->f_mode & FMODE_READ )
            //handle read opening
   if( filp->f_mode & FMODE_WRITE )
            //handle write opening

   if (MINOR( inode->i_rdev )==2){
      filp->f_op = &my_fops2;
   }

   return 0;
   }

如何使用 shell/terminal 中的这个功能?

这是设备驱动程序的 open 函数, 或者它是披着狼皮的羊 [原文如此]。 万一这是普通的普通用户级代码, 将其编译成可执行文件并使用它。但是如果是设备驱动的open函数,

  • 首先, 判断是否compiled/linked进入当前运行内核。 如果不是,请将其设置为(compile/link 将其放入内核,然后重新启动)。
    • 或者, 您可能有能力将它动态加载到内核中。 具体如何操作取决于您的特定操作系统 并且超出了这个问题的范围。
  • 判断是b锁设备还是c字符设备, 以及它的 major 设备号是多少。 我也不能具体告诉你该怎么做; 咨询您当地的资源。
  • OK,假设它是一个主设备号为42的字符设备。 浏览 /dev‖(使用 ls -l)以查找以 c 开头的条目 (对于“字符”)并包含 42,<i>something</i> 大小应该在哪里,像这样:

    drwxr-xr-x  1 root    root        512 Feb 10  2015 .
    drwxr-xr-x  1 root    root       1024 Feb 10  2015 ..
    crw-rw-rw-  1 root    root    42,   0 Aug 15 18:31 foo
    crw-rw-rw-  1 root    root    42,   2 Aug 15 18:31 fu
    crw-rw-rw-  1 root    root    42,  17 Aug 15 18:31 fubar
    

    如果找不到,请创建一些。有关详细信息,请参阅 man mknod。 您可能应该创建一个次设备号为 2 的设备 至少一个号码不同 (因为代码将 2 视为特例)。

  • /dev/<i>随便</i>文件做任何你想做的, 基于驱动程序的预期功能。 (确定驱动程序的预期功能超出了范围。) 例如,您可以尝试

    od -cb /dev/foo
    echo "Hello, world." > /dev/fu
    
  • 当然如果是块设备的话, 将上述说明中的 c 替换为 b.