登陆

宋宝华:Linux内核编程广泛运用的前向声明

admin 2020-02-14 278人围观 ,发现0个评论

前向声明

先着重一点:在全部或许的场景,尽或许地运用前向声明(Forward Declaration)。这宋宝华:Linux内核编程广泛运用的前向声明契合信息隐蔽的准则。

一个比方

那么前向声明究竟是个什么鬼?在内核写代码和看代码的童鞋,常常发现Linux内核里边充满着这样的代码,比方

include/vim linux/regulator/driver.h

文件中:

咱们以regmap这个结构体为例,这个当地便是一个前向声明,告知后边的代宋宝华:Linux内核编程广泛运用的前向声明码regmap是个结构体,至于这个结构体里边有什么鬼,不知道!

Linux可以说满国际都在运用这个结构体。满国际都在运用声明在include/linux/regmap.h中的regmap_write()、regmap_read()这样的API,可以说无处不在,无处不必,比方drivers/rtc/r宋宝华:Linux内核编程广泛运用的前向声明tc-at91sam9.c中的:

这样做带来的一怨气撞铃个极大优点是,drivers/base/regmap/外部的国际底子不需求知道regmap结构体长成什么姿态,因为没人需求知道,它们都只是在拜访regmap的指针!

而drivers/base/regmap/内部不管怎样修正regmap结构体的完结和成员自身,对外部的国际底子不行见,修正regmap结构体后,drivers/base/regmap/以外的模块都不需求从头编译!

相反,假如咱们直接把regmap结构体宋宝华:Linux内核编程广泛运用的前向声明的内部细节露出在include/linux/regmap.h这个头文件中,那么因为这个头文件满国际都被引证,你只需修正regmap结构体自身,就会导致内核很多模块的增量编译!

include/linux/regmap.h中露出了regmap_config宋宝华:Linux内核编程广泛运用的前向声明结构体,这说明这个结构体的内容需求被regmap以外的模块知道:



...

为什么,它涉及到详细的寄存器是怎么读写的callback以及详细的寄存器pattern,这肯定是一个API根本的东西,自身就应该是跨模块的东西,所以它的长相出现在了include/linux/regmap.h这个尖端头文件中。

关于一个外部模块而言,它只需求可以经过regma宋宝华:Linux内核编程广泛运用的前向声明p.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的童鞋代码一层层套很傻逼,这是彻底不正确的了解。

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP