从零开始学Linux内核驱动-(一)驱动综述

Linux驱动-(一)驱动综述

一、Linux驱动

  • Linux是一个成功的优秀的开源项目,随着应用的日益广泛,Linux已受到越来越多的软件开发者的追捧。但是从官网上面下载下来Linux源码后,我们会发现Linux的世界是如此巨大,代码量是如此巨大。要想学习,Linux到底该从哪里入手呢?

    之前在一本很有名气讲述Linux的书中,看到作者有提到两个不错的突破口,可以帮助我们更好的进入Linux的世界—网络和驱动。

    那么从本篇博文开始我将本着学习和交流的态度在这里分享一些关于Linux驱动相关的一些知识,一些是我从书上或是其他博文看到的,一些是我自己的编程体会,我将这些都融入到一起记录在这里。让我们一起开始Linux驱动开发之旅吧!

  • Linux的驱动开发的是内核级别的开发,所以他对编程的要求会更加的高。因为,我们很小的一个纰漏都很有可能导致系统的崩溃。特别注意的是在内核开发过程中指针的使用,每一步必须清楚的知道自己的指针是指向何处的,以及它访问的地址是否是合法的。

  • 同裸机开发一样,驱动开发同样也需要进行中断的处理。在内核驱动中中断又分为中断上下文,即一部分先去响应中断,一部分去处理中断。(这部分后续会详细讲述,这里只是提出一个概念)

  • 驱动程序是要被上层应用程序调用的,所以我们应该给上层应用程序提供好API,以供上层程序去调用。当然啦,这也就是驱动程序的核心所在啦,谁让我们是系统层的编程呢?当然要为运行在我们是上面的程序提供一个合适的环境以及硬件驱动的接口啦。

  • 每一类驱动都有一个特定的驱动模板,以后统一称之为驱动框架吧。所有的驱动都有一种类似的实现模式,就是构造核心的数据结构,然后注册到内核。编写驱动,实际上就是去学习这些核心的数据结构和与之相关的一套API(注意这句话,后面基本是围绕这句话来是实现相关驱动的讲解)。同样我们在编写内核驱动的时候,应该尽量利用内核中已有的实现而不是自己重新去构建,因为很多已有的实现能够经历长时间的挑选能够被留在内核,足以说明其经典性以及稳定性,当然了如果你技术足够好而且想要做一些特定功能,当然可以自己去构建了,谁让Linux是一个开放的操作系统呢。

二、Linux驱动分类

  • 当然啦,上面有讲过,不同设备类型不同与之对应的驱动框架也是不同的,那么Linux中的驱动框架主要分为哪些呢?其实,Linux的驱动主要分为以下三种:
  1. 字符设备这类设备的访问是按照字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符驱动程序至少要实现open(),close(),read()以及write()等的系统调用。例如:字符终端(/dev/console)和串口(/dev/ttySo以及类似设备)就是两个字符设备,他们可以很好的说明"流"的概念。字符设备可以通过设备节点来访问,比如:/dev/tty1和/dev/lp0等等。这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以先后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。然而,也存在具有数据特性的字符设备,访问他们可前后移动位置。例如framebuffer就是这样一个设备,APP可以通过map或lseek访问抓取整个图像。

  2. 块设备:所谓块设备就是每次读写时只能传输一个完整的或多个完整的块,而每块包含512个字节(或2的更高字节的数据)。和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备,例如磁盘上能够容纳filesystem。块设备和字符设备的去呗在于内核内部管理数据的方式,也就是内核及驱动程序之间的接口,在内核中,块设备的驱动程序的接口和字符设备完全不同。

  3. 网络设备:网络设备呢,和上面两个都不一样。当然啦,它要更加复杂一些。我们知道任何网络事物都需要经过一个网络接口形成,网络接口是一个能够和其他主机交换数据的设备。接口通常是一个硬件设备,但是通常也可能是一个纯软件设备,比如回环(loopback)接口。网络接口是由内核中的网络子系统驱动的,负责发送和接收数据包。由于不是面向流的设备,因此将网络设备接口映射到filesystem中的节点(比如/dev/tty1)比较困难。Unix访问网络接口的方法仍然是给他们分配一个唯一的名字(比如:rth0),但这个名字在filesystem中不存在对应的节点。内核和网络驱动程序的通信,完全不同于内核和字符设备以及块设备之间的通信,内核调用一套和数据包相关的函数而不是上面提到的read和write等。

  • 好啦,通过上面的分析我们已经在心里对Linux设备驱动有了一个清晰的分类。
  • Linux驱动是基于GNU C的一些标准开发的,其中包含了一些C语言语法的扩展和GNU C的一些标准。(GNU呢,是当前世界上最大的一个软件开源组织,Linux就是其开源项目之一。想要具体了解的小伙伴可以去网上搜搜看看)

  • 当然啦,想要对Linux内核有一个基础了解的小伙伴可以去看下我的另一篇博文,里面有对Linux内核的一些基础介绍:
    内核基础知识介绍

  • 最后,是文中提到的一些网站的地址,我把他们贴到这里,供查阅使用

    GNU C标准相关文档:
    https://www.kernel.org/doc/Documentation/CodingStytle

    Linux 原码下载网址:
    https://www.kernel.org/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
买书时赠送的电子稿,代码示例丰富,非常不错!全书分三个文件打包。 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |--

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值