免费注册 查看新帖 |

Chinaunix

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

学习Linux内核和驱动开发有终南捷径吗?欢迎来辩! [复制链接]

论坛徽章:
208
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32酉鸡
日期:2013-12-04 19:56:39
11 [报告]
发表于 2015-08-20 09:35 |只看该作者
其实和app没啥区别
重点两个
机制和实现
机制大概就是说的所谓模型,逻辑上来说,我们要完成的事物,如何表达成机器的流程
实现就是具体到某个类型某种硬件,该如何去读取控制它的状态和流程

抽象的思想比细节的实现更重要
现实中却往往卡在某个实现上

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:54:45
12 [报告]
发表于 2015-08-20 09:38 |只看该作者
迫于生计,没法静下心来研究Linux内核和驱动开发这么深入的东西 。。。。

求职 : Linux运维
论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:15:0815-16赛季CBA联赛之山东
日期:2016-10-31 10:40:10综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00IT运维版块每日发帖之星
日期:2016-02-08 06:20:00数据库技术版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-15 06:20:00IT运维版块每日发帖之星
日期:2016-01-10 06:20:00黄金圣斗士
日期:2015-11-24 10:45:10IT运维版块每日发帖之星
日期:2015-09-01 06:20:00IT运维版块每日发帖之星
日期:2015-08-13 06:20:00IT运维版块每日发帖之星
日期:2015-07-30 09:40:012015年亚洲杯之巴勒斯坦
日期:2015-05-05 10:19:03
13 [报告]
发表于 2015-08-20 10:31 |只看该作者
linux kernel 4.0之后的 hotpath很高级的样子。很想了解她的细节和具体实现技术。呵呵。以后LINUX系统是不是可以长生啦

论坛徽章:
0
14 [报告]
发表于 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语言风格。

解决办法?前人栽树,后人乘凉。这句话在软件行业并不那么适用。前人挖坑,后人扫雷或许更为贴切。
当我们在抱怨别人写得代码不够好的时候,是否有心把他的代码改改好呢?这才是进步的关键。

评分

参与人数 1信誉积分 +10 收起 理由
shenlanyouyu + 10 赞一个!

查看全部评分

论坛徽章:
0
15 [报告]
发表于 2015-08-21 15:09 |只看该作者
1. 分享Linux内核学习和驱动开发的经验。
LINUX内核刚开始用,作为工作中的人觉得还是带着项目目的来学习是最快的。以前一直想学LINUX,断断续续看了些书,就是没有入到门。后来工作需要了,弄了个开发板,3个月就把过去几年没有玩明白的东西全玩明白了。
无它,唯手熟已(当然,还算不上“熟”,只是比起以前的自己熟多了)。

2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
其实linux驱动真做起来了也不见得就是难,说它难是因为面对庞大的代码库,和N多的子系统架构和调用,你不知从何下手好。这点还是推荐跟着<设备驱动程序>从易到难深入,或者跟着伟东山的免费视频来玩(宋老师别敲我)。
最后,一定要动手写,动手操作。同样的代码,copy一遍和敲一遍理解程度绝对不是一个档次的。

其他几个我还不敢说些啥。lol

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
16 [报告]
发表于 2015-08-21 15:58 |只看该作者
回复 15# Vinge
赞同。驱动开发只是理论学习,很难掌握,理论联系实践才能快速掌握。

   

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
17 [报告]
发表于 2015-08-21 23:43 |只看该作者
回复 14# jimopt

的确Linux内核自有一套编码规范,不是驼峰编码规则。
习惯了驼峰编码规则,再来看Linux内核中的带下划线的函数命名是非常不习惯的。

   

论坛徽章:
19
处女座
日期:2014-07-18 14:50:5415-16赛季CBA联赛之北京
日期:2019-09-16 15:39:1415-16赛季CBA联赛之上海
日期:2019-09-15 15:29:0415-16赛季CBA联赛之山西
日期:2017-03-09 10:58:232017金鸡报晓
日期:2017-02-08 10:33:212017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之深圳
日期:2016-12-15 17:55:53C
日期:2016-10-25 16:00:1515-16赛季CBA联赛之新疆
日期:2016-07-21 14:02:0415-16赛季CBA联赛之江苏
日期:2016-06-30 12:15:04shanzhi
日期:2016-06-17 17:59:31平安夜徽章
日期:2015-12-26 00:06:30
18 [报告]
发表于 2015-08-21 23:48 |只看该作者
回复 9# openspace

Android中引入了HAL层,kernel层的driver完成的工作更简单了,很多业务逻辑封装到HAL来实现。
   

论坛徽章:
0
19 [报告]
发表于 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等结构复杂的。

论坛徽章:
0
20 [报告]
发表于 2015-08-26 14:57 |只看该作者
上一本:设备驱动开发详解第2版还没看完呢,问问宋老师是不是可以以旧换新?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP