Sysfs文件系统(一):从serio virtual bus开始说起

seriobus

serio是一种虚拟总线,先上一副图

大概就是这样的,驱动程序注册一个serio port; 当接受硬件传上来的数据的时候通过serio port将数据传递给在总线另外一端的serio driver。当然由于这种结构的出现也就使得一个serio driver可以对应多个serio port(serio driver只是一个数据处理的程序罢了)。


bus的种类很多了,除了serio bus, 还有很多。

具体可以看下/sys/bus下面的文件夹,每一个文件夹的名字就是一种总线。随便打开一个文件夹里面都有两个子文件夹:devices和drivers。(在serio总线中serio port就是device,而serio driver就是driver)它们的架构都大同小异。

 具体示例程序可以看Linux源代码中的/driver/input中的程序,都是以这种模式编写的。

同样的,这种模式还有一个至关重要的好处:就是对于硬件厂商来说,他们只需要提供某种类型总线的driver就好了,而这样的程序是非常好写的,只需要经过简单的培训,一个对Linux驱动程序没有一点了解的程序员都能够写出。

来看下device和driver是如何匹配的,我们用serio总线的代码来做一个示例看下。

static int serio_match_port(const struct serio_device_id *ids, struct serio *serio)
{
    while (ids->type || ids->proto) {
        if ((ids->type == SERIO_ANY || ids->type == serio->id.type) &&
            (ids->proto == SERIO_ANY || ids->proto == serio->id.proto) &&
            (ids->extra == SERIO_ANY || ids->extra == serio->id.extra) &&
            (ids->id == SERIO_ANY || ids->id == serio->id.id))
                return 1;
        ids++;
    }
    return 0;
}

其实就是在serio port和serio driver中各有一个id table, 如果两边match,则就匹配成功。

最后给推荐一篇文章:
http://blog.chinaunix.net/u1/51562/showart_1083392.html
这个是对serio virtual bus源代码的分析,相信有了这样的整体概念,这个代码分析就比较轻松了。其实Linux内核代码多数都不会很难,只需要知道整体的架构和设计人员的用意之后,代码就像看小说一样。