免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

图书试读 《深入Linux设备驱动程序内核机制》(获奖名单已公布) [复制链接]

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
11 [报告]
发表于 2012-02-29 19:43 |只看该作者
早先看lz的帖子就觉得lz文笔很好,果然是写过书的人。佩服佩服
就谷哥的几个问题,我也给点自己的见解,LZ同学看看对不对
1.如何学习Linux kernel,一般需要具备哪些知识点
内核,就是一个操作系统的核心部分。当然对操作系统的要求是肯定需要一些的。不然连什么叫分时都不知道就比较说不过去了。一个系统需要有硬件,有软件。我觉得可以把内核看成整个硬件的驱动者。整个硬件的构造主要有CPU、内存、硬盘、IO设备等。为了讲硬件驱动的更好,让硬件跑的更快,这个驱动程序采用了复杂的算法。诸如调度算法和内存管理中的各种算法等等。对于这些算法来说,所需要的基础非常少,只要有扎实的C功底和基础的数据结构知识就足够了。很多人看内核都是从head.S开始看的吧?这里都是汇编代码,汇编就跟cpu关系比较密切。我觉得学内核有必要学习下CPU的知识(推荐读《量化研究方法》)。因为很多人初学内核总是对什么中断门、分段分页之类的感到很困惑。了解一下CPU架构就不会深究这些东西了,现在我学习的主要是risc的处理器。再回头看以前ulk里的那些,我觉得x86真的太复杂了,让学习内核的人陷入了误区。

2. 新人如何学习Linux设备驱动程序
初级一点的会用kmalloc差不多就足够了。就什么驱动基本框架的比较完善。简单一点的字符设备驱动,就把框架代码拷贝过来,自己写一些相关的read、write之类的方法。对于教科书里的字符设备驱动,自己动手实践一下就差不多了。有不会用的东西注意读内核Documetion里面文档。高级一些的如声卡、网卡之类的我觉得挺复杂的。这个就要多读代码,掌握好一门分析代码的工具比较重要(我觉得vim+cscope很好很强大)

3. 阅读完样章后,你认为此书与市场上其他Linux设备驱动类书籍有什么优缺
在驱动内核之类的书上,我看过挺多的。留下比较深印象的基本都是外国人写的。国人写的书要么几页全是代码(凑页数?)要么就是东抄西凑。但是刚才看了下此书样张。觉得这本书还是很不错的。从实际的问题中开始讨论,然后从原理上分析。和我们实际工作中的思路比较接近。LDD比较偏重理论,对实践上笔墨较少,精通linux驱动程序开发一书中也结合实践,但是我感觉不够详细。Linux驱动开发详解一书前面理论部分很好,后面有点不喜欢。

4. 给刚毕业的一些新手进入职场的一些建议(比如求职面试,到外企、国企与私企工作做技术的利弊等等)
介个。。我自己也是新手。都是打工者,老板让干什么就干什么。我个人觉得外企挺好的崇洋媚外了

论坛徽章:
0
12 [报告]
发表于 2012-02-29 19:55 |只看该作者
回复 1# 无风之谷

玩linux 不得不关注


   

论坛徽章:
4
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:192015年迎新春徽章
日期:2015-03-04 09:57:09
13 [报告]
发表于 2012-02-29 20:40 |只看该作者
不错的活动,支持。

论坛徽章:
0
14 [报告]
发表于 2012-02-29 20:57 |只看该作者
入门还是靠讲解linux0.11那本书,现在还在继续学习,主要在协议栈上面,买了本讲解协议栈的书,感觉里面贴代码太多了。  你这本书第一章来看,讲的比较细,分析的内核是3.x的?

论坛徽章:
0
15 [报告]
发表于 2012-02-29 21:08 |只看该作者
本帖最后由 MagicBoy2010 于 2012-04-03 16:00 编辑

今天晚上实在太困了,状态完全没有下午好,我这每晚都差不多12点多才睡。在11楼版主同学的基础上再随便说点,其实我当时学习内核纯粹是好奇,对这玩意好奇的东西真是太多了。的确,启动代码到整个引导过程,包括太多的汇编代码,跟CPU的关系太密切了。当时看x86的这些文档,再加上自己写,当时达到的程度是对x86底下一些常见寄存器的每个bit代表什么意思都能记住,好歹是下了很多功夫的。光写坏掉的软盘就不下几十张,还真不是吹牛,那时候经常处于亢奋状态。但是现在内核太大了,很多原本熟悉的东西也开始陌生起来,唯一的好处是现在看代码特别快,差不多能猜出来个大概,然后看代码去验证,如果每个模块每行代码再让我去看一篇,这玩意会出人命的,呵呵。所以现在的小朋友再从头去看内核,我是蛮同情的,估计首先gnu上的document就够看一段时间了,还有那些变态的嵌入式汇编语法。从这个角度,也不难看出为什么ULK这种overview的书这么受欢迎,这对想熟悉Linux内核的同学的确是个很好的入门捷径。

