本文系转载,著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。linux
做者:宋宝华编程
来源: 微信公众号linux阅码场(id: linuxdev)vim
先强调一点:在一切可能的场景,尽量地使用前向声明(Forward Declaration)。这符合信息隐蔽的原则。微信
那么前向声明到底是个什么鬼?在内核写代码和看代码的童鞋,常常发现Linux内核里面充斥着这样的代码,好比ide
include/vim linux/regulator/driver.h设计
文件中:3d
咱们以regmap这个结构体为例,这个地方就是一个前向声明,告诉后面的代码regmap是个结构体,至于这个结构体里面有什么鬼,不知道!指针
Linux能够说满世界都在使用这个结构体。满世界都在使用声明在include/linux/regmap.h中的regmap_write()、regmap_read()这样的API,能够说无处不在,无处不用,好比drivers/rtc/rtc-at91sam9.c中的:blog
这样的东西你们随便一搜索,均可以搜索出来无数个。这样看起来,regmap这个结构体,应该是一个跨模块的API,它的整个结构体长成怎么样,应该是出如今一个include/linux/级别的顶级跨模块头文件中了,这样方便跨模块引用这个结构体。接口
可是,真实的状况却让你大跌眼镜,regmap结构体的具体成员长什么样子,没有出如今任何一个外部级别的头文件里面,而是彻底internal的(内部的、内部的、内部的,各位童鞋!!!):
drivers/base/regmap/internal.h
既然它出如今drivers/base/regmap/internal.h,那么想必除了drivers/base/regmap/自己的内部实现外,外部不可能引用drivers/base/regmap/internal.h这个头文件。
因此,咱们得出一个结论,尽管Linux满世界都在使用struct regmap,可是除了drivers/base/regmap/内部之外,其实外部没有任何一我的知道regmap这个结构体长成什么样子!!
这是一种极其良好的“高内聚、低耦合”设计。由于,drivers/base/regmap/外部全部的人,其实都只是在拥有regmap这个结构体的指针,而并无访问regmap结构体其中的任何一个成员,其实也只有drivers/base/regmap/的内部实如今访问而已。
好比,regmap_write实现于:drivers/base/regmap/regmap.c文件,它的代码以下:
这样作带来的一个极大好处是,drivers/base/regmap/外部的世界根本不须要知道regmap结构体长成什么样子,由于没人须要知道,它们都只是在访问regmap的指针!
而drivers/base/regmap/内部不管怎么修改regmap结构体的实现和成员自己,对外部的世界根本不可见,修改regmap结构体后,drivers/base/regmap/之外的模块都不须要从新编译!
相反,若是咱们直接把regmap结构体的内部细节暴露在include/linux/regmap.h这个头文件中,那么因为这个头文件满世界都被引用,你只要修改regmap结构体自己,就会致使内核无数模块的增量编译!
include/linux/regmap.h中暴露了regmap_config结构体,这说明这个结构体的内容须要被regmap之外的模块知道:
...
为何,它涉及到具体的寄存器是如何读写的callback以及具体的寄存器pattern,这确定是一个API基本的东西,自己就应该是跨模块的东西,因此它的长相出如今了include/linux/regmap.h这个顶级头文件中。
对于一个外部模块而言,它只须要可以经过regmap.h公开暴露的小部分寄存器配置接口,来经过相似regmap_init_mmio()这个的API来填充regmap结构体的内部实现。好比drivers/rtc/rtc-at91sam9.c中的:
上述代码中,rtc->gpbr是一个struct regmap指针,regmap_init_mmio()在内部填充了regmap的自己实现。以后drivers/rtc/rtc-at91sam9.c再调用regmap_write()、regmap_read()的时候,这些API从regmap模块内部调用咱们填充进去的reg_bits、val_bits、reg_stride这些寄存器pattern,帮忙完成寄存器的最终读写。
永远用高内聚和低耦合的思想设计代码。Linux内核2000万行的代码,不这么设计确定要崩盘。写代码不是得过且过。尤为作单片机写裸奔程序的童鞋要特别注意,大家每每以为玩Linux的童鞋代码一层层套很傻逼,这是彻底不正确的理解。
每天要带娃,鸡飞狗跳,没时间写,我随便用碎片时间胡说八道的,不知道各位看官有什么感想?欢迎板砖,也欢迎打赏。
更多精彩更新中……欢迎关注微信公众号:linux阅码场(id: linuxdev)