Linux内核开发与Linux驱动开发有啥关系?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核开发与Linux驱动开发有啥关系?相关的知识,希望对你有一定的参考价值。
我做过驱动开发,说说我的看法。本质上说Linux内核开发和Linux驱动开发是不一样的,或者说驱动开发是内核开发的一部分,因为驱动属于内核。目前国内驱动开发和内核开发一般是一样的。有对应linux内核开发工程师和linux驱动开发工程师职位。内核开发指的是形成linux操作系统的过程,也就是内核开发者向内核中添加信息使得linux从无到有的过程或者添加新的功能,比如Linux内核在2.6版本内核之前是没有设备驱动模型,内核开发者在2.6版本中增加了设备驱动模型,这属于linux内核开发。而linux驱动开发指的是使用Linux内核提供的接口,驱动开发者根据实际情况按照内核提供驱动的框架写相应的驱动并注册到相应的总线上,进而驱使硬件设备工作,比如I2C设备就注册到i2c总线上,这个i2c总线是内核开发者为我们提供的接口,我们只需要调用相应接口即可。整个工作流程是:linux应用程序-内核-驱动-硬件。如下图所示:
多说一点,要进行linux驱动开发,必须学好C语言、能够看懂电路图(因为驱动开发需要根据相应的引脚来编写驱动)需要模电和数电知识,linux操作系统知识,linux应用编程知识(多进程、多线程、文件io操作)因为我们要测试写的驱动能否正常工作需要linux应用编程知识。最好对数据结构中的链表有所了解,内核中有大量的内核链表。
感谢评论,交流,转发。更多精彩内容可关注本头条号:嵌入式软硬件开发。感谢大家。相互交流,共同进步。 参考技术A 还没学到驱动,大致的说一下吧,驱动是建立在内核之上来开发的,比如你写了一个驱动的代码,那就要把驱动加载到内核中去,然后内核去执行,为什么需要内核,我个人的理解就是,内核是来管理硬件资源的,你写的驱动代码是来驱动硬件的,内核不可能去驱动硬件的,当然包括管理进程,这部分的事情由驱动去做,驱动可以理解为一个进程,内核负责来管理,结构就是:应用程序-内核(比如系统调用write,read等等)-驱动程序(比如write来驱动磁盘来写)。
换句话说就是对于驱动开发,不知道楼主是否学过单片机,可以理解驱动就是一个驱动硬件的过程,就像单片机一样,当然再发过程中还是有很大的区别的。
内核开发,这个工作还真不是一般的人能开发的,不然linux内核的维护就不会给linux之父了,内核的开发就是用一种方法来合理的管理并分配硬件资源,比如内存的管理就用到分页的方法,还有一些磁盘的管理,进程的管理,cpu的调度算法(比如简单的FIFO,时间片)等等,在学习内核前做好把操作系统原理看一下,这本书还可以:
我学习的时候结合了国外的操作系统原理第七版,因为这两本书介绍的侧重点有所不同,上图的书注重实践性(相比后一本),后一本注重算法方面。
额。。说偏了哈,反正总有一天楼主估计是想开发内核的,所以建议先把原理学会,还有最基本的计算机科学基础知识最好学的扎实点,到时学习内核就不是特别吃力,当然是相比什么都不懂的情况下。 参考技术B 驱动开发是内核开发的一种,内核开发是指内核层应用开发,比如常见的硬件驱动、netfilter等等。 参考技术C 简单关系就是驱动属于内核的一部分! 参考技术D 驱动装在系统上,有的会跟内核有交互,但是驱动一般是针对设备
学习linux底层驱动开发有啥经典的参考书?
结构、操作系统、体系结构、编译原理、计算机网络你全修过我想大概可以分为4个阶段,水平从低到高
从安装使用=>linux常用命令=>linux系统编程=>内核开发阅读内核源码
其中学习linux常用命令时就要学会自己编译内核,优化系统,调整参数
安装和常用命令书太多了,找本稍微详细点的就ok,其间需要学会正则表达式
系统编程推荐《高级unix环境编程》,黑话叫APUE
还有《unix网络编程》
这时候大概还需要看资料理解elf文件格式,连接器和加载器,cmu的一本教材中文名为《深入理解计算机系统》比较好
内核开发阅读内核源码阶段,从写驱动入手逐渐深入linux内核开发
参考书如下《linux device drivers》,黑话叫ldd
《linux kernel development》,黑话叫lkd
《understading the linux kernel》,黑话叫utlk
《linux源码情景分析》
这四本书为搞内核的必读书籍
最后,第三阶段和第四阶段最重动手,空言无益,光看书也不罩,不动手那些东西理解不了
学习linux/unix编程方法的建议
建议学习路径:
首先先学学编辑器,vim, emacs什么的都行。
然后学make file文件,只要知道一点就行,这样就可以准备编程序了。
然后看看《C程序设计语言》K&R,这样呢,基本上就可以进行一般的编程了,顺便找本数据结构的书来看。
如果想学习UNIX/LINUX的编程,《APUE》绝对经典的教材,加深一下功底,学习《UNP》的第二卷。这样基本上系统方面的就可以掌握了。
然后再看Douglus E. Comer的《用TCP/IP进行网际互连》第一卷,学习一下网络的知识,再看《UNP》的第一卷,不仅学习网络编程,而且对系统编程的一些常用的技巧就很熟悉了,如果继续网络编程,建议看《TCP/IP进行网际互连》的第三卷,里面有很多关于应用协议telnet、ftp等协议的编程。
如果想写设备驱动程序,首先您的系统编程的接口比如文件、IPC等必须要熟知了,再学习《LDD》2。
对于几本经典教材的评价:
《The C Programing Language》K&R 经典的C语言程序设计教材,作者是C语言的发明者,教材内容深入浅出。虽然有点老,但是必备的一本手册,现在有时候我还常翻翻。篇幅比较小,但是每看一遍,就有一遍的收获。另外也可用谭浩强的《C语言程序设计》代替。
《Advanced Programing in Unix Envirement》 W.Richard Stevens:也是非常经典的书(废话,Stevens的书哪有不经典的!),虽然初学者就可以看,但是事实上它是《Unix Network Programing》的一本辅助资料。国内的翻译的《UNIX环境高级编程》的水平不怎么样,现在有影印版,直接读英文比读中文来得容易。
《Unix Network Programing》W.Richard Stevens:第一卷讲BSD Socket网络编程接口和另外一种网络编程接口的,不过现在一般都用BSD Socket,所以这本书只要看大约一半多就可以了。第二卷没有设计到网络的东西,主要讲进程间通讯和Posix线程。所以看了《APUE》以后,就可以看它了,基本上系统的东西就由《APUE》和《UNP》vol2概括了。看过《UNP》以后,您就会知道系统编程的绝大部分编程技巧,即使卷一是讲网络编程的。国内是清华翻译得《Unix网络编程》,翻译者得功底也比较高,翻译地比较好。所以建议还是看中文版。
《TCP/IP祥解》一共三卷,卷一讲协议,卷二讲实现,卷三讲编程应用。我没有怎么看过。,但是据说也很经典的,因为我没有时间看卷二,所以不便评价。
《用TCP/IP进行网际互连》Douglus.E.Comer 一共三卷,卷一讲原理,卷二讲实现,卷三讲高级协议。感觉上这一套要比Stevens的那一套要好,就连Stevens也不得不承认它的第一卷非常经典。事实上,第一卷即使你没有一点网络的知识,看完以后也会对网络的来龙去脉了如指掌。第一卷中还有很多习题也设计得经典和实用,因为作者本身就是一位教师,并且卷一是国外研究生的教材。习题并没有答案,留给读者思考,因为问题得答案可以让你成为一个中级的Hacker,这些问题的答案可以象Douglus索取,不过只有他只给教师卷二我没有怎么看,卷三可以作为参考手册,其中地例子也很经典。如果您看过Qterm的源代码,就会知道Qterm的telnet 实现部分大多数就是从这本书的源代码过来的。对于网络原理的书,我推荐它,而不是Stevens的《TCP/IP祥解》。
《Operating System - Design and Implement》这个是讲操作系统的书,用Minix做的例子。作者母语不是英文,所以英文看起来比较晦涩。国内翻译的是《操作系统设计与实现》,我没看过中文版,因为翻译者是尤晋元,他翻译的《APUE》已经让我失望头顶了。读了这本书,对操作系统的底层怎么工作的就会
有一个清晰的认识。
《Linux Device Driver》2e ,为数不多的关于Linux设备驱动程序的好书。不过内容有些杂乱,如果您没有一些写驱动的经验,初次看会有些摸不着南北。国内翻译的是《Linux设备驱动程序》第二版,第一版,第二版的译者我都有很深的接触,不过总体上来说,虽然第二版翻译的有些不尽人意,但是相比第一版来说已经超出了一大截。要读这一本书,至少应该先找一些《计算机原理》《计算机体系结构》的书来马马虎虎读读,至少应该对硬件和计算机的工作过程有一些了解。 参考技术A 《linux设备驱动程序》
现在应该是第三版了
写驱动的圣经啊 参考技术B 嵌入式驱动开发圣经 参考技术C 《linux设备驱动程序》百度文库里能直接下载免费电子书,中文的 参考技术D gdk128说的对,从他的名字就知道,gdk
以上是关于Linux内核开发与Linux驱动开发有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章