IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> linux设备驱动开发基础(一) -> 正文阅读

[系统运维]linux设备驱动开发基础(一)

?参考:《Linux驱动开发入门与实战》

????????设备驱动程序时计算机硬件与应用程序的接口,是软件系统与硬件系统沟通的桥梁。

1. 设备驱动的分类

????????Linux将设备分为3大类,分别是字符设备、块设备、网络设备。每一个字符设备或块设备都在/dev目录下对应一个设备文件。linux用户程序通过设备文件(或称设备节点)使用驱动程序操作字符设备和块设备。

1.1 字符设备是指只能一个字节一个字节读写数据的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。

1.2 块设备是指可以从设备的任意位置读取一定长度数据的设备。其读取数据不必按照先后顺序,可以定位到设备的某一具体位置。块设备包括硬盘、磁盘、U盘和SD卡等。块设备比字符设备需要有更复杂的结构来描述。在Linux内核中,块设备与字符设备驱动有完全不同的API。

1.3 网络设备主要负责主机之间的数据交换,是面向数据包的接受和发送而设计的。网络设备在Linux操作系统中是一种非常特殊的设备,其没有实现类似字符设备和块设备的read()、write()、ioctl()等函数。网络设备通过套接字接口来完成网络数据传输。

2. 用户态和内核态

????????Linux操作系统分为用户态和内核态。用户态处理应用层的业务,然后通过系统调用向内核态发送操作请求,内核态响应用户态的请求,从而实现对具体硬件设备的操作。

????????应用态程序只能通过系统调用或硬件中断访问内核态程序。当应用程序执行系统调用或被硬件中断挂起时,Linux操作系统会从应用态切换到内核态。当系统调用或硬件中断处理完成完成后,操作系统会从内核态返回到用户态,继续执行应用程序。

????????应用态和内核态的划分,有以下优点:

2.1 容易移植:应用态不需要了解硬件的具体工作原理,就能很好的操作硬件设备。

2.2 安全性:应用态和内核态处于不同的地址空间,应用态程序不会因为一些错误破坏内核态程序,也就不会因为应用态的程序错误导致内核崩溃。

3. 模块机制

????????模块是可以在运行时加入内核的代码。模块机制的引入一方面扩展了内核的功能,另一方面减小了内核的大小。

????????模块是由编译好的目标代码组成的,可以使用insmod命令将模块加载到正在运行的内核,可以使用rmmod命令将一个未使用的模块从内核删除(但是不能删除一个正在使用的模块)。

????????模块在内核启动时装在称为静态装载,在内核已经运行时装载成为动态装载。

????????一个模块最基本的框架代码如下:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>

int __init xxx_init(void)
{
/* 模块加载时的初始化工作 */
return 0;
}
int __exit xxx_exit(void)
{
/* 模块卸载时的销毁工作 */
return 0;
}
module_init(xxx_init); /* 指定模块初始化函数的宏 */
module_exit(xxx_exit);/* 指定模块卸载函数的宏 */

4. 注意

????????内核及驱动程序的开发与应用程序开发有很大不同,最重要的差异如下:

4.1 内核及驱动程序开发时不能访问C库,因为C库是使用内核中的系统调用来实现的,而且是在用户空间实现的。

4.2 内核及驱动程序开发时必须使用GNU C,因为Linux操作系统从一开始就使用的是GNU C,虽然也可以使用其他编译工具,但是需要对以前的代码做大量的修改。

4.3 内核支持异步终端、抢占和SMP,因此内核及驱动程序开发时必须时刻注意同步和并发。

4.4 内核只有一个很小的定长堆栈。

4.5 内核及驱动程序开发时缺乏像用户空间那样的内存保护机制。

4.6 内核及驱动程序开发时浮点数很难使用,应该使用整形数。

4.7 内核及驱动程序开发要考虑可移植性,因为不同的平台,驱动程序是不兼容的。?

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:52:22  更:2021-08-31 15:54:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 11:43:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码