学习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_p:gcc内嵌函数用于判断一个变量的类型是否为某指定的类型,假如是返回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; }。
阅读全文
0 0
- linux内核学习(一)
- Linux内核学习(一)
- 学习linux内核(一)
- linux内核代码学习笔记(一)
- linux 0.11内核学习(一)
- linux内核I2C子系统学习(一)
- Linux 内核list_head 学习(一)
- [LINUX内核编程]学习笔记(一)
- Linux 内核list_head 学习(一)
- Linux内核模块学习(一)
- linux内核I2C子系统学习(一)
- Linux内核的学习总结(一)
- Linux 内核list_head 学习(一)
- Linux 内核list_head 学习(一)
- linux内核学习(一):进程管理
- Linux 内核list_head 学习(一)
- linux内核学习笔记(一)
- Linux内核学习笔记一
- thread和task的句柄区别
- SequoiaDB 受邀参加旧金山Spark 技术峰会,与Spark联手推动大数据企业级应用
- What’s New in Swift 3.1?
- 习题26
- 16年程序员平均工资122478元_你拖后腿了没?
- 学习linux内核(一)
- 在社交媒体上实现共享文件nativescript-angular应用
- Caffe学习:Forward and Backward
- JavaScript实现十种经典排序算法(js排序算法)
- Android四大组件--Activity详解(二)
- 如何制作9妹图
- 查看网络图片功能
- JDOM解析
- Android