linux驱动学习(五) char dev总结

Linux 设备文件简介 概述 设备管理是 Linux 中比较基础的知识,与内核的关系也比较密切。随着 Udev 的广泛使用,Linux 发行版的智能程度越来越高,许多 Linux 新用户对 /dev 目录下的东西变得不再熟悉,有时候遇见问题就会抓狂。 Linux 中的设备按照存取方式的不同,可以分为两种: 字符设备无缓冲且只能顺序存取块设备有缓冲且可以随机(乱序)存取 而按照是否对应物理实体,也可以分为两种: ... 阅读详情

原文地址:http://blog.youkuaiyun.com/ghostyu/article/details/6902139

回顾


装载模块到正运行的内核和移除模块

#include<linux/ini.h>

module_init();

module_exit();


用于指定模块的初始化和清除函数的宏

__init

__exit

__initdata

__exitdata


#include<linux/sched.h>

最重要的头文件之一,该文件包含驱动程序使用的大部分内核api函数的定义,包含睡眠函数以及各种变量声明。

struct task_current *current;//当前进程

current->pid //进程id

current->comm //命令名


#include<linux/version.h>

内核版本信息


#include<linux/module.h>

必须 的头文件,必须包含在模块源代码中


#include<linux/moduleparam.h>

模块参数

module_param(variable,type,perm);


#include<linux/kernel.h>

int printk(const char * fmt,...)

container_of(pointer, type, field)

一个方便使用的宏,它用于从包含在某个结构中的指针获得结构本身的指针


#include<linux/fs.h>

文件系统头文件,它是编写设备驱动程序的必需的头文件

int register_chrdev_region(dev_t first, unsigned int count, char *name)

first 是要分配的设备编号范围的起始值,first的次设备号经常被设为0,但对函数来将并不是必须的,count 是所请求的连续设备编号的个数,常设为1,如果count非常大,那请求的范围内可能和下一个主设备重迭,name是和该编号范围关联的设备名称,他讲出现在sysfs中

和大部分内核函数一样,register_chrdev_region返回值在分配成功时为0,错误情况下返回一个负的错误码,

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

dev为输出的参数,firstminor是要使用的被请求的第一个次设备号,通常是0,count 与name 同上

void unregister_chrdev_region(dev_t first, unsigned int count);


#include<linux/cdev.h>

初始化、注册字符设备

void cdev_init(cdev *cdev, struct file_operations *fops);

初始化分配到的结构

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

告诉内核该cdev结构的信息

void cdev_del(struct cdev *dev)


#include<linux/types.h>

dev_t 表示设备编号的数据类型

int MAJOR(dev_t dev)

int MINOR(dev_t dev)

获取主次编号

dev_t MKDEV(unsigned int major, unsigned int minor)

由主次编号构造dev_t数据项


struct file_operations;

struct file;

struct inode;

大多数设备驱动都会用到的三个数据结构,

file_operations结构保存字符设备驱动程序的方法

file结构表示一个打开的文件

inode结构表示磁盘上的文件


#include<asm/uaccess.h>

内核代码和用户空间之间移动数据的函数

unsigned long copy_from_user(void *to, const void *from, unsigned long count);

unsigned long copy_to_user(void *to, const void *from, unsigned long count);


linux 内核字符驱动char_dev源码分析 内核模块中字符驱动代码写的相当精简,提供了字符驱动的各种管理功能主要代码位于fs\char_dev.c文件中,分析该模块代码可以主要从两方面入手: 字符设备号管理:主要提供设备号注册申请等功能 基于kobj管理:主要通过kobj_map结构将open等操作与fops操作相关联以及设备添加 上述代码主要分为两个部分,笔者估计是和历史遗留有关系,因为dev的驱动模型早于sysfs设备管理模型,后来引入sysfs模型管理之后将fops以及设备管理等功能基于kobj管理进行了重构,个人认为可以将字符设备管 阅读详情

相关推荐

如何在驱动代码中中/dev目录内自动创建

在<linux /dev>文章中指出,一般驱动加载之后,需要根据申请到的字符设备号通过使用mknod命令将相对应使用到的字符驱动挂载到/dev目录内,这套方法使用起来非常麻烦,那么又没有一套简单的方法在驱动加载完毕之后就自动创建好/dev相对应的目录? 答案是当然有 自动创建/dev目录 使用自动创建/dev目录,一个前提是使用的linux系统需要安装udev功能,<linux kobject-uevent(热插拔事件)>,提到内核可以使用netlink功能 将内核中的事件通知

