【linux内核分析与应用-陈莉君】字符设备驱动

article/2025/11/10 1:21:42

目录

 

1.什么是字符设备

2.如何来描述字符设备

3 struct cdev与const struct file_operations之间的关系

4.struct file_operations源码

5.字符设备驱动框架

6.编写字符设备驱动的步骤

7.字符设备结构

8.字符设备驱动程序的注册

9.从系统调用到驱动程序

10.用户空间与内核空间数据的传送

11.参考资料与思考问题


1.什么是字符设备

字符设备是指只能一个一个字节进行读写操作的设备,不能随机读取设备中的每一个数据,取数据要
按照先后次序来进行,字符设备时面向流的设备,常见的字符设备有:
鼠标,
键盘,
串口,
控制台,
led等.一般每一个字符设备或者块设备都会在dev目录下对应一个设备文件,Linux用户层程序通过设备文件来使用
驱动程序,操作字符设备或者块设备.

2.如何来描述字符设备

 

D:\005-代码\001-开源项目源码\004-内核源码\linux-4.15.1\linux-4.15.1\include\linux\types.h
typedef unsigned int __u32;
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t	dev_t;问题:为什么不直接写成 typedef unsigned int dev_t;D:\005-代码\001-开源项目源码\004-内核源码\linux-4.15.1\linux-4.15.1\include\linux\cdev.h
struct cdev {struct kobject kobj; // 内嵌的内核对象struct module *owner;// 该字符设备所在的内核模块(所有者)的对象指针const struct file_operations *ops;// 字符设备所能实现的操作表struct list_head list;// 用来将已经向内核注册的所有字符设备形成链表dev_t dev;//字符设备的设备号,由主设备号和次设备号构成(如果是一次申请多个设备号,此设备号为第一个),主设备号12位,次设备号20位unsigned int count; // 隶属于同一主设备号的次设备号的个数
} __randomize_layout;

3 struct cdev与const struct file_operations之间的关系

4.struct file_operations源码

E:\004-代码\002-内核源码\linux-4.15.1\linux-4.15.1\include\linux\fs.h
construct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);int (*iterate) (struct file *, struct dir_context *);int (*iterate_shared) (struct file *, struct dir_context *);unsigned int (*poll) (struct file *, struct poll_table_struct *);long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);long (*compat_ioctl) (struct file *, unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);unsigned long mmap_supported_flags;int (*open) (struct inode *, struct file *);int (*flush) (struct file *, fl_owner_t id);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, loff_t, loff_t, int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);int (*check_flags)(int);int (*flock) (struct file *, int, struct file_lock *);ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);int (*setlease)(struct file *, long, struct file_lock **, void **);long (*fallocate)(struct file *file, int mode, loff_t offset,loff_t len);void (*show_fdinfo)(struct seq_file *m, struct file *f);
#ifndef CONFIG_MMUunsigned (*mmap_capabilities)(struct file *);
#endifssize_t (*copy_file_range)(struct file *, loff_t, struct file *,loff_t, size_t, unsigned int);int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,u64);ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,u64);
} __randomize_layout;从源码中可以看出,每个字段都是一个函数,都是指向VFS层所调用的系统调用所对应的函数.

 

5.字符设备驱动框架

6.编写字符设备驱动的步骤

 

cdev_alloc()--动态申请或构造cdev内存
cdev_init() --初始化函数,初始化cdev的成员并且建立起cdev与file_operations之间的关联关系
cdev_add()  --注册cdev设备对象,也就是添加cdev对象到字符设备列表中
cdev_del()  --将cdev对象从系统中删除,也就是注销
cdev_put()  --释放cdev内存设备号的申请与释放
一个字符设备或者一个块设备都有一个主设备号和一个次设备号,主设备号用来标识与设备文件相连的
驱动程序,用来反映设备的类型,次设备号被驱动程序用来辨别操作的到底是哪一个设备,用来区分同类
型的设备,在这里给出三个宏和三个函数分别从设备号中提取主设备号和次设备号,将主设备号和次设
备号拼凑成设备号,静态地申请设备号,动态地申请设备号以及释放设备号.

7.字符设备结构

问题:struct char_device_struct与struct cdev有什么关系?

8.字符设备驱动程序的注册

这个cdrdevs就是字符设备表.

9.从系统调用到驱动程序

10.用户空间与内核空间数据的传送

11.参考资料与思考问题

 


http://chatgpt.dhexx.cn/article/gX5paLEQ.shtml

相关文章

微信小程序云数据库使用讲解

第一步:注册开通 单击云开发 第二步:创建数据库 选择数据库,并点击号创建一个集合 输入名字 创建完毕后点击添加记录即可添加数据 数据库获取: 查询: 查询指令:

微信小程序云开发入门-数据库插入数据(包含批量)

一、前言 文章将介绍如何在微信小程序云开发中向云开发数据库插入数据(单条或批量)。 写法有好几种,文章将会一一进行对比,看看每种写法之间有何优缺点,如何让代码看起来更优雅。 为了更加贴合实际的开发逻辑&#xf…

【微信小程序】如何获取微信小程序云开发数据库的数据并渲染到页面?

