文章转载自:
bbs.csdn.net/topics/220010277a.推荐内核学习书籍
1.学习内核整体结构和基本理论知识:<Linux Kernel Development second edition>,中文名:Linux内核设计与实现 第2版
2.学习驱动开发及查询基本资料:<Linux Device Drivers third edition>,中文名:Linux设备驱动程序 第3版
3.学习要求:lkd这本书要求精读,ldd要求了解,做具体的驱动时候去翻翻,当然最基本的字符设备驱动和块设备驱动必须熟练掌握
b.内核源码学习
1.c语言要求精通,指针和结构指针,指针函数及所以的数据类型的转换要求越熟悉越好,
熟练运用c99标准及其扩展功能,还没有找到很好的中文资料,碰到立即积累
2.必须有熟练掌握vim+tage或者emacs+etage的用法,本人推荐emacs
3.熟悉kdb,proc接口等调试内核的方法,printk是必不可少的,本人后来很少用调试工具,主要用printk,呵呵..
c.一些网上抄过来的笔记
1.内存屏障(memory barrier)
#define set_mb(var, value) do { var = value; mb(); } while (0)
#define mb() __asm__ __volatile__ ("" : : : "memory")
1)set_mb(),mb(),barrier()函数追踪到底,就是__asm__ __volatile__("":::"memory"),而这行代码就是内存屏障。
2)__asm__用于指示编译器在此插入汇编语句
3)__volatile__用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。即:原原本本按原来的样子处理这这里的汇编。
4) memory强制gcc编译器假设RAM所有内存单元均被汇编指令修改,这样cpu中的registers和cache中已缓存的内存单元中的数 据将作废。cpu将不得不在需要的时候重新读取内存中的数据。这就阻止了cpu又将registers,cache中的数据用于去优化指令,而避免去访问 内存。
5)"":::表示这是个空指令。barrier()不用在此插入一条串行化汇编指令。在后文将讨论什么叫串行化指令。
6)__asm__,__volatile__,memory在前面已经解释
d.PC/104和PC/104+
这两个电子和逻辑分布分别和ISA(PC/104)及PCI(PC/104+)一样,因此,软件不会注意到他们和统一桌面总线之间的不同;PC104PLUS 是专为PCI总线设计的,可以连接高速外接设备。
e.likely(x),unlikely(x)
likely意识到x的值为真的可能性更大一些
unlikely意识到x的值为假的可能性大一些
在linux中判断语句经常会看到likely和unlikely,例如:
if(likely(value)){
}
else{
}
简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) ==if(value)。
也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意识是value的值为真的可能性更大一些,那么执行if的机 会大,而unlikely表示value的值为假的可能性大一些,执行else机会大一些。加上这种修饰,编译成二进制代码时likely使得if后面的 执行语句紧跟着前面的程序,unlikely使得else后面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度.