linux内核——2.linux内核基础知识——摘录

本文介绍了Linux内核的基础知识,包括宏内核与微内核架构的优缺点,以及Linux内核如何利用预抓取技术优化性能。详细讲解了预抓取函数__builtin_prefetch的用法,并展示了预抓取的包装器函数示例。此外,还探讨了用于链表操作的宏,如offsetof、list_add系列函数,以及链表的合并与旋转操作。
摘要由CSDN通过智能技术生成

come from : 奔跑吧linux内核

宏内核架构的优点是设计简洁和性能比较好,而微内核架构的优势也很明显,比如稳定性和实时性等。

第二章 Linux内核基础知识

#define min(x, y) ({ \
       typeof(x) _min1 = (x); \
       typeof(y) _min2 = (y); \
        (void) (&_min1 == &_min2); \
        _min1 < _min2 ? _min1 : _min2; \ 
})

其中(void) (&_min1 == &_min2);有什么作用?

这句的作用是比较两个操作数的类型是否相同,防止不同类型的数据进行比较。
若不相同,则会在编译时给出警告:comparison of distinct pointer types lacks a cast。

两个指针类型不同是不能进行相互比较的。

struct line {
    int length;
    char contents[0];  // 变长数组
};
struct line *thisline = malloc(sizeof(struct line) + this_length);
thisline->length = this_length;

#include <linux/printk.h>
#define pr_debug(fmt, ...) \
    dynamic_pr_debug(fmt, ##__VA_ARGS__)
...可变参数, __VA_ARGS__ 是编译器保留字段 
预处理时把参数传递给宏,当宏调用展开时,实际参数就传递给dynamic_pr_debug函数了
int libcfs_debug_msg(struct libcfs_debug_msg_data *msgdata, const char *format1, ...)
__attribute__((format(printf, 2, 3));

__attribute__ format
该__attribute__属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。
format的语法格式为:
format (archetype, string-index, first-to-check)
          format属性告诉编译器,按照printf, scanf, 
strftime或strfmon的参数表格式规则对该函数的参数进行检查。“archetype”指定是哪种风格;“string-index”指定传入函数的第几个参数是格式化字符串;“first-to-check”指定从函数的第几个参数开始按上述规则进行检查。
具体使用格式如下:
__attribute__((format(printf,m,n)))
__attribute__((format(scanf,m,n)))
其中参数m与n的含义为:
m:第几个参数为格式化字符串(format string);
n:参数集合中的第一个,即参数“…”里的第一个参数在函数参数总数排在第几,注意,有时函数参数里还有“隐身”的呢,后面会提到;
在使用上,__attribute__((format(printf,m,n)))是常用的,而另一种却很少见到。下面举例说明,其中myprint为自己定义的一个带有可变参数的函数,其功能类似于printf:
//m=1;n=2
extern void myprint(const char *format,...) __attribute__((format(printf,1,2)));
//m=2;n=3
extern void myprint(int l,const char *format,...) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值