c - Linux : Using module functions

标签 c linux-kernel

假设我有一个具有此功能 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/终端使用这个函数?

最佳答案

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

  • 首先, 确定它是否被编译/链接到当前运行的内核中。 如果不是,就这样做(将其编译/链接到内核,然后重新启动)。
    • 或者, 您可能有能力将它动态加载到内核中。 具体如何操作取决于您的特定操作系统 并且超出了这个问题的范围。
  • 找出它是b锁设备还是c字符设备, 以及它的主要设备号是什么。 我也不能具体告诉你该怎么做; 咨询您本地的资源。
  • 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>whatever</i> 做随心所欲地归档, 基于驱动程序的预期功能。 (确定驱动程序的预期功能超出了范围。) 例如,您可以尝试类似

    od -cb /dev/foo
    echo "Hello, world." > /dev/fu
    
  • 当然,如果是 block 设备, 替换 c在上面的说明中使用 b .

关于c - Linux : Using module functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32030179/

相关文章:

linux - linux内核模块生成的核心文件

c - 我应该分解 long scanf 以使其易于维护吗?

c - 获取用户信息函数

c - linux内核中红黑节点的struct对齐

caching - 如何在 ARM Cortex-A7 的内核之间划分 L2 缓存?

linux - 为什么不能直接从硬件中断调用 schedule()?

c - 将 float32 的内容传递给 C 中的 int32

c - C语言结构体的动态内存分配

CUDA程序返回随机结果

linux - 如何自动获得IP地址更改通知