随笔分类 -  Linux驱动中的细节问题探讨

Linux驱动中的细节问题探讨
摘要:内核定时器: unsigned long timeout = jiffies + (x * HZ); while(1) { // Check the condition. // Take a schedule. if (time_after(jiffies, timeout)) { printk("Timeout\n"); break; } }转换到秒: s = (jiffies - last_jiffies)/HZ;jiffies(约50天溢出)为jiffies_64的后32位,因此直接读取jiffies_64不具备原子性,使用get_jiffies_64,函数原理:[平 阅读全文
posted @ 2013-06-27 14:09 天地不仁 阅读(4574) 评论(0) 推荐(0) 编辑
摘要:内存映射结构:1.32位地址线寻址4G的内存空间,其中0-3G为用户程序所独有,3G-4G为内核占有。2.struct page:整个物理内存在初始化时,每个4kb页面生成一个对应的struct page结构,这个page结构就独一无二的代表这个物理内存页面,并存放在mem_map全局数组中。3.段式映射:首先根据代码段选择子cs为索引,以GDT值为起始地址的段描述表中选择出对应的段描述符,随后根据段描述符的基址,本段长度,权限信息等进行校验,校验成功后。cs:offset中的32位偏移量直接与本段基址相累加,得出最终访问地址。0-3G与mem_map的映射方式:因linux中采用的段式映射为 阅读全文
posted @ 2013-05-15 13:53 天地不仁 阅读(7302) 评论(1) 推荐(0) 编辑
摘要:第一段程序:关于一级指针与二级指针:int *p = NULL; int **p2 = &p; cout << p <<endl; cout << p2 <<endl;p输出是0,而p2的输出为xxxx.这里需要注意的是 NULL 不代表地址0,或者说在windows中代表0. NULL作为一个宏定义,任何系统均有自己的实现方式。(代表一个不可取值的地方)。二级指针是指向一级指针的地址,与NuLL无关。分水线------------------------------------------------------------------ 阅读全文
posted @ 2012-10-16 11:00 天地不仁 阅读(270) 评论(0) 推荐(0) 编辑
摘要:内核中container_of定义如下: #define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) 第二行好像没用,可以直接这样定义: #define container_of(ptr, type, member) ( (type *)( (char *)(ptr) - offsetof(type,member) ) ) 而在2.4的内核中的 阅读全文
posted @ 2012-09-06 09:09 天地不仁 阅读(328) 评论(0) 推荐(0) 编辑
摘要:Ssize_t 与size_t跟踪linux源码得到以下宏:#ifndef _SIZE_T#define _SIZE_Ttypedef __kernel_size_t size_t;#endif#ifndef _SSIZE_T#define _SSIZE_Ttypedef __kernel_ssize_t ssize_t;#endif在不同平台上,其具有不同的定义:/* sparc 64 bit */typedef unsigned long __kernel_size_t;typedef long __kernel_ssize_t;/* sparc 32 bit */typedef uns. 阅读全文
posted @ 2012-07-07 15:16 天地不仁 阅读(13321) 评论(1) 推荐(1) 编辑
摘要:C 预编译中的二次替换问题今天在阅读linux看门狗驱动的时候,发现一段奇怪的代码:static int tmr_atboot = CONFIG_S3C2410_WATCHDOG_ATBOOT;MODULE_PARM_DESC(tmr_atboot, "Watchdog is started at boot time if set to 1, default=" __MODULE_STRING(CONFIG_S3C2410_WATCHDOG_ATBOOT));依次跟进去宏的具体定义: #define __MODULE_STRING(x) __stringify(x) #de 阅读全文
posted @ 2012-07-06 10:31 天地不仁 阅读(585) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示