学linux驱动编译进内核是不是一定要 先把内核搞懂了才行

出版社:机械工业出版社
出版日期:2015年3月
价:99.80元
免责声明:图书版权归出版社和作者所有, 仅提供试读
本书详细信息
第1章 引言
第2章 TI 应用处理器芯片及其内核特点
第3章 Linux 内核框架探究
随便说两句
可以匿名发言哦!
(点击进行更换)
作译者简介
本作者其他图书
相关技术专题
           
51CTO旗下网站Linux内核的学习方法_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Linux内核的学习方法
来源:Linux社区&
作者:qb_2008
经过之前的摸索,对Linux内核的学习有一些自己的看法,就列一下自己支持的学习方法:
1、要选最新的内核去学。Linux内核版本变化太快了。Linux 0.11就是一个自己动手写操作系统的范例,而到Linux 2.4则发展到百万行级,被移植到各种平台。到2.6呢,Linux在这个版本停留最久,小的版本差异,整个子系统完全不同。就我所知,在2.6中,devfs被废弃,sysfs新加入,usb支持到3.0,整个内核支持内核态抢占,等等。即使你学会了2.4,那也是一个和2.6相差很大的系统。何况内核的变化,也反映了硬件平台的巨大变化。有SMP多核、APIC、ACPI电源管理、PCI、PCI Express总线、PCH芯片组,缓存一致性、大内存支持等等,这中间的变化太大了。而且,Linux经历2.6的风风雨雨,各个子系统都逐渐成熟,模块结构更加合理,你会看到最优秀的系统设计,尽管也是最庞大的。综上所述,要学就要选最新的,但这也并非一定要选3.0,选2.6中版本靠前的即可,推荐2.6.32以上的。
2、从设备驱动入手。Linux内核就像一个大铁球,往往找不到地方下嘴。Linux内核中动辄几万行的子系统,内存管理、线程管理、定时器、信号量临界区,等等内容耦合在一起,各种gcc的特殊用法,为了性能而极其复杂的代码,被滥用的宏定义,为支持多种硬件平台而抽象到极致的层层封装...... 最为一个学习用的内核,Linux真是糟透了。幸好它还给我们留了一丝光亮,就是设备驱动。最简单的字符设备驱动可以只有几百行代码,绝对看得懂,而较为复杂的usb驱动则达到31万行代码,更不要提被过分优化的块设备驱动了。设备驱动足以为我们提供一个入口点,写一个模块,让它在内核中跑起来。但要记住,这只是起点。
3、进阶-从看代码说起。如果你只会照葫芦画瓢地写一些幼稚的字符设备驱动,你一定不敢对人说你对Linux内核如何如何。学习一个东西,最基本的要求就是能看懂它。遗憾的是,系统往往用起来简单,学起来难;内核API容易调,但却渗入不到核心的地方去。这是就必须找一条进阶之路—那就是能看到、接触、学习Linux代码。这个代码量不能太大,但也不能太小,与其它模块耦合度尽量低,最好能动手试一试。我觉得usb驱动是个不错的选择。虽然如此,看设备驱动都有一个不可避免的问题,就是对设备的认识程度直接决定你对相应代码的理解程度。usb不是核心设备,规范也比较清晰,但它的工作方式过于复杂,驱动的层次划分至少三层,很有挑战性。
4、进阶-从写代码说起。虽然看Linux代码是个很有挑战性、很锻炼思维的事情,但它却无助于你写代码能力的提高。往往你看懂八成,理解五成,融会贯通三成,能用出来的也只剩一成。但就这一成,也要往死里用才行。我发现只写简单的驱动,无济于事;看比较复杂的驱动,好像看得挺热闹,却掺和不进去。所以学Linux绝非只看看就能了事。要写代码,要修改代码。要学习的就不只是驱动本身,而是整个Linux内核提供的编程环境。包括内存管理、线程管理、定时器 、临界区、信号量、工作队列等等,许多东西来支持设备驱动。你不学这些东西,就改不了驱动,写代码也就无从谈起。其实这些东西本身并不复杂,只是比较零散,你看驱动时很容易看懂,却不注意,到时也用不出来。只要拿些例子练练,从驱动中看到的多拿出来用,慢慢就积累起来了。
5、目标。操作系统的根本目的是管理硬件资源和提供用户服务。我想,当我们能把目光专注于硬件,不再为写驱动而写驱动时,就真的是学有所得了。而对Linux内核有所创新,对内核算法有所改进,那还不是我所能眺望到的。
相关资讯 & & &
& (02月26日)
& (11/26/:17)
& (05月24日)
& (12/09/:01)
& (11/07/:47)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款怎么才能看懂linux内核???需要学哪些东西???_linux吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:168,396贴子:
怎么才能看懂linux内核???需要学哪些东西???收藏
怎么才能看懂linux内核???需要学哪些东西???
达内linux培训,将网络工程与Linux系统运维结合,培养高端Linux运维人才;linux培训优势多:rhca讲师多;红帽认证费用低;linux课时长;送补考机会
某汇编c语言操作系统数据结构ldd等
看懂,太难了,看看驱动,网络 某一块差不多
去楼上吧。。 果断可行。。
今天去图书馆看了本linux内核详解什么的,十多年的书了,2.0.2内核的好像,随手翻翻,直接看不懂
今天去图书馆看了本linux内核详解什么的,十多年的书了,2.0.2内核的好像,随手翻翻,直接看不懂代码,不过用中文描述的思想挺简单明了的
先make menuconfig,看看有哪些选项,每个模块干什么的吧。
就告诉你三本书好了:《现代操作系统》《c程序设计语言-丹尼斯里奇版》《数据结构&算法分析——C语言描述》这三本得先啃下来才行;否则,想看内核?算了吧。(上面3本是基本的;像《Unix网络搞基编程》之类的话,要是没把上面3本啃完,那100%是没办法看进去的... ...)
刚开始别着急买类似于《Linux内核分析》这种书,菜鸟看不懂的,这种书是给老鸟看的。
这个你看懂有什么用?除非你有兴趣去开发内核,那先学语言,然后各种架构。。
尚观linux培训,120天入门到精通,年薪10W入职,签订《就业协议》,法律有效,企业项目实战授课.毕业直接增长2年工作经验,2017linux培训&十佳机构&
推荐《Understanding Unix/Linux programming》中文名《Unix编程实战》,学习linux编程的最好书籍之一。
怎么看的?
楼主还在着么,,,,我也有点这方面向往,但是现在只会点x86汇编和C语言也只是会得不多,我还需要努力呀,,,楼主二年过去了,进步了多少呢?有啥经验吗?
首先你得精通c语言
一晃两年多过去了。当时年少太轻狂,后来学习的多了,才发现自己并不是要读懂内核,只是为了寻找一个发展方向。
大学真是一个问路的地方啊
这个贴是我挖的
这得先把c学好
研一了才来走楼主大三的路,心累。
这个说起来就大了,内核负责控制软硬件,真要看懂的话,估计好久建议楼主挑点自己感兴趣的来看PS:再细分一下嘛1、软件管理2、硬件管理3、内存管理4、文件系统管理差不多就这么多,后面两个我认为软硬件知识都又涉及,所以就这么区分了
唉,学了1年多把C和汇编学的快一半了,几个月没学,忘了不少,还没兴趣继续下去,因为老是失败失败失败。然后就颓废了
要学习就趁早,
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或当前位置:&&技术问答>
关于学习驱动程序的的疑问
&&&&来源:&互联网& 发布时间:
&&&&本文导语:&
CSDN的各位高手。
我想做驱动开发。但是,我发现,学习驱动开发真的是不是一般的难,最近几天,在网上下载了一本《linux设备驱动程序》电子版的在看,看到了字符驱动程序那一块。据说这本书是非常经典的,但...
CSDN的各位高手。
我想做驱动开发。但是,我发现,学习驱动开发真的是不是一般的难,最近几天,在网上下载了一本《linux设备驱动程序》电子版的在看,看到了字符驱动程序那一块。据说这本书是非常经典的,但是,通篇的都是在讲函数和理论,我究竟要怎么学?虽然,我知道,学习程序,就是要实际的去写程序,但是对于像我这种刚刚开始学习的来说,我怎么办?一是没有项目,二是找不到有哪些题目具体的是适合我的,我又怎么去实际操作? 难道要等我把《linux设备驱动程序》全部看完了再去实际的写点程序?困惑中。希望各位高手帮我分析分析,究竟要怎么做。我感激不尽。谢谢
/driver/745132.html
这东西,不好说。
个人觉得,《linux设备驱动程序》要不要看呢? 还是要看,但是不能盲目的看。
你可以看看这本书基本结构就知道了,是一步一步的来的,从字符,到块,然后到网络。
你可以每学习到一种驱动之后,然后相当于总结,就是去写一个实际的驱动。至于什么驱动
你可以Google,找一些基础性的东西。
不过我觉得女生做驱动,够呛。
没有一定的理论积累是不行的,可谓牵一发而动全身,查看任何一个Linux源代码,往往一小段就包含了很多的知识点,基础部扎实,别指望能看懂,也让我至今望而却步
lz不要光靠论坛和电子书,论坛靠不住,电子书找不到最新的更多的书
我是只要看得过去的Linux内核驱动的书必买,也就是500左右的事
要说简单、入门还有项目
当属《linux设备驱动开发技术及应用》(韩)
几个LED加几个回形针就能利用PC的并口做实验了,不需要板子,也不需要什么硬件知识
楼主说了 做技术 不分男女
嵌入式 驱动开发等等 给我的感觉挺难的
CSDN这方面的专家好像不常来
我我上CSDN的这段时间 楼上的feiyinzilgd和deep_pro对这方面很内行
你还是多上google去搜搜 百家齐鸣 找适合你自己的
您可能感兴趣的文章:
本站()旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。本站()站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
相关文章推荐
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,E-mail:www_169it_(请将#改为@)新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
小富即安, 积分 2452, 距离下一级还需 2548 积分
论坛徽章:16
获奖名单已公布:
& && &这是一个连阅读都被碎片化的时代,在这样一个时代,人们趋向于激进、浮躁。内心的不安宁使我们极难静下心来研究什么。许许多多的Linux工程师,他们的简历书写着“精通”Linux内核,有多年的工作经验,而他们的“精通”却只是把某个寄存器从0改成1,从1改成0的不断重复;许许多多的Linux工程师终日埋头苦干,敲打着自己的机器和电路板,却从未冷静下来思考,并不断重构和升华自己的知识体系。
& && &Linux内核的版本更新达上千个,代码规模不断增长,平均每个版本的新增代码有4万行左右。在源代码的10个主要子目录中,驱动程序的代码量呈线性增长趋势。Linux各个子系统之间的关系错综复杂,系统整体规模和复杂性分别呈超线性和接近线性增长趋势,drivers和arch等模块的快速变化是引起系统复杂性增加的主因。设备驱动程序是连接计算机软件和硬件的纽带和桥梁,开发者在嵌入式操作系统的开发移植过程中,有将近70%~80%的精力都用在了驱动程序的开发与调试方面。这就对设备驱动程序开发人员提出了极高的要求。开发者不仅要同时具备软件和硬件的知识和经验,而且还要不断地学习、更新自己,以便跟上嵌入式系统日新月异的发展。在代码量最多的驱动程序中,有什么规律可循?最根本的又是什么?学习Linux内核和驱动开发有捷径吗?欢迎大家参与讨论,分享Linux内核和驱动开发的经验。
从以下话题中任选一个或多个话题参与讨论,这次讨论的话题内容不限于下面罗列的话题。
1. 分享Linux内核学习和驱动开发的经验。
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
4. 您深入研究过Linux设备驱动模型,关注过Linux内核驱动的设计思想吗?
5. Android系统是基于Linux内核的,传统的Linux驱动开发和Android驱动开发有什么区别?
活动结束后将选取4名讨论精彩的童鞋,每人赠送一本《Linux设备驱动开发详解:基于最新的Linux 4.0内核》图书作为奖励。
作者: 宋宝华& &
丛书名: 电子与嵌入式系统设计丛书
出版社:机械工业出版社
出版日期:2015 年8月
开本:16开
内容简介:
& &&&历时8年,三次重构,内窖愈加炉火纯青。全部代码更新至全新的Linux4.0版本。全面讲解ARM Linux新版本内核架构,如设备树等。不仅仅注重知识和程序的讲解,更注重程序的思想、演变、架构和算法。
& && &本书首先介绍Linux设备驱动的基础。第1章简要地介绍了设备驱动,并从无操作系统的设备驱动引出了Linux操作系统下的设备驱动,介绍了本书所基于的开发环境。第2章系统地讲解了Linux驱动工程师应该掌握的硬件知识,为工程师打下Linux驱动编程的硬件基础,详细介绍了各种类型的CPU、存储器和常见的外设,并阐述了硬件时序分析方法和数据手册阅读方法。第3章将Linux设备驱动放在Linux 2.6内核背景中进行讲解,说明Linux内核的编程方法。由于驱动编程也在内核编程的范畴,因此,这一章实质是为编写Linux设备驱动打下软件基础。
& && &其次,讲解Linux设备驱动编程的基础理论、字符设备驱动及设备驱动设计中涉及的并发控制、同步等问题。第4、5章分别讲解Linux内核模块和Linux设备文件系统;第6~9章以虚拟设备globalmem和globalfifo为主线,逐步给其添加高级控制功能;第10、11章分别阐述Linux驱动编程中所涉及的中断和定时器、内核和I/O操作处理方法。
& && &接着,剖析复杂设备驱动的体系结构以及块设备、网络设备驱动。该篇讲解了设备与驱动的分离、主机控制器驱动与外设驱动的分离,并以大量实例(如input、tty、LCD、platform、I2C、SPI、USB等)来佐证。其中第12章和第17章遥相呼应,力图全面地展示驱动的架构。Linux有100多个驱动子系统,逐个讲解和学习都是不现实的,授人以鱼不如授人以渔,因此我们将更多的焦点放在了架构讲解方面,以便读者可以举一反三。
样章试读:
(1.46 MB, 下载次数: 154)
15:20 上传
点击文件名下载附件
(114.01 KB, 下载次数: 65)
15:21 上传
点击文件名下载附件
(33.22 KB, 下载次数: 102)
11:08 上传
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
论坛徽章:3
富足长乐, 积分 7782, 距离下一级还需 218 积分
论坛徽章:19
先支持意向,等想好了再写讨论内容,不过我个人理解LINUX内核很像进化中的生命体,同时它的模块化理念非常高级,每一个层次都在不断的进化和完善,同时不会影响全局的使用。
小富即安, 积分 2149, 距离下一级还需 2851 积分
论坛徽章:15
没深入搞过,乱谈一番:
1. 分享Linux内核学习和驱动开发的经验。
& & 驱动开发其实有一定的模式,主要是要了解硬件的特性以及如何对接到驱动的函数中,还有就是要适应内核编程的环境以及调试的方法
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
& & 难点就是后面的调试
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
& & 每一个子系统都巨大无比,没那个能力去完全搞明白&&
4. 您深入研究过Linux设备驱动模型,关注过Linux内核驱动的设计思想吗?
& & 个人理解设计思想就是回调函数,给一个API让你注册,后面通过注册ID找到对应的回调函数进行处理
5. Android系统是基于Linux内核的,传统的Linux驱动开发和Android驱动开发有什么区别?
& & Android的驱动就是要对C语言再进行一层包装,采用类似JNI/JNA机制向Android上层提供Java的API,这样厂商可以决定驱动的主要部分在C还是Java实现
富足长乐, 积分 7782, 距离下一级还需 218 积分
论坛徽章:19
本帖最后由 niao5929 于
20:45 编辑
1. 分享Linux内核学习和驱动开发的经验。
& & 读代码,编译内核的初级级别,自己没社么经验
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
& & 难点就是建模和对底层硬件的深入了解
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
& & linux 模块化的设计最让人感到方便,这样的设计可以非常方便的进行模块的替换和组装,这也是LINUX非常有应用广度的一个方面。
4. 您深入研究过Linux设备驱动模型,关注过Linux内核驱动的设计思想吗?
& &感觉LINUX因为自由和开源的关系,她的进化非常类似与生命的特点。自由开源软件可以承载更多新思想和新技术。Linux内核自4.1开始支持不停机的热升级。这必然涉及到驱动的动态更新问题。这些新特性总是让好奇的我想看个究竟。
5. Android系统是基于Linux内核的,传统的Linux驱动开发和Android驱动开发有什么区别?
& & Android总感觉似乎需要用到很多JAVA的技术,而目前JAVA确实已经被ORACLE搞得非常的让人担忧。我觉得程序员或者编程爱好者都应该学习更自由和开放的GO、PYTHON、D等等这些纯的自由开源软件,还是那句话:自由开源软件可以承载更多新思想和新技术。
白手起家, 积分 13, 距离下一级还需 187 积分
论坛徽章:0
cool,mark,
不过还是不想做驱动,还是搞搞网络编程吧。
白手起家, 积分 0, 距离下一级还需 200 积分
论坛徽章:0
本帖最后由 kartorz 于
09:44 编辑
1. 分享Linux内核学习和驱动开发的经验。
捷径没有,但是有合理的方法。
1)&&首先,需要熟悉操作系统的设计与实现,推荐大家看 MINIX作者的那部书,同时把MINIX的kernel代码研读一下。 不然,你不知道操作系统都有哪些模块, 不知道操作系统要做些什么事情,提供什么功能。
& && &简单地说,操作系统首先要驱动 CPU,然后提供那几大管理(中断,进程,内存),实现一,两百个系统呼叫,提供驱动接口。
2)&&去intel的官网,找一下 Intel® 64 and IA-32 Architectures Software Developer’s Manual , 了解一下 CPU的架构,工作模式,底层的编码。否则, 你不知道 gdt, ldt,&&page table, 实地址,保护模式,timer等中断都是什么东西,为什么操作系统要这样来设置寄存器。
& && &这块基本上全是汇编语言,对CPU的初始化,寄存器设置,手册上面都有严格的时序要求。 哪些操作需要屏蔽中断,哪些需要在一个指令周期完成等等。
有了上面的基础后,大概知道一个操作系统大概要做些什么事情, 如何驱动底层的 CPU,这个时候阅读 linux的kernel代码,事半功倍。
kernel 分为两个模块:一个是 core : 驱动cpu, 中断,进程,内存几大管理, 提供系统呼叫;& &另一个是driver,&&驱动设备工作。 linux的driver 都是有架构的,不需要从底层做起。 driver的架构大概就是 char, block, net, video, audio, usb, 等等。 别看操作系统的代码量大,其实,把driver 占了估计 90%的代码量, 这些都是不需要去看的。&&driver 框架的设计,也就是 微内核 与 宏内核的区别。
阅读过程中,观其大略即可,主要了解整个结构,以及程序的流程。 如: 系统呼叫的调用, 追一个就可以了。—— 看看,操作系统如何捕捉软中断, 根据中断号,dispatch到相应的服务程序,如何 保存现场, 完成后,又回到用户态。 系统呼叫调用,核心 就是 dispatch的流程。 追完一支系统呼叫,其它的大概就知道怎么回事了。&&driver 也就一样的, 找个简单的驱动看看, 从驱动层一直到驱动的架构,流程清楚就可以了。 如 char 设备驱动, 追一下 register 以后, 驱动框架如何 把该设备放入 list,当有用户请求的时候,它又如何 查找到 相应的设备,调用 相应的操作函数。 一路下来,流程大概知道就可以了。
不建议阅读, 毛德操的 linux内核源码分析 之类的书, 会让读者一头雾水。 正确的方法应该是, 先了解相应的背景知识后,再来阅读源码。 举个例子,你想了解 ext4的文件系统驱动代码,首先你得去查资料,搞清楚 ext4文件系统是怎么回事,再来阅读代码。 之前,推荐初学者 先 阅读 操作系统设计实现, intel的编程手册,就是这个道理。 只有了解了背景,再阅读源码时,一切都 迎刃而解了。 不推荐 毛德操的书也是个道理,书里面告诉你,代码一会跳到这里,一会又call back到注册的函数,一会又调用了什么,只见树木,而不见森林。
信誉积分 +10
小富即安, 积分 2452, 距离下一级还需 2548 积分
论坛徽章:16
& & 分享有干货,感谢分享。
小富即安, 积分 4828, 距离下一级还需 172 积分
论坛徽章:1
shenlanyouyu
临时想起一些说一下吧:
1. 分享Linux内核学习和驱动开发的经验。
Linux 内核功能越来越完善,如果没有充裕的时间,深入内核并不是很现实。所以建议先读一本内核的书,
第一遍是读,会读的很迷糊;之后反省一下,然后再浏览一下;可以想象一个 OS 是如何运行的,这样可以不
陷入 Linux 内核的细节;最后可以深入自己感兴趣或者需要的那一子系统
& & & & 推荐 《Linux Kernel Development》
即便是子系统,也是很庞大的。一个省力的方式是网上搜一些相关的文章,便于快速了解这个子系统的运作;
然后结合代码,形成自己的认知,最后做一下总结。如果仅仅是快速了解某一子系统的运作,可以参考一些早期
代码的注解书籍,再深入的时候看看最新的代码实现
对内核的认知是一个反复的过程,一开始并不完善,可能需要反复纠正。不要陷入这种纠错中;而是以后继续
使用和学习过程中,发现了没有弄清楚的地方再深入,毕竟 Linux 内核是不断变化的
还有一个很好的方式是,从系统调用入手,现在这方面的数据不少,而且对系统调用的语义都有讲解,这样可以
间接了解 Linux 系统的一些概念。对系统调用熟悉了,可以根据系统调用的执行过程,来大体了解内核的一个
运作过程;但是跟踪系统调用的时候要注意抓主线,现在内核系统很复杂,一些 code path 上可能会涉及多个
子系统,可以从名字上猜测它们是干什么的,不需要深入,否则会发现精力完全被分散掉了
学习 Linux 内核,一个很重要的是抽象的能力,所谓的抽象这里仅仅是指分清接口和接口的实现。因为 Linux
内核子系统很多,有很多子系统相互渗透,这样 code path 看上去很复杂。阅读代码的时候,为了排除干扰,
需要分清哪些是自己需要看的,哪些是其它子系统的接口,对于其它子系统的接口,先当作它们功能完善不会
出问题好了,这样可以关注重点;打个比方,一个应用程序的代码可能量很大,比如一个 apache 项目,它
包含很多组件,有时候阅读代码的时候会看到不同组件的 API,深入看相关组件实现并不现实,这时候分清主次
对于代码的阅读就很有帮助了,总不能看到了 malloc 就要先把它的实现弄清楚吧,系统调用多者呢
& & & & OReilly.Linux.System.Programming.2nd.Edition
& & & & The.Linux.Programming.Interface
一直围绕服务器做,接触的比较多的是网卡驱动。最开始想着从上到下,好好学习协议栈,后来发现内容太多,
进展太慢。后来参考一些驱动开发方面的书籍,把驱动独立开,使用内核提供的接口,就类似写应用的时候很多
情况下只需要了解系统接口和库函数的原型描述而不需要继续深入一样。这样把自己从内核复杂的实现细节中解
放出来,可以重点看网卡的特性部分;之后可以再深入了解设备的运作过程,比如网卡的收发包在协议栈中的
位置和运作
个人感觉如果工作中能接触驱动开发最好,否则很多情况下,有的设备并不常见,比如 Infiniband 卡
现在民用设备越来越广泛,可以选择自己感兴趣而手头又容易有的设备进行研究,比如无线网卡、wifi 等
驱动开发,一定要先专注一个设备,从头到尾熟悉一遍,然后总结驱动开发是怎样的、驱动是如何关联到系统中
的、Linux 采用什么样的分层模式来提供对多种多样设备的支持,如类似 VFS 一样的抽象分层
& & & & linux device driver, 3rd edition
& & & & Linux设备驱动开发详解
2. 您觉得Linux驱动开发的难点是什么,有什么好的方法来克服?
Linux 内核对各种设备的驱动开发提供了完善的框架支持,对应某个驱动,把对外的接口弄清楚就可以了。打个
比方,一个设备可能在不同的 OS 上需要支持,比如 FreeBSD/Windows 等,每个 OS 都有自己定义的接口,
设备的驱动定义好与这些 OS 接口的连接,剩下的就是设备本身的特性管理以及驱动接口中对设备管理函数的调
用了,比如寄存器访问、配置管理、缓冲区管理、数据收发等,比较重要的中断和同步的控制,要避免数据处理的
时候的死锁。
比如网卡驱动,基本的要求是提供内核需要的接口,这样网卡驱动才能挂接到系统中,剩下的就是接口需要调用
网卡驱动的内部函数,来对网卡进行控制、数据收发和管理等
Linux 支持的设备种类繁多,不可能所有都掌握,某一子系统也只能是熟悉,因为同类设备还有许多自由的特性。
写驱动的步骤可以概括为:
& & & & 1) 阅读设备规范,对设备的运行机理有所了解
& & & && & 为了减少干扰,不考虑要支持的 OS,独立与 OS 考虑基本的功能如何实现
& & & & 2) 参考同类设备在 Linux 内核中的驱动架构
& & & & 3) 提供基本的 Linux 设备驱动接口和实现设备的基本功能,比如网卡收发小数据量
& & & & 4) 在性能上逐步提示,比如网卡传输的数据量加大、中断及时处理、避免死锁等
& & & & 5) 对边界条件进行完善,网卡上就是对一些特殊大小的数据包传输完善等
& & & & 6) 对设备进行更高级控制的支持,比如网卡支持 ethtool 等工具
& & & & 7) 反复调试、改进和优化
3. Linux内核有上百个驱动子系统,你研究过内核各种驱动子系统的共性,层次结构设计吗?分享学习一个Linux内核子系统的经验,例如USB、I2C、HID等driver。
& & & & 每一个子系统都巨大无比,而且涉及各种硬件规范,很难去搞明白所有。只能是遇到问题的时候,
& & & & 能对某一部分深入下去。之前了解过 SCSI 的架构,最上层的抽象,中间层的桥梁,最底层的设备
& & & & 驱动控制
& & & & 如果仅仅是做 driver 的工作,可以把精力放在设备特性上,Linux 内核部分只需要了解驱动
& & & & 接口和同步、内存管理等基本功能
4. 您深入研究过Linux设备驱动模型,关注过Linux内核驱动的设计思想吗?
& & & & Linux 设备驱动模型是从分类的角度来看待设备,分类是多维的,所以 /sys 下也是多个目录
& & & & 另外,设备驱动模型给出了系统中设备布局信息,比如根据总线地址可以定位对应的设备目录等
& & & & Linux 内核驱动可以都是遵循一个逐层抽象的架构:
& & & & & & & & 最上层的抽象层便于系统软件的访问,
& & & & & & & & 中间层的实现硬件协议细节,同时提供上下两层连接的接口,
& & & & & & & & 对于最下层的 driver 来说就是要定义底层驱动要实现的接口和实际的设备控制
& & & & 由于 Linux 内核各类驱动的框架支持,driver 可以更加关注设备本身的特性
5. Android系统是基于Linux内核的,传统的Linux驱动开发和Android驱动开发有什么区别?
& & & & 传统的 Linux 内核驱动开发,只需要定义好 Linux 需要的驱动接口就好了,之后
& & & & 专注与设备本身的特性
& & & & 而 Android 驱动开发,需要将设备操作接口继续封装,提供上层使用的 Java API;
& & & & driver 部分可以使用 C 代码,一些更复杂的操作可以用 Java 实现,然后 driver
& & & & 提供对复杂操作的接口支持
& & & & 一个很重要的方面是功能的分离定义,比如哪些是 driver 实现的,哪些是上层实现的,
& & & & 它们之间的接口是怎样的,定义好这些,就可以按照传统 driver 的实现方式来做了;
& & & & 从某种程度上,可以看作是传统 driver 跟相关 tools 转换成了 Android driver
& & & & 和上层 Java 接口
信誉积分 +10
稍有积蓄, 积分 344, 距离下一级还需 156 积分
论坛徽章:0
本帖最后由 lyl19 于
18:44 编辑
shenlanyouyu
我觉得设备驱动 开发对kernel的掌握还算是次要的,最重要的是对arch, 以及硬件的理解。
印象中发生了太多的case, 与arch相关的,比如说memory barrier,都要花比较大的气力解决。
而与硬件相关的,比如说DMA hung之类的,中断不触发之类的,这个时候,单纯从软件来很难解决,一般都是WAR,比如复位啥的。但如果有机会去读到硬件的RTL, 这个时候你对这类的问题将不再是恐惧,而是心里会有数。
所以个人认为,设备驱动的编写绝不是单纯软件的事情,必须要熟悉该设备的RTL,如果你能够得到的话。

我要回帖

更多关于 linux内核驱动开发 的文章

 

随机推荐