【字符设备驱动接口函数】源码阅读char_dev.c

从零编写Linux字符设备驱动:内核模块实战与开发指南 最近在做一个嵌入式项目,需要为一块自定义的硬件板卡编写驱动程序。在查阅资料时,发现网上关于 Linux 驱动开发的教程要么过于理论,要么代码片段零散,很难直接上手实践。对于很多从应用层开发转向底层驱动的朋友来说,如何从零开始,写一个真正能加载、能运行的驱动程序,往往是第一个拦路虎。 本文将从一个最基础的“Hello World”式内核模块出发,手把手带你编写、编译、加载和卸载你的第一个 Linux 驱动程序。我们会深入理解内核模块的机制,并在此基础上,构建一个简单的字符设备驱动框架。无论你是嵌入式开发者,还 阅读详情
E:\004-代码\002-内核源码\linux-4.15.1\linux-4.15.1\fs\char_dev.c
/**
 * cdev_alloc() - allocate a cdev structure
 *
 * Allocates and returns a cdev structure, or NULL on failure.
 */
struct cdev *cdev_alloc(void)
{
	struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
	if (p) {
		INIT_LIST_HEAD(&p->list);
		kobject_init(&p->kobj, &ktype_cdev_dynamic);
	}
	return p;
}

/**
 * cdev_init() - initialize a cdev structure
 * @cdev: the structure to initialize
 * @fops: the file_operations for this device
 *
 * Initializes @cdev, remembering @fops, making it ready to add to the
 * system with cdev_add().
 */
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
	memset(cdev, 0, sizeof *cdev);
	INIT_LIST_HEAD(&cdev->list);
	kobject_init(&cdev->kobj, &ktype_cdev_default);
	cdev->ops = fops;
}




/**
 * cdev_add() - add a char device to the system
 * @p: the cdev structure for the device
 * @dev: the first device number for which this device is responsible
 * @count: the number of consecutive minor numbers corresponding to this
 *         device
 *
 * cdev_add() adds the device represented by @p to the system, making it
 * live immediately.  A negative error code is returned on failure.
 */
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
{
	int error;

	p->dev = dev;
	p->count = count;

	error = kobj_map(cdev_map, dev, count, NULL,
			 exact_match, exact_lock, p);
	if (error)
		return error;

	kobject_get(p->kobj.parent);

	return 0;
}

/**
 * cdev_del() - remove a cdev from the system
 * @p: the cdev structure to be removed
 *
 * cdev_del() removes @p from the system, possibly freeing the structure
 * itself.
 *
 * NOTE: This guarantees that cdev device will no longer be able to be
 * opened, however any cdevs already open will remain and their fops will
 * still be callable even after cdev_del returns.
 */
void cdev_del(struct cdev *p)
{
	cdev_unmap(p->dev, p->count);
	kobject_put(&p->kobj);
}


void cdev_put(struct cdev *p)
{
	if (p) {
		struct module *owner = p->owner;
		kobject_put(&p->kobj);
		module_put(owner);
	}
}

 

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

相关推荐

字符设备驱动程序实现读写功能

这是字符设备驱动的经典程序,globalmem可以实现对设备的读写操作,很有意思,希望大神们多多指教。

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

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

Jennifer1990的博客 626

Linux命令行入门:从零掌握服务器运维与Shell脚本基础

在信息化时代,操作系统是数字世界的基石,而终端命令行则是高效驾驭服务器的核心技能。无论是软件部署、服务监控还是故障排查,掌握基于Shell的指令操作都能大幅提升工程效率。从最基础的文件目录管理、文本处理,到权限控制、进程监控与网络调试,命令行提供了一套强大且可自动化的操作范式。尤其对于运维工程师和开发者而言,理解管道、重定向以及脚本化任务,意味着将重复劳动转化为可复用的自动化流程。本文从环境准备讲起,系统梳理常用Linux命令的实际场景与输出验证,并延伸至Shell脚本编写与定时任务,帮助初学者快速建立从操

weixin_30522983的博客 257

Linux0.11内核源码解析-char_dev.c

char_dev.c文件包括字符设备文件访问函数,主要是有rw_ttyx(),rw_tty(),rw_memory()和rw_char()函数,另外还有一个设备读写函数指针表。

weixin_38452632的博客 618

安装升级最新版本postman时遇到“无法定位程序输入点 SetDefaultDllDirectories于动态链接库KERNEL32.dll 上.”的问题

软件版本迭代更新真快,最近升级最新Postman版本时出现以下问题 我就简单纪录下解决办法: 备注:我用的是最新的postman工具包:Postman-win64-7.25.0-Setup.exe,目前是最新 0. 前提是已经到postman官网https://www.postman.com/downloads/下载好软件工具包 1.安装window7系统更新补丁KB2533623,请到微软公司官网https://support.microsoft.com/en-us/help/2...

