linux驱动简单介绍

 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 设备驱动开发详解第二版.宋宝华

转载于:https://www.cnblogs.com/ywx123/p/10463189.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463305.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 scanf()和gets()函数的区别

C语言 scanf()和gets()函数的区别 1.相同点:scanf( )函数和gets( )函数都可用于输入字符串 2.不同点:两者在功能上有所区别,具体区别如下: 要实现如下需求“从控制台输入字符串”有如下两种实现方式: 1>使用gets()函数实现使用…

Uoj 441 保卫王国

Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题.设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]\sum f[v][1] ,f[u][1]w[u]\sum \min(f[v][0],f[v][1])​\) .现在要资瓷修改 \(x\) 的点权 \(w[x]\) ,容易发现修改后只会影响 \(x\) 到根节…

行存和列存的区别

写入: 行存储的写入是一次完成,数据的完整性因此可以确定。 列存储需要把一行记录拆分成单列保存,写入次数明显比行存储多。 行存储在写入上占有很大的优势 数据修改: 行存储是在指定位置写入一次,列存储是将磁盘定位…

Swift 里集合类型协议的关系

  Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议,可以通过迭代来获取它的元素。 有两个关联类型: /// A type representing the sequences elements.associatedtype Element//…

ASP.NET 实现登录界面(生成验证码)

这周末也没干啥&#xff0c;真正开始ASP&#xff0c;做了个学籍管理系统的登录界面&#xff0c;登录界面主要包括用户名、密码、验证码&#xff0c;界面字体用了<font size"5" color"blue" font-family:"华文琥珀";></font>改变字体…

多域资源整合之基础准备--DNS配置

由于公司的战略调整,需要整合集团内的资源,当然也也包含IT资源,我们需要评估多家公司的IT架构统一,顺利的合并到总集团的IT架构里,这也就产生一个多域的整合的一个案例,在此分享给大家,希望对大家有所帮助&#xff01;篇幅较长&#xff0c;让我们慢慢细化&#xff01; 在这次的…

博客园“图灵杯”第3届博问大赛比赛结果

经过近一个月的激烈角逐&#xff0c;博客园“图灵杯”第三届博问大赛已圆满结束。获奖园友分别是&#xff1a; 一等奖&#xff1a;邀月&#xff08;奖励图灵图书4本&#xff09; 二等奖&#xff1a;Kinglee、邢少&#xff08;奖励图灵图书2本&#xff09; 三等奖&#xff1a;Gr…

我的LINUX学习之路之二十一之web服务器简单搭建

今天说说如何搭建HTTP服务器&#xff01; 目的&#xff1a; 使用“多IP地址”方法实现多个网站。 使用“主机头名”方法实现多个网站。 使用“多端口”方法实现多个网站。 这回用图形界面来&#xff0c;不用说&#xff0c;先来看安装软件&#xff01; System-Administation-添加…

找出一个数组中唯一一个出现2次的数字

找出一个数组中唯一一个出现2次的数字&#xff0c;不清楚是不是LeetCode上的题。本人默认是LeetCode上的题。 一个数组中有N个数字&#xff0c;但是只有一个数字出现了2次&#xff0c;其他的数字均不相同。这种问题一般应该采用hash方法实现。 让所有的数字都放到一个unorder…

动手写了一个12306插件 chrome浏览器

2019独角兽企业重金招聘Python工程师标准>>> 小生是今年毕业来上海参加工作的一位很普通的java web程序员&#xff0c;后经人介绍转到SAP方向。 以前大学离家相对比较近&#xff0c;都是坐汽车回家的&#xff0c;平常都不是高峰期坐火车&#xff0c;使用12306倒是非…

行列存储方式比较

原文链接&#xff1a;https://blog.csdn.net/vagabond6/article/details/79555282 写入&#xff1a; 行存储的写入是一次完成&#xff0c;数据的完整性因此可以确定。 列存储需要把一行记录拆分成单列保存&#xff0c;写入次数明显比行存储多。 行存储在写入上占有很大的优势 …

python环境问题(pycharm)

一、问题 我们在使用python的时候会遇到环境配置问题。如何可以一劳永逸&#xff0c;是我们解决问题的基本思想。 二、解决1.新建环境&#xff1a; 2.添加环境&#xff1a;选择需要的环境&#xff0c;可以是conda&#xff0c;亦可以是virtual。在将make available to all proje…

自己动手焊制硬件开发板

一直有一个做机器人的梦&#xff0c;所以从去年起放弃了十多年的软件开发&#xff0c;开始进入嵌入式领域&#xff0c;先后在.Net Micro Framework 项目中完成了Ti DM335上的GPIO、I2C、USB等驱动&#xff0c;方浅浅地了解了什么叫嵌入式开发。 对非软件也非硬件出身的我&#…

nmcli 命令的基本使用

nmcli 命令的基本使用 nmcli命令 地址配置工具&#xff1a;nmcli nmcli device 查看所有网卡的信息 nmcli device status 和numcli device 相同 nmcli device show 网卡名 查看某个网卡的信息 nmcli connecttion 显示所有网卡的配置连接配置&#xff0c;就是/etc/sys…

超棒的视差滚动效果javascript类库 - Jarallax

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-9-27 来源&#xff1a;GBin1.com 如果你没有听说过视差滚动的话&#xff0c;说明你真out了&#xff0c;作为2011年最流行的网站设计效果之一&#xff0c;给我们留下了深刻的印象&#xff0c;在…

关于更改当前公司(一)--ChangeCompany

AX支持多公司帐套&#xff0c;如果一个集团公司有多个分公司&#xff0c;可以通过创建多个公司帐套的方式来实现&#xff0c;在写代码的时候会遇到需要切换公司的时候&#xff0c;AX2009提供了两种方式来实现多公司数据的查询&#xff0c;内置方法ChangeCompany和关键字CrossCo…

西电网络攻防大赛--渗透测试第二题

地址&#xff1a;http://test.xdsec.org/1/ 使用google浏览器打开 点击Resources 找到cookie 发现key 不过也是加密的 猜测是base64加密 so&#xff0c;百度一个解密网站 就直接百度应用了 结果&#xff1a;g0NexTdo0r

非多态的继承情况下,基类指针可以指向派生类对象么?

class Base { // 基类 public:Base(int aa88) : a(aa) {}void f() { // 非virtualcout<<"Base"<<endl;}int a; }; class Derived : public Base { // 派生类 public:Derived(int ba 77, int bb 66) : a(ba), b(bb) {}void f() { // 非多态cout<<…

母函数题目

hdu 1028 Ignatius and the Princess III 母函数模板题 http://acm.hdu.edu.cn/showproblem.php?pid1028 题意&#xff1a; 整数的拆分。 母函数学习http://www.wutianqi.com/?p596 View Code #include <iostream> #include <cstdio> #include <cstring> …

多态情况下,怎么用基类指针去访问基类的虚函数?

class Base { // 基类 public:virtual void f() {cout<<"Base"<<endl;} }; class Derived : public Base { // 派生类 public:virtual void f() { // 最好加上该virtual cout<<"Derived"<<endl;} };int main(){Base* p new De…