至于新人怎么去学驱动,我想大概也没有什么特别好的方法,技术这个东西,总归要靠自己慢慢去积累。整体框架搞熟悉了,内核实施搞熟悉了,然后就是硬件了,硬件这个东西其实就是看data sheet,我注意到CU的驱动版蛮多内容是讨论硬件的,这个似乎也是《精通Linux设备驱动程序》的特色。关于我自己的那本书,主要侧重在内核与驱动互动的环节上,还有一些常用的内核实施的幕后原理。这些是构建设备驱动程序的基础,搞熟悉了原理才好驾驭,比如最近遇到的dm-crypt这个东西,如果对块设备的背后机制不了解,是写不出来这种东西的。因为时间太紧,其实留了蛮多的遗憾在里面。我想再版时它会比现在看到的要好很多,现在有时间我常来CU的论坛来看看,一个主要方面是关注一下网友们在哪些方面会有疑问。

至于外企,我毕业后大部分时间都是待在这里面,期间经历的一些公司,有些给我印象特别深,其中在企业文化和人性化方面做得最好的,我觉得还是i公司,不过我离开那里差不多有5年多了,现在的情形怎样不太清楚。对这个老东家我印象中从来就没有过负面的评价,这个是实事求是地讲,他的企业文化的确做得很好,一封邮件出去,不管对方是不是管这个事情,你的邮件最终总会得到反馈,而有些公司,你的邮件出去后很可能就石沉大海了,而且intel不提倡在平常工作的邮件中采用bcc这种方式。。。虽然没有完美的公司,而且一些公司到国内后本土化现象比较厉害,但是外企的环境相对还是很宽松的。 哦,最后还有一个求职面试的事情,这个不想多讲了,我对面试这玩意没特别研究过,但是有一点我是清楚的,一个人最终能否拿到offer,其实有很大的偶然性,跟能力并没有必然的联系,一个很强的人完全有可能被拒掉。。。

论坛徽章:
0
16 [报告]
发表于 2012-02-29 21:32 |只看该作者
入门还是靠讲解linux0.11那本书,现在还在继续学习,主要在协议栈上面,买了本讲解协议栈的书,感觉里面贴代码太多了。  你这本书第一章来看,讲的比较细,分析的内核是3.x的?

=============================
3.x的,内核更新得太快了,Linux就这德性,我基本上不用Linux,写代码写文档都是在win7上,然后ssh到Linux上,X,这个X就是本人目前绝大部分时间与之打交道的地方,我觉得太烂了,X当初采用了server/client的架构,现在这种应用模型还有多少??

你说入门靠讲解0.11,我猜测那是因为那时候Linux太单纯了,我自己在2.4的基础上写进程切换,直接使用TSS来干的(这个更单纯,一条指令吧),但是Linux用mov指令把tss的活给干了。。。前阵子本版有位仁兄写分析内核的书,其中谈到进程切换,说是“异常复杂”,复杂吗?一点都不复杂,调度的难点是查找下一个被调度的进程。我的“异常复杂”的进程切换不超过10行:
  1. static inline void switch_to_next(TASK_STRUCT *next)
  2. {
  3.        
  4.        
  5.         //clear the BUSY bit in the TSS descriptor of next
  6.         gdt_table[next->tss.tss_selector >> 3].H4Bytes &= 0xfffffdff;
  7.        
  8.         g_tgtaddr.eip = 0;
  9.         g_tgtaddr.new_tss_sel = next->tss.tss_selector;
  10.        
  11.         //jmp to the next task TSS selector which will result in task switch
  12.         __asm__ __volatile__("ljmp *(%0)"::"r" (&g_tgtaddr));
  13.         //asm volatile("ljmp %0,$0x0"::"i" (sel));
  14.         //asm volatile("ljmp $112,$0x0");
  15. }