weixin_42730667的博客 913

Linux驱动——字符设备驱动基本框架和相关内容详细说明

在Linux系统中通常把驱动分成三类: 字符设备驱动、块设备驱动、网络设备驱动,关于三种设备设备驱动的相关定义如下: 字符设备:只能一个字节一个字节的读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后顺序进行。字符设备是面向流的设备,常见的字符设备如鼠标、键盘、串口、控制台、LED等。 块设备:是指可以从设备的任意位置读取一定长度的数据设备。块设备如硬盘、磁盘、U盘和SD卡等存储设备。 网络设备:网络设备比较特殊,不在是对文件进行操作,而是由专门的网络接口来实现。应用程序不能直接访问网络设备

没实力的码农写的渣渣博客 1870

软件工程期末知识点总结【超详细】

生命周期模型(过程模型):瀑布模型、快速原型模型、增量模型、螺旋模型、喷泉模型。2、实体联系图:1、数据对象2、属性3、联系(1:1、1:N、M:N)3、语句覆盖 就是设计足够的调试用例,使得程序中的每个语句至少执行一次。 5、判定覆盖就是设计足够的测试用例,使得程序中每个判定的取“真”分支和取“假”分支至少都执行一次,判定覆盖又称分支覆盖 6、条件覆盖就是设计足够的测试用例,使得程序判定中的每个条件能获得各种可能的结果。7、软件开发时期通常分成4个阶段:总体设计、详细设计、编码和单元测试、综合测试。

这个人好有趣....hh 1万+

linux系统目录详解

linux系统目录详解1. /bin文件夹相关1.1 /bin1.2 /sbin1.3 /usr/bin1.4 /usr/sbin1.5 /PATH/TO/SOME/BIN(/usr/local/bin)1.6 /PATH/TO/SOME/SBIN(/usr/local/sbin)2. /boot文件夹2.1 /boot/config-2.6.18-194.17.1.el5文件2.2 /boot/...

梦在哪里的博客 3096

谷歌Gemini模型免费API调用全攻略:从注册到实战(附代码示例)

本文详细介绍了如何免费调用谷歌Gemini模型的API,从注册获取API密钥到实战应用的全过程。内容涵盖环境准备、基础API调用、多模态处理、高级功能及生产环境实践,帮助开发者高效利用Gemini模型进行代码生成和复杂任务处理。附有代码示例,适合AI开发者和技术爱好者。

weixin_29212429的博客 1601

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3137

linux驱动学习(五)之字符设备

linux驱动学习(五)之字符设备

ckg3824278的博客 1304

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

linux驱动 不创建dev,字符设备驱动,但是在/dev下没有相应的设备

在网上找到解决办法有两种,手动mknod创建一个设备或者自动生成一个设备。具体代码如下1.添加头文件#include2.修改函数intVirtualDisk_init(void),添加“自动创建设备”,代码如下:structclass*virtual_disk_class; /*byyinhf.*//*设备驱动模块加载函数*/intVirtualDisk_init(void){...

weixin_31226805的博客 1747

OpenCvSharp之利用海康相机采集图像并在pictureBox中显示

