linux驱动简单介绍
驱动基本介绍
驱动。顾名思义就是“驱使硬件设备行动”。设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作。
设备 驱动充当了应用程序和应用软件直接的纽带,它使得应用软件只需要调用系统软件的应用编程接口就可以让硬件完成响应的操作。
硬件、设备驱动和应用软件的关系
-
无操作系统:
-
有操作系统:
linux设备驱动与整个软硬件的关系
Linux下设备驱动一般分为三大类:字符设备驱动,块设备驱动,网络设备驱动。除了网络设备驱动以外,字符设备和块设备都是通过linux虚拟文件系统进行管理(VFS)。
抽象出简单的调用关系图如下:
内核空间和用户空间
对于一个32位操作系统,它的寻址空间(虚拟地址空间)为4G(2^32)。也会是说每个进程的虚拟地址空间为4G。操作系统的核心是内核,它独立于普通的应用程序,可以访问受保护的应用程序,也有访问底层硬件设备的所有权限。为保护内核安全,现代操作系统一般都强制用户进程不能直接操作内核,具体实现由操作系统将虚拟地址空间划分为两部分:内核空间和用户空间
- 用户空间:0x00000000-0xBFFFFFFF
- 内核空间:0xC0000000-0xFFFFFFFF
总结:最高的1G内核空间是被所有进程共享
如下图所示,应用程序一般处于用户空间,而系统调用和驱动处于内核空间,故,当应用程序需要和驱动进行数据交互时,需进行地址转换。不能直接访问。
linux设备驱动提供两个接口函数copy_from_user()与copy_to_user():
- copy_from_user():从用户空间拷贝到内核空间,一般用于write,向内核写之前,先转换
- copy_to_user():从内核空间拷贝到用户空间,一般用于read,从内核读取后,在转换
1 unsigned long copy_to_user(void _ _user *to, const void *from, unsigned long count); 2 unsigned long copy_from_user(void *to, const void _ _user *from, unsigned long count)
参考
Linux 内核空间与用户空间
Linux 设备驱动开发详解第二版.宋宝华