流氓无产者
发表于 2015-08-20 09:35
其实和app没啥区别
重点两个
机制和实现
机制大概就是说的所谓模型,逻辑上来说,我们要完成的事物,如何表达成机器的流程
实现就是具体到某个类型某种硬件,该如何去读取控制它的状态和流程
抽象的思想比细节的实现更重要
现实中却往往卡在某个实现上
zymh_zy
发表于 2015-08-20 09:38
迫于生计,没法静下心来研究Linux内核和驱动开发这么深入的东西 。。。。
niao5929
发表于 2015-08-20 10:31
linux kernel 4.0之后的 hotpath很高级的样子。很想了解她的细节和具体实现技术。呵呵。以后LINUX系统是不是可以长生啦
jimopt
发表于 2015-08-21 10:50
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
个人的经历是:
07年小本毕业,读研期间基本都在用MATLAB和VC写一些小程序。毕业后当了5年的码农,看过不少代码,也写过不少代码。一直做的嵌入式开发,但是可能待大型企业的缘故,直到现在这第三份工作才有机会接触到linux驱动或者说linux内核的部分。然后时隔多年又开始频繁浏览这个论坛。
现在让我最痛苦的是什么呢?驱动代码的风格!奇怪吗?
我是一个clean code的拥趸,当我看到驱动代码中那一堆堆的简写,一条条的下划线,好几屏才能翻完的超大函数,随处可见成套出现的宏定义等等时,我的心简直是奔溃的~~~
这些年下来纯码农技术而言,一直修炼的方向是如何“把代码写得可以像优美的文章一样精巧”。我不会允许自己的函数超过200行(拆分一下函数OK?),不会允许一个函数有超过10的复杂度(拆分一下函数OK?),不会允许一个编译宏在函数内反复出现(拆分一下函数OK?重要的事情说3遍)不会允许代码到处都是struct,几乎不会允许写注释。linux内核代码颠覆了这一切。
随便举几个例子:
if (a && b || c && d)何苦让看的人再去理解一遍这个复杂的判断, if(ThisIsMyWantedCondition) + inline bool ThisIsMyWantedCondition()的组合才是我期望看到的代码。
struct net_device一遍遍出现在代码中,就不能typedef一下,去掉那个struct让代码看起来简略一点吗?
nlmsghdr是啥?写成netlinkMessageHeader并不会让你的程序变大变慢哪怕一点点,却会让看了人担惊受怕,这是什么鬼?
好看的代码绝对不会影响代码的效率,却绝对赢促进开发的效率。尤其是你在一个团队中工作的时候。大家花多长时间去理解前人写的代码?在一声“哦~~原来是这个意思啊”之后大家看完之后有顺手把它改成你终于理解出来的“文章”吗?
linux的历史太长,内核的代码改动得太多,但是代码风格居然看不到一丝演进的迹象。芯片商提供的驱动源码居然还是要求把变量声明写在遥远的北方的原始C语言风格。
解决办法?前人栽树,后人乘凉。这句话在软件行业并不那么适用。前人挖坑,后人扫雷或许更为贴切。
当我们在抱怨别人写得代码不够好的时候,是否有心把他的代码改改好呢?这才是进步的关键。
Vinge
发表于 2015-08-21 15:09
1. 分享Linux内核学习和驱动开发的经验。
LINUX内核刚开始用,作为工作中的人觉得还是带着项目目的来学习是最快的。以前一直想学LINUX,断断续续看了些书,就是没有入到门。后来工作需要了,弄了个开发板,3个月就把过去几年没有玩明白的东西全玩明白了。
无它,唯手熟已(当然,还算不上“熟”,只是比起以前的自己熟多了)。
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
其实linux驱动真做起来了也不见得就是难,说它难是因为面对庞大的代码库,和N多的子系统架构和调用,你不知从何下手好。这点还是推荐跟着<设备驱动程序>从易到难深入,或者跟着伟东山的免费视频来玩(宋老师别敲我;P)。
最后,一定要动手写,动手操作。同样的代码,copy一遍和敲一遍理解程度绝对不是一个档次的。
其他几个我还不敢说些啥。:lol:lol
shenlanyouyu
发表于 2015-08-21 15:58
回复 15# Vinge
赞同。驱动开发只是理论学习,很难掌握,理论联系实践才能快速掌握。
shenlanyouyu
发表于 2015-08-21 23:43
回复 14# jimopt
的确Linux内核自有一套编码规范,不是驼峰编码规则。
习惯了驼峰编码规则,再来看Linux内核中的带下划线的函数命名是非常不习惯的。
shenlanyouyu
发表于 2015-08-21 23:48
回复 9# openspace
Android中引入了HAL层,kernel层的driver完成的工作更简单了,很多业务逻辑封装到HAL来实现。
sithui
发表于 2015-08-24 00:21
1. 分享Linux内核学习和驱动开发的经验。
学校内核更多的是要去理解整个Linux的框架,所以一定要从宏观切入,从顶向下,从大到小,从巨到细。
驱动只是linux内核的一部分,只有明白了基本的概念之后才能理解驱动中用到的技术和api的意义。
刚开始不可能所有的都弄的很懂很细,有些东西可以暂时跳过, 一定要先从整体上把握Linux内核的结构,然后理解一些基本概念,再去看驱动。
一般驱动是面向具体功能的,比如一个芯片的驱动,如触摸屏驱动,它向下连接的是不同的触屏芯片,向上连接的是linux的input系统。它的功能就是把输入的物理信号转换成input系统能识别的输入信号。然后再去看为了实现这些功能,驱动是如何与芯片互动的,又是如何遵循字符设备驱动框架的,等等。再慢慢去看一些复杂的驱动框架如USB, ALSA, V4L2等。
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
Linux驱动开发其实是比较好入门的,看看ldd这一系列的书基本上写个字符驱动没有什么问题,难点在于把知识融汇起来去解决实际问题以及在复杂的驱动架构中去解决问题。这两个问题需要开发者对于linux框架和基本接口很熟悉,同时思考问题有大局观,同时也能考虑到细节实现上。
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
推荐驱动子系统的学习步骤是从最简单的入手,如ldd中的虚拟驱动,再到简单的字符设备驱动如ts驱动、再到一些总线驱动如I2C的EEPROM等,再到USB、ALSA、V4L2等结构复杂的。
fezh
发表于 2015-08-26 14:57
上一本:设备驱动开发详解第2版还没看完呢,问问宋老师是不是可以以旧换新?:lol