前言 上一篇博客我把微信小程序云开发数据库操作(增删改查)的实现方法都已经分享出来啦,可以戳链接进去阅读哦 【微信小程序】小程序云开发实现数据库增删改查(小白速度Get起来!!一步步教你如何实现) 基于微信小程序…

开发一个可以查询并显示数据库内容的微信小程序

使用微信开发者工具可以创建云数据库,并通过代码可以查询并在客户端显示数据库的内容。 附:小程序一个功能页面有wxml(客户端呈现),js(功能函数),json,wxss(个性化处理),这些是局部的文件。还有全局的文件如…

微信小程序开发---连接云开发数据库,实现数据获取

之前几篇博客里面都详细交代了如何配置云函数,现在就讲一下关于云函数中数据库的使用,主要是讲如何从云开发平台的数据库中调取数据 我们直接来到需要调用数据库数据的页面的js文件,直接设置全局变量,来便于后续调用数据库 const …

微信小程序查询数据库

微信小程序云开发的官方例子: const db wx.cloud.database() //获取数据库的引用 const _ db.command //获取数据库查询及更新指令 db.collection("china") //获取集合china的引用.where({ //查询的条件指令wheregdp: _.gt(3000) …

微信小程序云数据库操作

微信小程序云数据库操作 1、云数据库简介1.1 数据类型Date地理位置Null 1.2 权限控制 2、云数据库操作2.1 查询数据2.1.1 通过collection.doc获取一条记录2.1.2 通过collection.get获取所有记录的数据2.1.3 通过document.get获取某一条记录的数据2.1.4 通过collection.count获取…

微信小程序取本地数据库数据(实测有图)

测试效果如下: 本实验主要分为如下几个步骤: 一、安装数据库 二、安装PHPApache 三、编辑微信小程序代码 前两项的简单介绍在如下连接: PHPApache 四、本文主要介绍第三项的内容 需要用到的文件如下: 1、新建微信小程序工程 2、…

微信小程序云开发(数据库)

开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快…

微信小程序云开发(云数据库篇)

微信小程序云开发[云数据库篇] 云数据库关系型数据库和 JSON 数据库对比数据类型数据库操作联表查询事务处理 云数据库 云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象。 一个数据库可以有多个集合(相当…

微信小程序云开发 1 - 数据库

微信小程序云开发最重要的有两点: 1、云数据库; 2、云函数; 学会这两点基本就能够进行微信小程序的云开发; 首先,我们先看微信小程序云数据库的基本操作: 1)打开微 信开发者工具&#xff0…

微信小程序笔记 -- 数据库

6.15 学习微信小程序 -- 数据库 数据库1. 初始化2. 数据库操作2.1 数据类型2.2 增删查改2.2.1 增加/插入 数据(add方法)2.2.2 删除数据(remove方法)2.2.3 查看数据(get,where)2.2.4 更新数据&am…

nohup忽略SIGHUP信号

今天遇到一个问题:开启终端启动gunicorn进程后台运行,终端不关闭时,可以导入excel,关闭终端后,不能导入excel。原因是,xlrd模块需要向控制台输出内容,终端关闭后,控制台消失&#xf…

sighup问题

2019独角兽企业重金招聘Python工程师标准>>> SIGHUP会在以下3种情况下被发送给相应的进程: 1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程) 2、session首进程退出时&…

Linux——1、守护进程、SIGHUP与nohup

一、守护进程 脱离于终端并且在后台运行的进程,用于长期运行,守护自己的职责(如:监听端口、服务等)。 1、特点: 不受用户登录、注销影响。大多数Linux下的服务器都是利用守护进程实现的,如My…

Failed to ignore SIGHUP: No error

memcache下载:https://www.runoob.com/memcached/window-install-memcached.html 下载下来需要install一下: c:\memcached\memcached.exe -d install c:\memcached\memcached.exe -d start c:\memcached\memcached.exe -d stop 然后报错: 我下载的版本是1.4.5按照网上说的: 以…

安装Memcached:Failed to ignore SIGHUP: No error 解决方式

Memcached安装1.4.5 版本 管理员运行cmd,出现如下错误: 解决方式: 命令行中输入schtasks /create /sc onstart /tn memcached /tr "c:\memcached\memcached.exe -m 512",回车 注意:c:\memcached\memcached.exe替换自己…

系统信号(SIGHUP ,SIGPIPE,SIGURG)

对于信号的介绍,我再前面的一篇博客中做过专门的总结,感兴趣的可以看看。本文主要介绍在网络编程中几个密切相关的函数:SIGUP,SIGPIPE,SIGURG。 SIGHUP信号 在介绍SIGHUP信号之前,先来了解两个概念&#x…

PostgreSQL参数重载信号SIGHUP的处理

前边讲过,配置文件重载可以使用SIGHUP信号,也可以使用 pg_ctl reload,后者实际上也是发送SIGHUP给postmaster。 1、postmaster 的SIGHUP处理 下边的代码位于 src/backend/postmaster/postmaster.c 中的函数 SIGHUP_handler: erepo…

Unix/Linux编程:SIGHUP信号

当会话首进程打开了一个控制终端之后它同时也成为了该终端的控制进程;当一个控制进程失去其终端连接后,内核会向其发送一个SIGHUP信号来通知它这一事实(还会发送一个SIGCONT信号以确保当该进程之前被一个信号停止时重新开始该进程)。一般来讲&#xff0c…