(kernel)新手基础知识&基本方法记录

hefuhua 2008-04-13 12:58:35
加精
a.推荐内核学习书籍
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预读取,增加程序的执行速度,likely和unlikely的实现在


PS:欢迎大家共享自己的学习方法和经验,相互学习..该贴长期不定时更新
...全文
8016 139 打赏 收藏 转发到动态 举报
写回复
用AI写文章
139 条回复
切换为时间正序
请发表友善的回复…
发表回复
ll2323001 2012-03-11
  • 打赏
  • 举报
回复
学习下!!
woszsj 2012-02-12
  • 打赏
  • 举报
回复
楼主说的是英文原版吧,除了驱动那本,据说都是用google翻译的
frogoscar 2012-01-15
  • 打赏
  • 举报
回复
pdf版本我都有下到,呵呵~~~~~~~~~~~~~`
hkkhyh 2011-12-29
  • 打赏
  • 举报
回复
学习~~~~~~~~~~~~
rtc999 2011-11-24
  • 打赏
  • 举报
回复
很久不更新了
mainsea 2011-11-07
  • 打赏
  • 举报
回复
呵呵呵,学习啦
liyunbing84 2011-10-23
  • 打赏
  • 举报
回复
mark!
hellochick 2011-10-20
  • 打赏
  • 举报
回复
不错啊,智慧结晶啊,MAKR
alcz2008 2011-09-14
  • 打赏
  • 举报
回复
谢谢指路。。。。。。。。。。。。。。
pengwentao 2011-09-06
  • 打赏
  • 举报
回复
学习中……
jakec4524 2011-07-18
  • 打赏
  • 举报
回复
请教几个问题。

问题1:Linux 内核中 有这么一个宏#define __pa(x) ((unsigned long)(x)PAGE_OFFSET) 这是根据物理地址计算虚拟地址,也就是物理地址是虚拟地址-0xC0000000 这不是所有内核模块都可以这样算物理地址的吧?????
页目录表和页表存放的位子?哪些是不可换出的?

问题2:在X86系统中,支持段式内存,代码段切换时,会进行一些权限的比较(此处略去500字),我一直很困惑一个问题,如果有2个代码段,当前的CPL都是3(也就是用户态级别),通过call,或者jump指令(假设支持远程跳转)。如果2个代码段,分别属于不同的进程,这样的跳转能成功么?
lr2131 2011-03-05
  • 打赏
  • 举报
回复
每次都是看到这几个书名,的确是好书,但还是不太适合新手直接上来深入的去看,内核、驱动的书籍都站在很高的理论层次来讲的,让人看得似懂非懂。看了下深入Linux内核架构,感觉倒是不错的一本书,先不要讲的太细,需要的时候才去好好的深入那一块就好。
eroicaccssddnn 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 119 楼 vendself 的回复:]

这东西也只能泛泛地说下,毕竟书的慢慢啃,随手翻。书都看过,看工作中一旦用的少,也就忘了。
[/Quote]

深有同感!看得时候觉得掌握了,过段时间就忘的一干二净……
知和行 2010-11-25
  • 打赏
  • 举报
回复
深入理解Linux内核 这个好的书 怎么不推荐
ywp35361 2010-10-15
  • 打赏
  • 举报
回复
正在看 LKD,还结合源码在看,不过感觉现在看源码效果不佳啊,楼上的 XDJM 们有没有更好的学习方法推荐啊!!
guobing0816 2010-08-21
  • 打赏
  • 举报
回复
<Linux Device Drivers third edition>好书
k_c_u_f 2010-08-10
  • 打赏
  • 举报
回复
mark
daring_t 2010-08-08
  • 打赏
  • 举报
回复
好贴啊,占个记号!
蔷薇理想人生 2010-08-05
  • 打赏
  • 举报
回复
正在研究中!
nihao4545 2010-08-02
  • 打赏
  • 举报
回复
有时间看看
加载更多回复(118)

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