设为首页 加入收藏

TOP

Linux 内核中的 GCC 特性
2014-11-24 01:25:49 来源: 作者: 【 】 浏览:1
Tags:Linux 内核 GCC 特性

Linux 内核使用 GNU Compiler Collection (GCC) 套件的几个特殊功能。这些功能包括提供快捷方式和简化以及向编译器提供优化提示等等。了解这些特殊的 GCC 特性,学习如何在 Linux 内核中使用它们。
GCC 和 Linux 是出色的组合。尽管它们是独立的软件,但是 Linux 完全依靠 GCC 在新的体系结构上运行。Linux 还利用 GCC 中的特性(称为扩展)实现更多功能和优化。本文讨论一些重要的扩展,讲解如何在 Linux 内核中使用它们。


GCC 当前的稳定版本(版本 4.3.2)支持 C 标准的三个版本:


International Organization for Standardization (ISO) 最初的 C 语言标准(ISO C89 或 C90)
●带修正 1 的 ISO C90
●当前的 ISO C99(这是 GCC 使用的默认标准,本文也假设采用这种标准)
●注意:本文假设使用 ISO C99 标准。如果指定比 ISO C99 版本旧的标准,那么可能无法使用本文描述的一些扩展。可以在命令行上使用 -std 选项指定 GCC 使用的实际标准。可以通过 GCC 手册查看哪个标准版本支持哪些扩展(见 参考资料 中的链接)。




可以以几种方式对可用的 C 扩展进行分类。本文把它们分为两大类:


●功能性 扩展提供新功能。
●优化 扩展帮助生成更高效的代码。




功能性扩展


先讨论一些扩展标准 C 语言的 GCC 扩展。


类型发现


GCC 允许通过变量的引用识别类型。这种操作支持泛型编程。在 C++、Ada 和 Java 语言等许多现代编程语言中都可以找到相似的功能。Linux 使用 typeof 构建 min 和 max 等依赖于类型的操作。清单 1 演示如何使用 typeof 构建一个泛型宏(见 ./linux/include/linux/kernel.h)。



清单 1. 使用 typeof 构建一个泛型宏




范围扩展


GCC 支持范围,在 C 语言的许多方面都可以使用范围。其中之一是 switch/case 块中的 case 语句。在复杂的条件结构中,通常依靠嵌套的 if 语句实现与清单 2(见 ./linux/drivers/scsi/sd.c)相同的结果,但是清单 2 更简洁。使用 switch/case 也可以通过使用跳转表实现进行编译器优化。



清单 2. 在 case 语句中使用范围




还可以使用范围进行初始化,如下所示(见 ./linux/arch/cris/arch-v32/kernel/smp.c)。在这个示例中,spinlock_t 创建一个大小为 LOCK_COUNT 的数组。数组的每个元素初始化为 SPIN_LOCK_UNLOCKED 值。




范围还支持更复杂的初始化。例如,以下代码指定数组中几个子范围的初始值。




零长度的数组


在 C 标准中,必须定义至少一个数组元素。这个需求往往会使代码设计复杂化。但是,GCC 支持零长度数组的概念,这对于结构定义尤其有用。这个概念与 ISO C99 中灵活的数组成员相似,但是使用不同的语法。


下面的示例在结构的末尾声明一个没有成员的数组(见 ./linux/drivers/ieee1394/raw1394-private.h)。这允许结构中的元素引用结构实例后面紧接着的内存。在需要数量可变的数组成员时,这个特性很有用。




】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下的C语言的随机数算法代码 下一篇Linux内核ARP缓存表格式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: