学习linux内核(一)

来源:互联网 发布:怎么学java编程基础 编辑:程序博客网 时间:2024/06/08 09:00

初次学习linux内核,有错误请指出。


函数page_address_init()负责初始化高端内存,具体实现如下:

void __init page_address_init(void){int i;for (i = 0; i < ARRAY_SIZE(page_address_htable); i++) {INIT_LIST_HEAD(&page_address_htable[i].lh);spin_lock_init(&page_address_htable[i].lock);}}


for循环内使用了一个宏定义ARRAY_SIZE,具体定义如下:

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
实现功能与获取数组元素个数一样,其中__must_be_array(arr))作用:防止误用,比如用在指针而不是数组上


宏定义__must_be_array具体定义如下:

#define __must_be_array(a)BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))


宏定义BUILD_BUG_ON_ZERO具体定义如下:

#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
实现宏定义ARRAY_SIZE被误用报错。


宏定义__same_type具体定义如下:

# define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
判断两个类型是否相同。

__builtin_types_compatible_pgcc内嵌函数用于判断一个变量的类型是否为某指定的类型,假如是返回1,否则返回0

typeof():获取变量类型


Intel ECC编译器不支持__builtin_types_compatible_p(),可以定义如下:

#define __must_be_array(a) 0


实际测试代码:

#include <stdio.h>#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0])+__must_be_array(arr))#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))#define BUILD_BUG_ON_ZERO(e) (sizeof(struct {int:-!!(e);}))int main(){int a[] = {1, 2, 3, 4, 5};int *p;printf("%d\n", ARRAY_SIZE(a)); //正常运行输出5printf("%d\n", ARRAY_SIZE(p)); //报错return 0;}

报错的效果图:





补充:

sizeof(struct { int:-!!(e); }    冒号代表位域,如果e=1,那么sizeof(struct { int:-1; }。