字符设备驱动

1.字符设备驱动概述

Linux用户空间与内核空间之间的虚拟内存是分开的,用户空间不能直接写入内核空间,如果用户空间和内核空间需要传递数据就需要字符设备驱动。

2.结构体以及函数介绍

(1)字符设备空间结构体:

字符设备驱动字符设备驱动
1 static const struct file_operations chrdev_fops =
2 {
3   .owner = This_MODULE,
4   .read = chrdev_read,
5   .write = chrdev_write,
6   .open = chrdev_open,
7   .release = chrdev_release
8 };

View Code

(2)打开和释放函数:

字符设备驱动字符设备驱动
1 static int chrdev_open(struct inode *inode, struct file *filp)
2 {
3     printk(KERN_INFO "chrdev opened\n");
4
5     return 0;
6 }

View Code

字符设备驱动字符设备驱动
1 static int chrdev_release(struct inode *inode, struct file *filp)
2 {
3     printk(KERN_INFO "chrdev released\n");
4
5     return 0;
6 }

View Code

(3) 读写函数:

字符设备驱动字符设备驱动
1 static ssize_t chrdev_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
2 {
3     printk(KERN_INFO "return EOF\n");
4
5     return 0;
6 }

View Code

字符设备驱动字符设备驱动
1 static ssize_t chrdev_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
2 {
3     printk(KERN_INFO "got %ld bytes\n", count);
4
5     return count;
6 }

View Code

对于这两个方法,filp是文件指针,count是请求的数据传输的大小。buf参数指向保存要写的数据的用户缓冲区,或者指向应该放置新读取数据的空缓冲区。最后,ppos是指向 “long offset type” 对象的指针,该对象指示用户正在访问的文件位置。返回值是一个”signed size type”。这是最基本的函数结构,但是如果这个函数只是一个空壳,并不能实现读写。

就数据传输而言,与这两种设备方法相关的主要问题是需要在内核地址空间和用户地址空间之间传输数据。该操作不能以通常的方式通过指针执行,也不能通过memcpy执行。由于一些原因,用户空间地址不能直接在内核空间中使用。

内核空间地址和用户空间地址之间的一个重要区别是,用户空间中的内存可以交换出去。当内核访问一个用户空间指针时,相关的页面可能不会出现在内存中,并且会生成一个页面错误。即使在CPU在内核空间执行时,也能正确地处理页面错误。

另外,有趣的是,Linux 2.0的x86端口为用户空间和内核空间使用了完全不同的内存映射。因此,用户空间指针根本不能从内核空间取消引用。如果目标设备是一个扩展板而不是RAM,那么同样的问题就会出现,因为驱动程序必须在用户缓冲区和内核空间之间(也可能在内核空间和I/O内存之间)复制数据。

在Linux中,跨空间副本是通过中定义的特殊函数来执行的。这种复制可以通过通用(类似于memcpy)的函数执行,也可以通过针对特定数据大小(char、short、int、long)进行优化的函数执行。

scull中的读写代码需要将整个数据段复制到用户地址空间或从用户地址空间复制数据段。该功能由以下内核函数提供,这些函数复制任意的字节数组,并位于每次读写实现的核心:

字符设备驱动字符设备驱动
1 unsigned long copy_to_user(void *to, const void *from, unsigned long count);

View Code

字符设备驱动字符设备驱动
1 unsigned long copy_from_user(void *to, const void *from, unsigned long count);

View Code

参考链接:https://www.oreilly.com/library/view/linux-device-drivers/0596000081/ch03s08.html