董广明的博客 1万+

揭秘 C++ 性能优化的终极秘籍,让你面试时应答如流

VTune Amplifier 是英特尔开发的一款强大的性能分析工具,它可以深入分析应用程序在英特尔架构上的性能瓶颈。功能特点全面的分析视角:提供了多种分析模式,如热点分析、线程分析、内存分析等。热点分析模式能快速定位程序中最耗时的代码段;线程分析模式可帮助开发者了解多线程程序中线程的执行情况、同步开销等;内存分析模式则专注于内存访问的性能,包括缓存命中率、内存带宽使用等。硬件层面的洞察:能够深入到硬件层面,分析 CPU 的微架构指标,如指令级并行度、流水线停顿等。

大模型大数据攻城狮的专栏 1153

linux 0.11 内核学习 -- char_dev.c

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

记录、分享 1057

YOLOv5改进之---EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU

本文主要针对yolov5的iou损失函数进行改进,主要涵盖EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU这几种损失

qq_41920323的博客 1466

linux/fs/char_dev.c

/* * linux/fs/char_dev.c * * Copyright (C) 1991, 1992 Linus Torvalds */ #include <linux/init.h> #include <linux/fs.h> #include <linux/kdev_t.h> #include <linux/slab.h>...

好习惯成就伟大 679

【YOLOv11工业级实战】27. TensorRT量化实战:FP16/INT8极致加速!边缘设备YOLOv11推理速度提升4倍,精度损失控制在1.5%内

摘要:本文针对智慧园区200路摄像头实时分析的工业痛点——RTX 3080单卡仅能处理12路视频流(YOLOv11-nano FP32精度45FPS,需≥120FPS且精度损失≤3%),提供TensorRT量化完整解决方案。从原理解析(FP16/INT8精度差异与量化逻辑)到实操落地(ONNX转换、FP16引擎构建、INT8精细校准),全程给出可复用代码。实测显示:FP16量化后速度达128FPS(×2.8),精度损失0.2%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1721

YOLOv11改进策略【Neck】| 适用关键点检测:PSFM,深层语义融合模块 引入深层与浅层交叉注意力机制,动态建模不同层级的全局语义依赖关系

本文记录的是利用PSFM 模块改进 YOLOv11 的颈部融合部分,专门用于关键点检测。PSFM模块(Profound Semantic Fusion Module,深层语义融合模块) 通过在特征提取网络的深层引入跨模态交叉注意力机制,动态建模红外与可见光特征的全局语义依赖关系。本文将其应用到的颈部部分,融合深层与浅层特征,捕捉长距离语义关联,增强融合特征的判别性与场景理解能力,为检测头提供包含全局上下文的高层语义表示,从而提升模型在复杂场景下的目标检测准确率与语义推理鲁棒性。Rethinking the

Limiiiing的博客 652

Linux设备驱动开发实战指南:从内核模块到字符设备与中断处理

Linux设备驱动是连接硬件与操作系统的核心组件,它基于内核模块机制实现,通过file_operations结构体定义设备操作接口。其技术价值在于实现对硬件资源的统一抽象与管理,为上层应用提供标准化的访问方式。在嵌入式系统、物联网设备和服务器硬件支持等场景中,驱动开发是确保硬件功能正常工作的关键环节。本文围绕Linux设备驱动开发,重点解析字符设备驱动框架与中断处理机制,通过Fastbit Embedded Brain Academy的实战课程,系统讲解从环境搭建、模块编译到设备树配置与调试的全流程,帮助开

weixin_34364071的博客 522

物联网应用开发教程专栏介绍与说明——列表目录查阅(持续更新)

为方便查阅学习本专栏,特整理专栏介绍与说明及提供列表目录便于查阅。阿齐Archie《物联网应用开发教程》专栏。本专栏为物联网应用开发教程,将更新涵盖常见的WIFI、蓝牙、蜂窝网、以太网、Lora、NB-iot等物联网技术实战应用及详解其技术知识。专栏为技术文章,订阅一个文章即可本专栏内所有文章可看,实战开发,亲测无误,附视频演示效果,会持续更新本专栏。本专栏内有理论篇也有完整实战应用篇。

嵌入式阿齐Archie 2万+

Linux驱动开发入门:从Hello World到字符设备驱动实战

Linux内核模块是操作系统与硬件交互的核心组件,其本质是一种可动态加载到内核空间执行的代码。理解其工作原理,关键在于掌握内核模块的编译、加载机制以及内核与用户空间的安全数据交换。这项技术对于嵌入式系统、物联网设备开发具有极高的价值,它使得开发者能够为定制硬件编写专用接口,实现高效、稳定的底层控制。在具体应用场景中,字符设备驱动是最常见的形式之一,它通过文件操作接口(如open、read、write)为用户程序提供访问硬件的通道。本文聚焦于Linux驱动开发实践,通过一个完整的“内存字符设备”驱动项目,详细

