linux设备驱动(1)--驱动开发基础

代码学习资料来源于:

第2讲 字符设备驱动开发基础实验_哔哩哔哩_bilibili

仅用于个人学习/复习,侵联删

1、应用程序和驱动的交互原理

驱动就是获取外设、或者传感器数据、控制外设。数据会提交给应用程序。Linux驱动编写不仅要编写驱动,还要我们简单编写一个测试应用程序。linux下驱动和应用是完全分开的。

用户空间和内核空间

每个进程都有一个虚拟地址空间。对于32位操作系统而言,虚拟地址空间为4G,且内核空间与用户空间的分配比为1:3。这样做的目的是让每个进程运行都相互不干扰。用户空间对应进程,所以每当进程切换的时候,用户空间就会随之变化,内核空间是由内核进程映射,每个内核空间都会有自己对应的页表,用户进程各有不同的页表。

更加详细的描述如下:Linux 内核空间与用户空间_liefyuan的博客-CSDN博客

用户空间(用户态)和内核空间(内核态):

linux操作系统内核和驱动程序运行在内核空间,应用程序运行在用户空间。分为内核空间和用户空间最大的一个好处就是安全,可以防止一个应用程序获取到较大的权限来改变操作系统。

应用程序想要访问内核资源(驱动)怎么办呢?有三种方法:系统调用、异常(中断)、陷入(软中断)。

应用程序不会直接调用系统调用,而是通过API函数来间接调用系统调用,比如POSIX、C库等。unix类操作系统中最常用的编程接口就是POSIX。

POSIX:POSIX 是 可移植操作系统接口(Portable Operating System Interface) 的缩写。它是一个 IEEE 1003.1 标准,其定义了应用程序(以及命令行 Shell 和实用程序接口)和 UNIX 操作系统之间的语言接口。

比如:应用程序使用open函数打开一个设备文件

每个系统调用都有一个系统调用号

系统调用处于内核空间,应用程序无法直接访问,因此需要陷入到内核,方法就是软中断。陷入到内核以后还要指定系统调用号(下图来源于网络)。

2、字符设备驱动开发流程

1)linux里面一切皆文件,驱动设备表现就是一个/dev/下的文件,比如/dev/led。应用程序调用open函数打开设备,比如led。应用程序通过write函数写数据,比如写1表示打开,写0表示关闭。如果要关闭设备那么就是close函数。

2)编写驱动的时候也需要编写驱动对应的open、close、write等函数。字符设备驱动file_operations结构体。

猜你喜欢

转载自blog.csdn.net/qq_58550520/article/details/129151785