如何在用户空间中调用scull_open(),其中scull_open在scull内核驱动程序

时间:2015-12-25 09:18:34

标签: c linux

我是Linux设备驱动程序编程的新手。我只是想使用scull驱动程序,这在Linux设备驱动程序中有解释。

想要从用户空间调用scull_open()进行写入/读取或关闭操作。

目前我可以使用insmod成功插入scull模块并获得主要数字。我还使用mknod / dev / scull0 c 251 0获得了dev节点/dev/scull0

接下来,我使用以下语句打开我新创建的scull设备

file_d = scull_open("/dev/scull0", 0);

但是我收到了以下错误:

undefined reference to `scull_open'

我用gcc进行编译。

  

我是否需要链接任何库或头文件才能使用scull驱动程序?   请解释我应该如何打开scull driver。

1 个答案:

答案 0 :(得分:1)

  

我是否需要链接任何库或头文件才能使用scull驱动程序?

不,您不需要使用任何其他库/标题来实现此功能。

LDD3 book 的示例 scull驱动程序中,open()是为处理/dev/scull0调用而实现的处理函数来自file_d = open("/dev/scull0", 0); 设备上的用户空间。

请继续将用户空间应用更新为

/dev/scull0

运行更新的应用程序时,如果模块已修改且存在scull_open(),则执行上述行将导致立即在Linux内核驱动程序模块中调用open()

  

那么scull_open()如何最终调用scull_fops()

在您的scull驱动程序代码中记住struct file_operations scull_fops = { .owner = THIS_MODULE, .llseek = scull_llseek, .read = scull_read, .write = scull_write, .unlocked_ioctl = scull_ioctl, .open = scull_open, .release = scull_release, }; 吗?

定义为......

cdev_init(&dev->cdev, &scull_fops); 

并用作......

scull_fops

上述步骤基本上将/dev/scull0中列出的各种功能与sc设备相关联(例如scull_open())。

具体而言,open()scull_open()相关联。换句话说,

  • open()
  • 已注册为处理程序open()
  • 在scull司机内。
  
      
  1. 在用户空间中,Linux内核可以看到对/dev/scull0的调用。
  2.   
  3. 内核检查负责创建的驱动程序   scull_open()设备。
  4.   
  5. 接下来内核检查哪个是函数处理程序   注册处理在scull驱动程序中打开并调用它;在   这种情况O_RDONLY
  6.   

<子> 1.另一方面,使用相关的宏/枚举来澄清上下文/意图总是一个好主意。例如,使用0代替open()作为调用{{1}}的第二个参数。

<子> 2.另外,仅供参考,因为您正在阅读LDD3书籍,以下是本书中unconfirmed / confirmed个错误的列表。