请教LDD3中scull的几个问题
1.container_of这个宏代码如何理解。其功能好像是通过他的成员得到整个结构体的指针。
/**
* container_of - cast a member of a structure out to the containing structure
* @ptr: the pointer to the member.
* @type: the type of the container struct this is embedded in.
* @member: the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
2.执行wirte的时候,如果要写入的内容比较多,应该是会多次调用scull_write。这个是在那里实现的,还是系统的机制呢?
[ 本帖最后由 Godbach 于 2008-11-7 11:45 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
喔,木有人在看LDD3吗?
记得版主说正在看啊
今天一直忙,没来得及看论坛,不好意思啊
container_of宏,它的功能是得到包含某个结构成员的结构的指针:
其实现如下:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
分析可知__mptr指向的是一个type结构里typeof(((type *)0)->member)类型member成员的指针,offsetof(type,member)是这个成员在结构中的偏移,单位是字节,所以为了计算type结构的起始地址,__mptr减去它自己的偏移。
这个通常不会有限制,由于scull是一个虚拟的设备,所以,只要不超过他的大小就可以了。
呵呵,我曾经测试了。写了一个16000多字节进去,它使用了5个量子, scull_write被调用了8次
[ 本帖最后由 Godbach 于 2008-11-7 14:53 编辑 ]
底层实现这些qset的管理,上层写的数据只要不超过总的大小,应该没有问题。
但是程序设计的scull_write应该是至多写一个量子,到头就结束了啊
应该是系统调用write可能就执行了多次
这部分我回头再看看,忘了是不是至多只写一个量子。
呵呵,更正一下。我的测试方法有点不合适。我是使用cat file >/dev/scull
按理说应该写个C程序,调用write进行测试。但好像依然是多次调用了scull_write