OpenCvSharp之利用海康相机采集图像并在pictureBox中显示 说明:OpenCvSharp版本为4.0 海康相机为黑白相机 实现功能:将海康相机采集的图像转成Mat,并在pictureBox中显示。 示例代码: Mat srcImage; private Mat CaptureImage() { int nRet; //MyCamera.MVCC_I...

Kevin_Sun777的博客 5501

python pyusb与硬件 下位机通信

python pyusb 与硬件 下位机 通讯

yuhang01的博客 951

Linux驱动开发——(十一)INPUT子系统

介绍了Linux内核中input子系统的内容及其代码。

wJen的博客 4455

Windows报无法成功完成操作,因为文件包含病毒或潜在的垃圾软件的解决方法

Windows报无法成功完成操作,因为文件包含病毒或潜在的垃圾软件的解决方法 在Windows的搜索框中输入Windows安全中心,搜索到后将其打开 点击病毒和威胁防护将鼠标移动到Microsoft Defender防病毒选项处,将定期扫描打开 下滑找到管理设置 先关闭篡改防护,再点击添加或删除排除项 先点击添加排除项,再点击文件,选择报出异常的文件,将其添加到排除项中,过程中会存在跳框确认,皆点击确定,完成后就可以运行报无法成功完成操作,因为文件包含病毒或潜在的垃圾软件异常的文件

123 2万+

linux字符设备驱动程序源码(char_dev.c)分析

问题:应用程序如何通过一个字符设备文件找到对应的字符设备? 本文主要分析linux-2.6.28内核版本的字符设备抽象层源码文件char_dev.c。该文件代码量不大,但其为linux应用程序访问实际字符型硬件设备搭建了桥梁,进一步限定了linux字符设备驱动的设计框架。 1 // 初始化kobj_map结构时填充的回调函数成员 2 static s...

Jennifer1990的博客 626

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

罗克韦尔AB PLC_FactoryTalk无法登录的解决方法

Robot_PLC_HMI_Automation 3575

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

嵌入式Linux驱动开发 02:将驱动程序添加到内核中

在实际使用中将驱动代码放在内核代码中,并将驱动编译到内核中也是比较常见的选择,这篇文章将此进行介绍。

Naisu的各种笔记 6190

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[Linux]学习笔记系列 -- [drivers]char

Linux字符设备驱动模型是UNIX/Linux系统中处理面向字节流设备的传统方案。该技术起源于UNIX"一切皆文件"的设计哲学,主要解决终端、打印机等流式设备的统一抽象问题。其核心原理是通过主/次设备号将设备节点与内核驱动关联,借助VFS层实现标准文件I/O操作。 主要优势包括:提供标准统一的API、简单直观的设计、通过ioctl实现灵活控制。典型应用场景包括串行通信、伪设备、硬件控制接口等。但不适用于需要随机访问的存储设备或基于数据包的网络设备。 相比块设备,字符设备缺乏通用缓冲层和

wdfk-prog.space 1193

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Linux内核驱动调试:从printk到dev_*日志工具的演进与实战

在Linux内核与驱动开发中,日志系统是调试与问题诊断的核心基础设施。其基本原理是通过在内核代码中插入信息输出点,将程序运行状态、变量值及错误信息记录到环形缓冲区或控制台,供开发者分析。传统的printk函数虽然基础,但在复杂的多设备系统中会产生大量混杂信息,导致关键数据被淹没,且同步输出可能影响系统性能。为解决这些问题,Linux内核引入了面向设备模型的dev_*系列日志函数,如dev_info、dev_err和dev_dbg。这些工具通过自动绑定设备标识(如驱动名、PCI地址),极大提升了日志的可过滤性

weixin_34414650的博客 402

linux内核/dev/null的实现

使用linux的人对于/dev/null这个设备并不会陌生,通常用于将程序的输出信息扔掉,如果不指定>/dev/null,将会输出到当前控制台,那么它是如何实现的呢?了解驱动编程的人看下面的结构体都知道,file_operations 对应的是libc中read write llseek等函数在驱动中的实现。/dev/null是一个字符型设备,它的驱动代码位于 drivers/char/mem.c中。外部进行读取的时候,会调用read_null函数,此处直接返回读取的长度是0,什么也没读到。

闲人的专栏 1722

linux 0.11 内核学习 -- char_dev.c

/* *  linux/fs/char_dev.c * *  (C) 1991  Linus Torvalds */ #include #include // 定义了基本的系统数据类型 #include #include // 含有一些内核常用函数的原形定义 #include #include  /* 中断读 */extern

记录、分享 1057

图解linux char驱动

图解linux char驱动 在写字符驱动的时候需要使用内核提供的cdev_add()函数来想kobj_map添加自己的cdev结构体. 1.当执行完cdev_add()函数之后.我们最终形成的结构如上.它是一个hash链表结构. 那么hash值是谁呢.这个hash只提取的是一个主设备号,最大值254. 2.在添加新的设备的时候.我们会先使用主设备号

shaohuazuo的专栏 2081

Linux驱动_INPUT子系统

按键、鼠标、键盘、触摸屏等都属于输入设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息, input 核心层负责处理这些事件。 input子系统框架如图所示: 这三个层的分工如下: 驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。 核心层:承上启下...

qq_42174306的博客 1325
上一篇: linux驱动学习(四) linux字符设备驱动 cdev
下一篇: linux驱动学习(六) 应用中的linux驱动 platform_device
July_Yang
博客等级 码龄15年 46粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值