编写Linux设备驱动的先决知识

本文从描述驱动的概念、Linux内核整体架构、内核模块化设计、Linux驱动设备分类、驱动程序安全性要求和如何学习驱动几个方面来阐述编写Linux设备驱动的先决知识。

1、什么是驱动?

软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序。

狭义上驱动程序就是专指操作系统中用来操控硬件的逻辑方法部分代码。

2、Linux内核整体架构

2.1  分层思想

1)驱动的上面是系统调用API

通过系统调用向Library Routine(例如:C库)或者其他应用程序提供接口。

2)驱动下面是硬件

管理系统的所有硬件设备,CPU、Memory(内存和外存)、输入输出设备、网络设备和其他的外围设备。

2.2  核心功能

根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下功能:

1)Process Scheduler,也称作进程管理、进程调度。负责管理CPU资源。以便让各个进程可以以尽量公平的方式访问CPU;

2)Memory Manager,内存管理。负责管理Memory(内存)资源,以便各个进程可以安全地共享机器的内存资源;另外,内存管理会提供虚拟内存的机制,改机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件保存在外部非易失存储器,需要使用的时候,再取回内存中;

3)VFS(Virtual File System),虚拟文件系统。Linux内核将不同功能的外部设备,例如:Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(起始Liunx做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件);

4)Network,网络子系统。负责管理系统的网络设备,并实现多种多样的网络标准;

5)IPC(Inter-Process Communication),进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。

3、模块化设计

宏内核和微内核

1)宏内核(单内核):将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。

2)微内核:功能被划分成独立的过程,进程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。典型如windows。

3)Linux是如何实现的?本质上是宏内核,但是又吸收了微内核的模块化特性,体现在2个层面。

A、静态模块化:在编译时实现可裁剪,特征是想要功能裁剪改变必须重新编译,可以通过make menuconfig在里面进行配置,选择是否编译某一个模块。将编译好的zImage重新烧录。

B、zImage可以不重新烧录,甚至可以不关机重启就实现模块的安装和卸载。

4、Linux设备驱动分类

4.1  驱动分类

分类原则: 设备本身读写操作的特征差异。

分为三类: 字符设备驱动、块设备驱动、网络设备驱动

4.2  三类驱动对比分析

1)字符设备:准确的说应该叫“字节设备”,软件操作设备时是以字节为单位进行的。典型的如LCD、串口、LED、蜂鸣器、触摸屏······

2)块设备:块设备是相对于字符设备定义的,块设备被软件操作时是以块(多个字节构成的一个单位)为单位的。设备的块大小是设备本身设计时定义好的,软件是不能去更改的,不同设备的块大小可以不一样。常见的块设备都是存储类设备,如:硬盘、NorFlash、NandFlash、iNand、SD····

3)网络设备:网络设备是专为网卡设计的驱动模型,linux中网络设备驱动主要目的是为了支持API中socket相关的那些函数工作。

Note: 常见大量设备都属于字符设备、非标准类型设备驱动也是采用字符设备驱动来实现。

如:ARM与FPGA之间的通信,FPGA就是一个非标准类型设备,把FPGA挂载到ARM的某一个bank上,通过操作内存的方式来操作FPGA设定好的寄存器。在软件上要写一个驱动,方便应用程序去调用操作FPGA,这个驱动模型就是采用字符设备驱动来实现。

5、驱动程序的安全性要求

5.1  驱动是内核的一部分

1)驱动已经成为内核中最庞大的组成部分

2)内核会直接以函数调用的方式调用驱动代码

3)驱动的动态安装和卸载都会“更改”内核

5.2  驱动对内核的影响

1)驱动程序崩溃甚至会导致内核崩溃

2)驱动的效率会影响内核的整体效率

3)驱动的漏洞会造成内核安全漏洞

5.3  常见驱动安全性问题

1)为初始化指针

2)恶意用户程序

3)缓存区溢出

4)竞争状态

6、如何学习驱动

1)首先具备扎实的C语言基础、掌握相关预备知识如硬件操作的逻辑、应用层如何调用驱动来控制硬件,本质上是调用相应的API。

2)注重实践,一步一步写驱动;框架思维,多考虑整体和上下层;先通过简单设备学linux驱动框架;学会总结、记录,这会有助于理解。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习Kali Linux需要具备一定的计算机基础知识和技能。以下是一些建议来学习Kali Linux: 1. 了解和学习Linux系统:Kali Linux是基于Debian的Linux发行版,因此对Linux系统有一定的了解是必要的。了解Linux的基本命令、文件系统和权限管理等内容是学习Kali Linux的基础。 2. 学习信息安全基础知识:Kali Linux是一款主要用于信息安全的渗透测试和攻击工具。了解网络安全的基本概念、常见的攻击与防范措施是学习Kali Linux的先决条件。 3. 阅读相关资料:学习Kali Linux可以通过阅读相关的书籍、教程和技术文档来获得基础知识。可以根据自己的实际需要选择不同的资料。 4. 参加培训课程:参加专门的Kali Linux培训课程可以加快学习进度和提升技能水平。通过培训可以学到更系统和专业的知识。 5. 实践和实验:Kali Linux是一个工具集,需要通过实践和实验来熟练掌握。可以在虚拟机环境中安装使用Kali Linux,并进行各种实际的操作和攻击模拟。 6. 参与相关社区和论坛:参与Kali Linux的用户社区和安全论坛,可以与其他用户交流经验和技巧,获取实际问题的解决方案。 总的来说,学习Kali Linux需要坚实的计算机基础和信息安全知识,并进行大量的实践。通过系统的学习和实践,逐渐掌握Kali Linux的使用技巧和安全测试的基本方法,从而提升自己在信息安全领域的技能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值