复制代码

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
17 [报告]
发表于 2012-02-29 21:40 |只看该作者
好吧,我用我的拙见来一番抛砖引玉吧^^.
以下算是我个人的学习经历吧,可能有些啰嗦繁琐,权当抛砖引玉,各位看官多多见谅与指教^^
1. 如何学习Linux kernel,一般需要具备哪些知识点
       学习linux kernel,我想应该从使用linux开始吧。最好是从命令行开始,而以此开始,估计你对linux的第一印象便是,
   繁多而难记的命令;然而渐渐的你会发现,这繁多而难记的命令其实体现着的是linux对你的关怀与信任,它对你提供了
   极为原子的操作,而通过管道、重定向等机制,又给了你展示想象力、满足各种各样需求的平台。当然,此外,你还会慢慢
   认识到在linux里"一切皆文件"的观念、文件的权限管理,超级用户和使用者的概念等等....
       好了,接下来进入C编程时代,在这里你将领略linux kernel 为用户提供的简洁而实用的系统调用接口,你将学会文件编程,
   多线程编程,多进程编程,网络编程;此外,你还将学会gnu tool的使用,包括牛x的gcc,gdb;还有make工具,makefile的编写
   等等....
       最后呢,你该和CPU等硬件打打交道了,毕竟kernel是这些东东的灵魂^^。而在这里,你将理解原来CPU认识的只有'0'和'1',
   原来你认识的main()函数到最后只是一堆'0'和'1',而这个过程中你的.c文件经历了编译、汇编、链接、加载运行的层层磨练才
   最后修成正果的;你还将明白CPU能做的事只是:根据PC指针的值从内存取值->译码->执行,而这过程,CPU需要几个搬运工(cache和        
   register)的帮忙。此外你还将明白,原来物理内存总是那么的稀缺,原来你的那么多进程可以彼此独立互不干扰,你的操作系统不
   会被用户程序所破坏,全都依仗了MMU这个保护神,等等等等....
       当你凭着你的兴趣与毅力,经过了上面的层层洗礼后,你将开始步入linux kernel的世界;而设备驱动程序将是进入kernel世界的
   一扇宽广的门。在kernel的世界里,你将继续凭着你的兴趣与毅力,继续探索这个美妙的世界......

2. 新人如何学习Linux设备驱动程序
   对于linux设备驱动的学习,我想这里应该包括几个方面的东西。
      第一:熟悉linux kernel为驱动程序的编写提供的种种机制,这包括内核线程的使用、内核内存的使用、内核同步机制、内核定时器、
           内核的延时阻塞机制等等......
      第二:熟悉linux 设备驱动模型,这包括模块构建、安装;字符设备、块设备、网络设备;usb 、pci、i2c等各种总线模型;等等....
      第三:熟悉硬件设备裸驱动, 毕竟你的驱动程序最终目的是要让设备如你所愿的工作,所以你必须能够从设备芯片的datasheet获取足够的
           信息去让设备动起来。
        
   而对于这三个方面的学习,其学习方法,怎么说都是:读书->实验->再读书->再实验......
       读什么书呢,《linux设备驱动程序(第三版)》 《linux内核设计与实现》这都是不可否认的经典之作,至于实验,最好是手上能有一块  
   开发板,随时随地的验证你对于一些概念的理解。   


3. 阅读完样章后,你认为此书与市场上其他Linux设备驱动类书籍有什么优缺
   MagicBoy2010的《深入Linux设备驱动程序内核机制》,读了样章后,我觉得书如其名(书名的名,呵呵)吧,讲的可能更趋向于内核模块机制
实现原理,这本书对于初学者来讲的话读起来应该是有些吃力的,但对于设备程序开发者来讲的话,我想如果真能理解里面提到的概念的话,那
应该能属于稀缺的驱动开发者的行列^^。我个人觉得这不是只是通过代码堆砌充当页数的书,而是一本挺用心的书。

4. 给刚毕业的一些新手进入职场的一些建议(比如求职面试,到外企、国企与私企工作做技术的利弊等等)
   对于职场,其实我也是新人;因此我有个问题想请教一下各位前辈,摒弃掉个兴趣因素不说的话,对于一个linux驱动开发者来讲的话,
   什么样的职业规划能更加的符合嵌入式行业的发展呢(这里似乎涉及到了嵌入式行业未来的发展问题,呵呵)?

论坛徽章:
0
18 [报告]
发表于 2012-02-29 21:58 |只看该作者
快10点了,今晚一定要早睡。楼上又来了个长篇大论,今天估计没时间仔细看了,明天白天也不知道能否找个安静点的地方。。。

论坛徽章:
0
19 [报告]
发表于 2012-03-01 00:49 |只看该作者
本帖最后由 ww2000e 于 2012-03-01 00:51 编辑

我是用bochs捣鼓的,不用担心软盘坏了  ,正在一点一点抄0.11的代码,安自己思路重写,感觉有点傻 。  另外还装了2.4.0 的内核。。。 你在2.4上改进的调度算法能分享不?   x86机制看了老是忘,没你以前学的疯狂阿还得加把劲。。。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2012-03-01 10:05 |只看该作者
回复 2# MagicBoy2010


    冒泡觉得 风兄 更文雅一典。。恩。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP