PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,

如果和你的原则及想法相冲突,请谅解,勿喷。

前置说明

  本文作为本人csdn blog的主站的备份。(BlogID=021)

  本文发布于 2016-06-14 20:49:38,现用MarkDown+图床做备份更新。blog原图已丢失,使用csdn所存的图进行更新。(BlogID=021)

环境说明

  无

前言


  无

Linux 系统运行时,文件系统与驱动的前世今生


  在Linux系统中,一切皆文件.所以在Linux中,设备也被作为一种文件来操作.而实现这些操作的,就叫做设备驱动.在Linux中,设备被分为三类:

  • 字符设备(如,鼠标,键盘==)
  • 块设备(如硬盘)
  • 网络设备(这里指网络接口,如常见的eth0,wlan0,lo)

  我们都知道,Linux一切皆文件,且,Linux具有两个空间--用户与内核.那么具体到用户态的表现就是,我们Open某个设备后,我们就会得到一个在系统中唯一的文件描述符号fd.我们所有关于设备的操作,都是以fd为依据进行操作.那么我们来看一个字符驱动在的调用过程.

  1. 当我们在用户态执行到open("/dev/xxx-device",mode,flag)函数时.
  2. 文件系统会到系统中找一个与设备文件(例子中的/dev/xxx-device)对应的inode结构体,同时在一个设备表中去查到对应设备号i_rdev的struct cdev 地址赋值给i_cdev.
struct inode{
dev_t i_rdev; //设备编号
umode_t i_mode;//设备类型
struct cdev *i_cdev; //cdev 指向设备的内核的内部驱动结构
......
};
// 内核中的struct cdev
struct cdev
{
struct kobject kobj;//内嵌的kobject对象
struct module *owner;//所属模块
struct file_operations *ops;//文件操作结构体
struct list_head list;
dev_t dev;//设备号,长度为32位,其中高12为主设备号,低20位为此设备号
unsigned int count;
};
  1. 找到了设备文件对应的inode后,文件系统将会建立file结构体.并初始化其中的变量,其中最重要的,也是我们写驱动将会用到的是f_op变量的值,这个就是我们驱动中的 struct file_operations 变量的地址.也就是为了使用这个地址,能够调用到我们在驱动中提供的操作设备的一些基本调用.
 struct file{

  mode_t fmode; //文件模式,如FMODE_READ,FMODE_WRITE

  ......

  loff_t f_pos; //loff_t 是一个64位的数,需要时,须强制转换为32位

  unsigned int f_flags; //文件标志,如:O_NONBLOCK

 struct file_operations *f_op;

 void *private_data; //非常重要,用于存放转换后的设备描述结构指针

 .......

 };
  1. 当以上的所有流程走完,那么我们就可以操作设备了.别如read(),write,ioctl()等等

  以上就是Linux中,驱动与文件系统的故事,只有了解了这些,我们才能够知道我们为何要用那样的方式,结构,架构等等去写Linux的驱动.

后记


  友情提示:我们在用户态操作设备,而驱动在内核态,是两个不同的地址空间.所以我们在用户态的一系列函数(如open(),read(),write(),ioctl()等等)都会被翻译为内核空间中对应的系统调用去执行.而不是直接执行的操作.想详细了解,可自行搜索关键字:Linux 系统调用

参考文献


打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。

