请教LDD3中scull的几个问题

发布于 2022-09-22 13:34:51 字数 848 浏览 14 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

一枫情书 2022-09-29 13:34:51

喔,木有人在看LDD3吗?
记得版主说正在看啊

似梦非梦 2022-09-29 13:34:51

今天一直忙,没来得及看论坛,不好意思啊

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减去它自己的偏移。

多情癖 2022-09-29 13:34:51

2.执行wirte的时候,如果要写入的内容比较多,应该是会多次调用scull_write。这个是在那里实现的,还是系统的机制呢?

这个通常不会有限制,由于scull是一个虚拟的设备,所以,只要不超过他的大小就可以了。

懵少女 2022-09-29 13:34:51

原帖由 dreamice 于 2008-11-7 14:24 发表

这个通常不会有限制,由于scull是一个虚拟的设备,所以,只要不超过他的大小就可以了。

呵呵,我曾经测试了。写了一个16000多字节进去,它使用了5个量子, scull_write被调用了8次

[ 本帖最后由 Godbach 于 2008-11-7 14:53 编辑 ]

只怪假的太真实 2022-09-29 13:34:51

原帖由 Godbach 于 2008-11-7 14:27 发表

呵呵,我曾经测试了。写了一个16000多字节进去,它使用了5个qset, scull被调用了8次

底层实现这些qset的管理,上层写的数据只要不超过总的大小,应该没有问题。

帅哥哥的热头脑 2022-09-29 13:34:51

原帖由 dreamice 于 2008-11-7 14:36 发表

底层实现这些qset的管理,上层写的数据只要不超过总的大小,应该没有问题。

但是程序设计的scull_write应该是至多写一个量子,到头就结束了啊

看透却不说透 2022-09-29 13:34:51

应该是系统调用write可能就执行了多次

自由如风 2022-09-29 13:34:51

原帖由 Godbach 于 2008-11-7 14:52 发表

但是程序设计的scull_write应该是至多写一个量子,到头就结束了啊

这部分我回头再看看,忘了是不是至多只写一个量子。

悸初 2022-09-29 13:34:51

原帖由 dreamice 于 2008-11-7 15:09 发表

这部分我回头再看看,忘了是不是至多只写一个量子。

呵呵,更正一下。我的测试方法有点不合适。我是使用cat file >/dev/scull
按理说应该写个C程序,调用write进行测试。但好像依然是多次调用了scull_write

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文