请问一个基本的字符驱动程序SCULL的具体过程?
各位大侠:
LDD3书上的有些概念不太明白,比如说:
1.分配和释放设备编号(是不是分配主设备号?)
2.字符设备注册是什么意思?它和加载模块进内核有什么区别?感觉字符设备注册和从系统中移除设备与分配和释放设备编号很
像,很像,它们有什么区别啊?
3.书上有这么一句话:p59 内核内部使用struct cdev 结构表示字符设备。
p60 在scull内部,它通过struct scull_dev结构表示每个设备。
这里的2句话很不理解,同样的设备怎么有2个不同的结构体表示???
还请各位指点!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
虽然不能很清楚地回答你,但可能会有点帮助
1。可以这么说,设备编号是通过主、次设备号生成的,主设备号确定驱动程序,次设备号确定具体的设备节点。
2。字符设备注册我是这样理解的:就是在文件系统添加设备节点信息,而它的注册方式可以是直接编译到内核和以模块的方式添加到内核。
3。struct cdev 是描述的一个字符设备, 而struct scull_dev是用户自己要添加的设备,你会发现在struct scull_dev内部包含了stuct cdev结构说明用户要添加的就是一个字符设备,之所以这样定义是为了方便管理与用户所定义设备的管理,因为我们
可能会在设备结构中还要包含其他的信息,比如信号量等。这种结构类似于继承关系。
谢谢楼上的回答!
今天又看了一遍,又有个问题:
1.scull设备驱动中的read,write 系统调用为什么一次只处理一个量子?
2:在write代码中有这么一段代码:
if(!dptr->data)
{dptr->data=kmalloc(qset*sizeof(char *),GFP_KERNEL);
if(dptr->data)
goto out;
memset(dptr->data,0,qset*sizeof(char *)); //这句是什么意思???
}
dptr->data清 零