很多程序员在学习技能时,盲目追求技术实现,而忽略了整个生态环境的观察和基础理论铺垫linux端口映射,导致学完后似是而非,不能举一反三,遇到项目依然拿不出合理的解决方案。
作为一个技术开发者,大家要明白“技术只是工具,有用的是产品”,我们要用技术去解决问题,而不是单纯地做个技术控,自我娱乐。
想要学习一门新技术,我们首先要对它有个清晰的了解,不能什么都不懂就开始往上面扑,就像很多人到庙里面就上香求佛祖保佑,可能根本都不知道这个佛是哪一路神仙。
那今天我们就先带大家来深入了解下嵌入式开发中至关重要的一环:linux驱动。
在学习驱动之前,我们首先来了解下操作系统。
# 操作系统OPERATING SYSTEM #
计算机出现的时候,还没有什么花里胡哨的包装,都是光着身子跑,用技术的语言说就是它只能执行一个任务,执行一个进程linux 安装 驱动,也可以叫“裸跑”。
可以拿我们的手机来比喻,裸机的话,我们玩王者荣耀的时候,有人打电话进来的话,王者荣耀是要被终止的。
后来就有了操作系统,操作系统可以保证多任务执行,同样的 CPU 芯片,有了操作系统,我可以开微信linux 安装 驱动,,还同时做其他很多事情。
所以就出来了很多操作系统,操作系统可以分为实时操作系统和通用操作系统。
实时操作系统(RTOS 全称Real Time Operating System)可以理解为对时间要求非常苛刻,可以用一个词“必须”来理解,就是在某个时间段之内必须要做某件事情。
而通用操作系统很常见,比如电脑 windows,Android 手机,ios手机等linux视频教程,Linux也可以认为是通用OS,因为他们对时间要求不是很严苛。
Linux 可以通过配置某个宏定义变成实时操作系统,但是我们使用Linux 主要是针对他的通用 OS,多用户,多任务等特别突出的性能。
目前这个阶段,可以说每个人都脱离不开Linux,比如你手机底层是 Linux 内核,购物的云平台,淘宝,亚马逊等都是用 Linux开发维护的,很多股票平台也都是基于 Linux 开发维护的。
# 什么是驱动?WHAT IS DRIVE #
按照字面意思就是给一个东西动力,让它动起来,至于物体怎么动是有一定的逻辑规律在里面的;对于电学中的硬件驱动来说,电力提供了动力,但是驱动程序提供了操作物体的逻辑方法。
比如我们的LED路灯照明,电让我们的LED灯亮起来,但是里面的程序检测到时间的变化控制电路的导通和断开,这里面的驱动程序就叫LED Driver。
# linux驱动LINUX DRIVER #
linux驱动是linux内核驱动的全称,至于什么是linux内核,我们将在下面的linux体系结构中进行说明。
对于linux驱动的理解可以分为广义和狭义上两种。
linux驱动广义上是指操作硬件,让硬件工作起来的程序代码,这段代码就叫做硬件的驱动程序。
但是在裸机开发中我们也经常会听到裸机驱动,其实严格意义上来说,没有操作系统是没有驱动概念的,如果非要说裸机驱动的话,也是指裸机中操作硬件的那部分程序。
linux驱动狭义上是指操作系统中用来控制硬件的逻辑方法的那部分代码。
对于这个定义我们可以从以下两方面去进行理解:
①操作系统有很多种,windows有windows驱动,ios有ios驱动,android有android驱动,而我们学习的linux驱动则是针对linux操作系统平台。
②linux驱动只是内核中的一部分,除了用来控制硬件的这部分外,还有文件系统,内存管理,内核调度等内容。
而狭义上的linux驱动是我们课程的研究方向。
# linux体系结构LINUX ARCHITECTURE #
了解linux体系架构,有助于增强我们对驱动开发整个体系的认识,帮助我们更好地投入到linux驱动学习中。
①、linux系统是分层的
Linux系统一般有4个主要部分:内核、shell、文件系统和应用程序。
内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。
分层设计的思想让程序间松耦合,有助于适配各种平台。
②驱动的上面是系统调用,下面是硬件。
③驱动本身也是分层
Linux内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等。
彼此之间的系统合作也是一级调用一级,系统庞大,这也是它难以学习的原因所在。
# linux驱动的分类CLASSIFICATION OF LINUX DRIVERS #
Linux驱动分为三个基础大类:字符设备驱动,块设备驱动,网络设备驱动。
①字符设备
字符设备提供的就是一种数据流。比如当你在键盘上敲入“yes”这个字符串的时候,键盘驱动程序会按照输入完全相同的顺序返回这个由这三个字符组成的数据流,首先是“y”,然后是“e”,然后是“s”,最终是文件的结束符(EOF),当没有人敲键盘的时候,键盘的字符流就是空的。
所以鼠标、键盘、显示器等都是典型的字符设备。
②块设备
而块设备的驱动可能要求读取磁盘上任意块的内容,然后又转去读别的块的内容,而被读取的块在磁盘上位置不一定要连续,所以说硬盘是可以被随机访问的,而不是以流的方式被访问,显然它就是一个块设备。
典型的块设备有:磁盘、U盘等。
③网络设备
网络设备驱动是特殊设备的驱动,它负责接收和发送帧数据,可能是物理帧,也可能是ip数据包,这些特性都由网络驱动决定。
典型的网络设备有:网卡、wifi、蓝牙等。
而在我们的linux驱动学习中,字符设备驱动占的比例比较大。
因为字符设备应用面广,在以后的开发中是使用最多的。对于块设备和网络设备要求修改或者定制的很少,一般都是厂家拿过来可以直接用的。