Original: https://www.cnblogs.com/vivianwenwen/p/12665738.html
Author: 温昀
Title: 字符设备驱动

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585245/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在 IconFont 上获取图标资源的操作方法与感悟

    如何在 IconFont 上获取图标资源 阿里巴巴矢量图标库网站(https://www.iconfont.cn/)上提供了非常丰富的图标资源,包括 SVG、AI、PNG、字体图标…

    Linux 2023年6月7日
    097
  • Ubuntu Typora安装

    Ubuntn Typora安装 现在好像开始收费了,网上给的方法都是从官网下载的,感觉迟早不能用,因为要钱了 官网好像给的安装方法如下,可是好像不太好用 or run: sudo …

    Linux 2023年6月14日
    089
  • KMP分析证明

    引用后缀的目的: “ABBABA” 如果说ABA里面组成的AB是答案组成部分的开头,那么AB后面的字符一定是和模式串开头的第三个字符一样,如果不一样一定不是…

    Linux 2023年6月7日
    061
  • SDS Redis 自定义字符串底层结构

    1、什么是SDS? Redis 自定的字符串存储结构,关于redis,你需要了解的几点!中我们对此有过简要说明。 Redis 底层是用C语言编写的,可是在字符存储上,并未使用C原生…

    Linux 2023年5月28日
    077
  • Shell命令

    1.shell命令的执行机制:fork+exec执行命令(任何的shell都会执行) 2.shell中的用户输入处理 1 命令行参数:选项、参数 2 运行时输入 3 read命令:…

    Linux 2023年6月6日
    096
  • 运维开发之路:带你解剖html列表,一个看似简单而又不简单的知识点。

    HTML支持有序、无序和自定义列表,本篇笔者对这几个知识点进行剖析,跟紧步伐,我们一起出发吧! 无序列表 无序列表以ul标签开始,每个列表项都以li标签开始,无序列表是一个项目的列…

    Linux 2023年6月7日
    097
  • Haproxy

    Haproxy Haproxy haproxy简介 负载均衡 Haproxy搭建http负载均衡 lvnanhai、RS1、RS2都关闭防火墙和selinux RS1和RS2部署h…

    Linux 2023年6月6日
    086
  • 模板化的封装,降低业务代码开发

    复杂的问题,往往需要简单的逻辑; 一、业务背景 业务开发是一件复杂且耗时的工程,所以最近几年出了一个很火的概念叫做”低代码”开发,简单的说就是开发人员通过简…

    Linux 2023年6月14日
    085
  • 国产化之银河麒麟安装.NetCore-包管理器方式

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64、龙芯、飞腾、鲲鹏等。 考虑到这些基础产品对.NETCore的支持…

    Linux 2023年5月27日
    0113
  • 脚本小子学习–vulnhub靶机DC8

    @ 前言 一、环境搭建 二、目标和思路 三、实际操作 1.信息收集 2.getshell 总结 前言 通过一些靶机实战练习,学习使用现有的工具来成为脚本小子。 一、环境搭建 靶机:…

    Linux 2023年6月7日
    0125
  • VS 2010 LINK fatal error LNK1123转换到 COFF 期间失败 文件无效或损坏

    1. 解决LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 VS 2010 【LINK : fatal error LNK112…

    Linux 2023年6月13日
    079
  • 大数据——搭建第一台Hadoop主机

    工具准备 1、VMware 2、CentOS 7 最小安装版 3、远程工具推荐使用 FinalShell 安装系统 1、打开VMware,根据自己的情况配置好虚拟机,选择系统镜像就…

    Linux 2023年5月27日
    0105
  • JavaScript原型链

    <!doctype html> <html lang="en"> <head> <title>&#x53…

    Linux 2023年6月13日
    071
  • 05-ElasticSearch高级搜索

    * package com.coolman.hotel.test; import com.coolman.hotel.pojo.HotelDoc; import com.faste…

    Linux 2023年6月7日
    0100
  • 怎么实现Redis的高可用?(主从、哨兵、集群)

    高可用有两个含义: 一是数据尽量不丢失,二是保证服务尽可能可用。 AOF 和 RDB 数据持久化保证了数据尽量不丢失,那么多节点来保证服务尽可能提供服务。 一般在实际生产中,服务不…

    Linux 2023年5月28日
    084
  • Java的jinfo命令使用详解

    jinfo命令简介 jinfo(Java Virtual Machine Configuration Information)是JDK提供的一个可以实时查看Java虚拟机各种配置参…

    Linux 2023年5月27日
    097
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球