weixin_33908217的博客 453

微信小程序 - 实现Java微信支付退款功能以及退款流程,微信小程序前端+java后端完整示例源码,微信小程序退款功能详解,小程序订单申请退款和退款回调方法、查询退款等(新版微信支付,详细示例代码)

微信小程序开发-微信支付退款功能以及退款回调方法,微信支付退款API详解,微信小程序支付V3(支付、退款)Java实现微信小程序开发 小程序支付开发-小程序退款功能,微信小程序小程序和公众号 退款功能教程(含申请退款和退款回调,退款回调地址在商户后台配置或者代码自定义)最新版微信小程序支付,退款问题,小程序支付和退款功能详解,小程序申请退款,小程序处理退款,微信小程序支付与退款java,微信小程序退款及回调,JAVA实现微信小程序支付退款功能,退款api调用报错,如何解决退款申请无响应,如何用实现小程序订单

🏆 前端领域优质创作者 4159

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux设备驱动开发入门:从字符设备到设备树实战

操作系统与硬件之间的桥梁是设备驱动,它负责让内核识别并控制外围硬件。在Linux系统中,驱动开发常从字符设备驱动框架入手,通过file_operations结构体实现读写接口,再借助内核模块动态加载。随着嵌入式平台复杂化,设备树与platform驱动成为现代驱动开发的主战场,实现了硬件描述与驱动代码的解耦。掌握Linux内核的同步机制、中断处理与调试技巧,并依托嵌入式Linux项目进行实战,能够高效定位问题并构建稳定可靠的驱动。无论是入门新手还是进阶工程师,理解这些基础原理与工程方法,都是通往高薪驱动开发岗

weixin_34150830的博客 323

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux设备驱动工程师入门:从字符设备框架到内核调试实战

在操作系统与硬件之间,设备驱动承担着承上启下的关键角色。Linux内核通过标准化的驱动模型,将五花八门的物理设备抽象为统一的文件接口,让应用层开发者可以像操作普通文件一样控制硬件。理解字符设备驱动的注册、file_operations实现、设备节点生成等核心机制,是掌握嵌入式底层开发的基石。驱动开发不仅涉及内核内存管理、并发同步等技术难点,还需要处理中断、DMA以及设备树等复杂场景。对于希望深入系统底层或转向嵌入式方向的开发者而言,掌握Linux内核提供的驱动框架,意味着打开了一扇通往高性能、高可靠性系统设

weixin_34186128的博客 336

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux驱动工程师:高薪背后的内核态、字符设备与学习路径

操作系统通过内核管理硬件资源,而设备驱动正是连接硬件与内核的桥梁,它运行在CPU特权模式下的内核态,与用户态完全隔离,这种机制保证了安全性却也带来了调试的复杂性。驱动工程师负责将硬件能力抽象为标准接口,其中字符设备框架是理解驱动工作原理的最佳切入口。随着嵌入式设备与服务器场景的迅猛发展,无论是ARM SoC还是高性能网卡,都离不开底层驱动的支持,这也使得掌握Linux驱动开发的人才变得稀缺,高薪自然水到渠成。从内核态与用户态差异、字符设备实现、场景分化及学习路径等角度,能够清晰剖析驱动工程师的真实面貌。

weixin_30235225的博客 401

Linux SPI设备驱动开发实战:从设备树到字符设备驱动

SPI(Serial Peripheral Interface)是一种高速、全双工的同步串行通信总线,广泛应用于嵌入式系统连接传感器、存储芯片等外设。其工作原理基于主从架构,通过时钟、数据线和片选信号实现设备间通信。在Linux内核中,SPI子系统通过分层设计(核心层、控制器驱动层、协议驱动层)和驱动模型,实现了硬件操作的抽象与统一管理,极大提升了代码复用性和系统可移植性。设备树(Device Tree)作为现代嵌入式Linux的硬件描述标准,将硬件配置从内核代码中解耦,通过编写dts节点定义SPI控制器、

weixin_33826609的博客 513

Linux内核驱动开发——字符设备与杂项设备驱动

字符设备:流式,按字节访问,无固定块大小,随机访问不要求;块设备:按固定大小块(扇区,512B)访问,必须经过内核块缓存,支持随机读写。 tags 索引文件(ctags) tags 是源码符号索引文件,由生成,Vim/Neovim 用来快速跳转到函数、结构体、宏、变量的定义,阅读 Linux 内核、STM32、i.MX6ULL 这类大工程源码必备进入源码根目录执行: Vim 核心跳转命令 快捷键 / 命令 功能 光标放在符号上,跳转到定义

2401_82879595的博客 194

Linux设备驱动开发入门:从内核模块到字符设备与设备树

