我是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。
答案 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()
- 在用户空间中,Linux内核可以看到对
/dev/scull0
的调用。- 内核检查负责创建的驱动程序
scull_open()
设备。- 接下来内核检查哪个是函数处理程序 注册处理在scull驱动程序中打开并调用它;在 这种情况
醇>O_RDONLY
。
<子>
1.另一方面,使用相关的宏/枚举来澄清上下文/意图总是一个好主意。例如,使用0
代替open()
作为调用{{1}}的第二个参数。
子>
<子> 2.另外,仅供参考,因为您正在阅读LDD3书籍,以下是本书中unconfirmed / confirmed个错误的列表。 子>