[linux内核]linux内核编程规范
2014-03-12 10:49
183 查看
1,__attrubte__关键字的作用
点击打开链接
__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
struct str_struct{
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed));
以上结构体的大小为5
/* 当用到typedef时,要特别注意__attribute__ ((packed))放置的位置,相当于:
* typedef struct str_stuct str;
* 而struct str_struct 就是上面的那个结构。
*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed)) str;
以上结构体的大小为5
/* 在下面这个typedef结构中,__attribute__ ((packed))放在结构名str_temp之后,其作用是被忽略的,注意与结构str的区别。*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
}str_temp __attribute__ ((packed));
以上结构体的大小为6
attribute前后都有两个下划线,后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。
语法格式为:__attribute__ ((attribute-list))
属性 section 用于函数和变量,通常编译器将函数放在 .text 节,变量放在.data 或 .bss 节,使用 section 属性,可以让编译器将函数或变量放在指定的节中。
2,驱动程序中IS_ERR()的含义
所有的驱动程序都是运行在内核空间,内核空间虽然很大,但总是有限的,而在这有限的空间中,其最后一个page是专门保留的.
所有在内核指针如果指在最后一个PAGE,那么这就是一个错误指针,内核空间是3G-4G,所以OXFFFFF000-0XFFFFFFFF是无效的指针。
3,linux内核的likely()和unlikely函数
点击打开链接
likely和unlikely只是用来改变系统的性能,并不会改变以前已经有的值,
不会经常发生用unlikely,经常发生的用likly
4,mdelay和msleep()函数的区别
点击打开链接
mdelay精度更高,但是会一直占用CPU资源,msleep将当前进程放到等待队列中 根据个人经验,10ms以下的延时对时序要求比较高的地方最好还是用mdelay,100ms以上的延时最好还是用msleep,100ms以上的延迟
对linux的多任务系统运行还是有一定影响的。
点击打开链接
__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
struct str_struct{
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed));
以上结构体的大小为5
/* 当用到typedef时,要特别注意__attribute__ ((packed))放置的位置,相当于:
* typedef struct str_stuct str;
* 而struct str_struct 就是上面的那个结构。
*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
} __attribute__ ((packed)) str;
以上结构体的大小为5
/* 在下面这个typedef结构中,__attribute__ ((packed))放在结构名str_temp之后,其作用是被忽略的,注意与结构str的区别。*/
typedef struct {
__u8 a;
__u8 b;
__u8 c;
__u16 d;
}str_temp __attribute__ ((packed));
以上结构体的大小为6
attribute前后都有两个下划线,后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。
语法格式为:__attribute__ ((attribute-list))
属性 section 用于函数和变量,通常编译器将函数放在 .text 节,变量放在.data 或 .bss 节,使用 section 属性,可以让编译器将函数或变量放在指定的节中。
2,驱动程序中IS_ERR()的含义
所有的驱动程序都是运行在内核空间,内核空间虽然很大,但总是有限的,而在这有限的空间中,其最后一个page是专门保留的.
所有在内核指针如果指在最后一个PAGE,那么这就是一个错误指针,内核空间是3G-4G,所以OXFFFFF000-0XFFFFFFFF是无效的指针。
/*static inline long IS_ERR(const void *ptr) { return (unsigned long)ptr > (unsigned long)-1000L; }*/ static inline void * __must_check ERR_PTR(long error) { return (void *) error; }PTR_ERR()把指针转换成错误码。
3,linux内核的likely()和unlikely函数
点击打开链接
likely和unlikely只是用来改变系统的性能,并不会改变以前已经有的值,
不会经常发生用unlikely,经常发生的用likly
4,mdelay和msleep()函数的区别
点击打开链接
mdelay精度更高,但是会一直占用CPU资源,msleep将当前进程放到等待队列中 根据个人经验,10ms以下的延时对时序要求比较高的地方最好还是用mdelay,100ms以上的延时最好还是用msleep,100ms以上的延迟
对linux的多任务系统运行还是有一定影响的。
相关文章推荐
- [linux内核]linux内核编程规范
- as汇编命令(来自 深入理解Linux内核)
- Linux内核中的调度算法
- linux内核中container_of详解
- linux内核SPI总线驱动分析(一)
- 第十一学 linux内核——进程管理——进程是什么
- 设备树(五)linux内核主线booting-without-of.txt
- linux内核中的双向链表
- Linux内核网络系统中的设计模式
- linux内核编译
- Linux内核---13.启动分析1之arch/arm/kernel/head.S
- Linux内核升级Broadcom网卡问题(bnx2)
- Linux内核---23.yaffs2文件系统(未完成)
- Linux内核-信号之signal处理机制
- Linux内核makefile解析
- Linux内核输入体系的构架
- Linux内核---41.arm 内存初始化
- linux内核编译步骤与新内核启用
- Linux内核中的同步和互斥分析报告
- Linux内核分析 - 网络[五]:vlan协议-802.1q