在嵌入式与物联网时代,Linux设备驱动是连接软件与硬件的关键桥梁。理解内核模块的加载机制、字符设备框架以及设备树匹配原理,是驱动开发的三大基石。设备驱动不仅涉及寄存器操作与中断处理,更需掌握并发同步与内核调试手段,其稳定性直接影响整个系统表现。从PC上的QEMU模拟环境到真实开发板,循序渐进地开展驱动实验,可有效提升工程实践能力。该领域技术栈广泛应用于消费电子、汽车电子与工控场景,人才缺口大、薪资高,但入行门槛也高。本文从基础概念出发,梳理驱动开发的核心原理与实战方法,帮助初学者避开常见陷阱,系统性构建L

weixin_34406086的博客 436

嵌入式Linux驱动开发实战:从字符设备到安卓HAL全链路

设备树作为硬件描述与内核驱动解耦的关键机制,让同一份驱动代码可适配不同板卡,是嵌入式Linux工程实践中的核心概念。其原理是通过compatible属性实现设备节点与平台驱动的自动匹配,而字符设备框架则提供了用户空间访问硬件的统一接口。理解这两者的协作关系,是解决I2C、SPI等外设驱动移植问题的技术基础。在安卓体系下,从内核驱动到HAL再到JNI的全链路贯通,还涉及并发控制、中断管理和稳定性排查等工程难点。以真实项目路线,拆解从设备树配置、平台驱动编写到安卓侧联调的全过程,为驱动开发面试中的高频追问提供可

weixin_34174422的博客 177

Linux驱动开发入门:从字符设备到硬件操作实战指南

在计算机系统中,设备驱动是连接硬件与操作系统的核心软件层,负责将硬件功能抽象为操作系统可识别的接口。其工作原理基于对硬件寄存器的直接操作、中断处理以及遵循内核提供的驱动框架模型。掌握驱动开发技术对于深入理解操作系统内核、提升系统性能与稳定性具有重要价值,广泛应用于嵌入式设备、服务器、移动终端等场景。本文聚焦Linux驱动开发,通过剖析字符设备驱动框架,结合GPIO、中断处理等实战案例,系统讲解如何从零构建一个完整的设备驱动。文中将深入探讨并发控制、内存管理等关键机制,并融入设备树、平台驱动等现代Linux驱

weixin_34269583的博客 338

Linux设备驱动开发核心路径:从字符设备到设备树与内核同步

操作系统通过设备驱动程序与硬件交互,驱动运行在内核态,负责将硬件能力抽象为统一接口。字符设备是驱动学习的起点,设备树则实现了硬件描述与驱动代码的分离,配合platform驱动模型,可高效匹配硬件资源。并发与中断处理是驱动稳定性的关键,自旋锁、互斥锁等同步机制决定了多核环境下的数据安全。在工业控制、物联网终端、车载电子等嵌入式Linux场景中,驱动质量直接影响系统可靠性。理解内核框架、掌握设备树配置、熟悉中断与同步机制,是嵌入式开发的进阶基石。围绕驱动开发的学习路线,结合LED等典型实例,梳理从环境搭建到问题

weixin_33802505的博客 318

从内核模块到字符设备:Linux设备驱动开发的关键能力与学习路径

Linux系统编程不仅是命令行的操作与运维,更是深入操作系统内核的工程实践。内核模块作为驱动开发的最小单元,其编译、加载与调试流程是理解系统运行模型的基础。字符设备通过file_operations与设备文件关联,揭示了Unix“一切皆文件”的核心抽象。真正的挑战在于驱动运行时的上下文切换、并发访问控制以及内存与硬件资源的精细管理,这些能力决定了驱动能否从“跑通示例”走向“稳定交付”。在嵌入式开发、物联网终端及服务器外设驱动场景中,掌握这些技术能够帮助开发者构建高效可靠的内核服务。本文围绕驱动开发中的环境搭

weixin_34075268的博客 368

Linux设备驱动开发实战:从内核模块到字符设备驱动入门指南

设备驱动程序是操作系统内核与硬件设备通信的核心软件组件,它通过定义标准的接口和操作集,将硬件功能抽象为文件或系统调用,供上层应用程序使用。其工作原理基于内核模块的动态加载机制和文件操作结构体,实现了用户空间与内核空间的安全数据交换。掌握驱动开发技术对于嵌入式系统定制、内核功能扩展和性能优化具有重要价值,尤其在物联网、工业控制和消费电子等领域应用广泛。本文以Linux字符设备驱动为例,结合Makefile编译和内核模块加载等热词,详细解析了从环境搭建、代码编写到编译测试的完整实战流程,为开发者提供了一条清晰的

weixin_30633405的博客 412
上一篇: 【linux内核分析与应用-陈莉君】字符设备驱动
下一篇: 【linux内核分析与应用-陈莉君】动手实践-编写字符设备驱动程序
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值