Linux Char-Driver (字符驱动 摘要)(一)的更多相关文章

  1. linux device driver —— 字符设备

    现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...

  2. Linux和Windows设备驱动架构比较

    毕业后一直在学操作系统, 有时候觉得什么都懂了,有时候又觉得好像什么都不懂,但总体来说自认为对操作系统实现机制的了解比周围的人还是要多一些.去年曾花了几个星期的晚上时间断断续续翻译了这篇对Linux和 ...

  3. linux驱动初探之字符驱动

    关键字:字符驱动.动态生成设备节点.helloworld linux驱动编程,个人觉得第一件事就是配置好平台文件,这里以字符设备,也就是传说中的helloworld为例~ 此驱动程序基于linux3. ...

  4. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(一)之miscdevice和ioctl 0. 导语 在嵌入式的道路上寻寻觅觅很久,进入嵌入式这个行业也有几年的时间了,从2011年后 ...

  5. 基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read、write

    基于OMAPL138的Linux字符驱动_GPIO驱动AD9833(二)之cdev与read.write 0. 导语 在上一篇博客里面,基于OMAPL138的字符驱动_GPIO驱动AD9833(一)之 ...

  6. linux 字符驱动框架(用户态的read,write,poll是怎么操作驱动的)

    前言 这篇文章是通过对一个简单字符设备驱动的操作来解释,用户态的读写操作是怎么映射到具体设备的. 因为针对不同版本的linux内核,驱动的接口函数一直有变化,这贴出我测试的系统信息: root@ubu ...

  7. Linux kernel 之 uart 驱动解析

    uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制. 在Linux kernel 内部,uart ...

  8. Linux下的硬件驱动——USB设备(转载)

    usb_bulk_msg函数 当对usb设备进行一次读或者写时,usb_bulk_msg 函数是非常有用的; 然而, 当你需要连续地对设备进行读/写时,建议你建立一个自己的urbs,同时将urbs 提 ...

  9. 旧接口注册LED字符驱动设备(静态映射)

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

  10. 新接口注册LED字符驱动设备

    #include <linux/init.h> // __init __exit #include <linux/module.h> // module_init module ...

随机推荐

  1. Github开源项目Excalidraw:简洁易用的手绘风格白板工具

    Excalidraw是Github上的一个开源项目,它提供了一个简洁易用的手绘图形创建工具,用户可以通过它创建流程图.示意图.架构图和其他各种图形.本文将介绍Excalidraw的特点和功能,并探讨其 ...

  2. 安装Electron时卡在install.js不动的解决方案

    问题来源,发现即使 源切换成淘宝的之后,安装 electron的时候还是慢死,郁闷,后来百度才发现,原来,还需要设置一个地方!!! 经过试验,果然快了 爽.... 之前在安装Electron的时候,经 ...

  3. IIS的基本安装和配置

    实验介绍:IIS的作用 IIS是web服务器中常见的一种.当客户端想访问某个域名时,向web服务器发出请求.web服务器返回网页的代码做出回应.客户端解析代码生成网页. 一:安装IIS 1.打开一台w ...

  4. JS 前序遍历、中序遍历、后序遍历、层序遍历详解,深度优先与广度优先区别,附leetcode例题题解答案

    壹 ❀ 引 按照一天一题的速度,不知不觉已经刷了快两多月的leetcode了,因为本人较为笨拙,一道简单的题有时候也会研究很久,看着提交了两百多次,其实也才解决了70来道简单题,对于二分法,双指针等也 ...

  5. SpringBoot 2.6 和 JUnit 5 的测试用例注解和排序方式

    JUnit5 的测试注解 在JUnit5中, 不再使用 @RunWith 注解, 改为使用 @ExtendWith(SpringExtension.class) @ExtendWith(SpringE ...

  6. scrcpy-Android投屏神器

    介绍 scrcpy 是免费开源的投屏软件,支持将安卓手机屏幕投放在 Windows.macOS.GNU/Linux 上,并可直接借助鼠标在投屏窗口中进行交互和录制. 下载scrcpy 解压. http ...

  7. image could not be accessed on a registry to record its digest

    问题说明: 在管理节点执行docker stack xxx 方式运行服务,报如题错误. 问题原因: docker swarm运行需要一个镜像仓库才行,所有节点都去这个仓库统一镜像. 来看下官方的解释: ...

  8. 2019年在浏览器用原生js写WebGL,绘制图形;

    因为JavaScript高级程序设计(第三版)中的运行书上15.3WebGL部分的代码时在chrome和firefox浏览器下报错,在后面我网上初步找了一圈,好像没人做出真正可以用的代码;所以我就自己 ...

  9. 2021-07-20 JavaScript中关于eval()方法

    eval()常见用途 1.使用ajax获取到后台返回的json数据时,使用 eval 这个方法将json字符串转换成对象数组 let jsonString = JSON.stringify({fang ...

  10. 【Application Insights】使用CURL命令向Application Insgihts发送测试数据

    问题描述 在使用App Service或者Kubernetes等服务时,需要收集一些日志数据并且发送到Application Insights中,当使用SDK或者是服务自带的Application I ...