linux内核源码分析之设备驱动
目录
一、I/O 体系结构
二、与外设的交互
1、I/O端口:
2、I/O内存映射
3、轮询和中断
三、驱动分类
四、注册
五、与文件系统关联
六、资源管理
七、结构体总结
一、I/O 体系结构
- 必须根据具体的设备类型和模型,使用各种方法对硬件寻址
- 内核必须向用户应用程序和系统工具提供访问各种设备的方法
- 用户空间需要知道内核中有哪些设备可用
二、与外设的交互
1、I/O端口:
在这种情况下,内核发送数据给 I/O 控制器。数据的目标设备通过唯一的端口号标识,数据被传输到设备进行处理。
2、I/O内存映射
3、轮询和中断
三、驱动分类
wolfgang@meitner> ls -l /dev/sd{a,b} /dev/ttyS{0,1}
brw-r-----1 root disk 8, 0 2008-02-21 21:06 /dev/sda
brw-r-----1 root disk 8, 16 2008-02-21 21:06 /dev/sdb
crw-rw----1 root uucp 4, 64 2007-09-21 21:12 ttyS0
crw-rw----1 root uucp 4, 65 2007-09-21 21:12 ttyS1
- 访问权限前的字母是b或c,分别表示块设备和字符设备
- 设备文件没有文件长度,而增加了另外的两个值,分别是主设备号和从设备号。
四、注册
struct kobj_map {struct probe {struct probe *next;dev_t dev;//设备号unsigned long range;//设备号的范围struct module *owner;//提供设备驱动程序的模块kobj_probe_t *get;//指向可以返回与设备关联的kobject实例int (*lock)(dev_t, void *);void *data;//字符设备指向 struct cdev实例;块设备 指向struct genhd实例} *probes[255];struct mutex *lock;
};
static struct char_device_struct {struct char_device_struct *next;unsigned int major;//主设备号unsigned int baseminor;//baseminor是包含minorct个从设备号的连续范围中最小的从设备号int minorct;char name[64];//标识struct cdev *cdev; /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];
3、设备号
1)动态静态设备号申请
int register_chrdev_region(dev_t from, unsigned count, const char *name)
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name);
void cdev_init(struct cdev *cdev, const struct file_operations *fops);
int cdev_add(struct cdev *p, dev_t dev, unsigned count);

五、与文件系统关联
1、 inode中的设备文件成员
虚拟文件系统中的每个文件都关联到一个inode,用于管理文件属性。inode与驱动程序有关的成员如下:
struct inode { ... dev_t i_rdev; //标识与一个设备文件关联的设备... umode_t i_mode; ... struct file_operations *i_fop; //一组函数指针的集合... union { ... struct block_device *i_bdev; struct cdev *i_cdev; }; ...
};
2,标准文件操作
void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
{inode->i_mode = mode;if (S_ISCHR(mode)) {inode->i_fop = &def_chr_fops;inode->i_rdev = rdev;} else if (S_ISBLK(mode)) {inode->i_fop = &def_blk_fops;inode->i_rdev = rdev;} else if (S_ISFIFO(mode))inode->i_fop = &pipefifo_fops;else if (S_ISSOCK(mode)); /* leave it no_open_fops */elseprintk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"" inode %s:%lu\n", mode, inode->i_sb->s_id,inode->i_ino);
}
EXPORT_SYMBOL(init_special_inode);
3,字符设备的标准操作
struct file_operations def_chr_fops = { .open = chrdev_open,
};
struct cdev { struct kobject kobj; //一个嵌入在该结构中的内核对象,它用于该数据结构的一般管理struct module *owner; //指向驱动程序的模块const struct file_operations *ops; //硬件通信的具体操作struct list_head list; dev_t dev; //设备号unsigned int count;
};
六、资源管理
struct resource { resource_size_t start; //start和end类型为unsigned long,指定了一个一般性的
区域resource_size_t end; const char *name; unsigned long flags; //用于更准确地描述资源及其当前状态struct resource *parent, *sibling, *child; //父子兄弟之间关系
};
//资源请求
static struct resource * request_resource(struct resource *root,
struct resource *new);//资源释放
void release_resource(struct resource *old)
七、结构体总结
上述介绍的结构体在内核中的使用如下
内核启动start_kernel到kobj_map注册
参考:
《深入理解linux内核》
linux内核源码分析之设备驱动相关推荐
- linux内核源码分析 - nvme设备的初始化
[好文推荐] 浅析linux内核网络协议栈--linux bridge 深入理解SR-IOV和IO虚拟化 virtio-net 实现机制[一](图文并茂) 驱动的加载 驱动加载实际就是module的加 ...
- iostat IO统计原理linux内核源码分析----基于单通道SATA盘
iostat IO统计原理linux内核源码分析----基于单通道SATA盘 先上一个IO发送submit_bio流程图,本文基本就是围绕该流程讲解. 内核版本 3.10.96 详细的源码注释:htt ...
- Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7)【转】...
原文地址:Linux内核源码分析--内核启动之(4)Image内核启动(setup_arch函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://blog.c ...
- Linux内核源码分析《进程管理》
Linux内核源码分析<进程管理> 前言 1. Linux 内核源码分析架构 2. 进程原理分析 2.1 进程基础知识 2.2 Linux进程四要素 2.3 进程描述符 task_stru ...
- Linux内核源码分析方法—程序员进阶必备
一.内核源码之我见 Linux内核代码的庞大令不少人"望而生畏",也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是 ...
- Linux内核源码分析—从用户空间复制数据到内核空间
Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...
- v67.03 鸿蒙内核源码分析(字符设备) | 绝大多数设备都是这类 | 百篇博客分析OpenHarmony源码
曾子曰:"君子以文会友,以友辅仁." <论语>:颜渊篇 百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 绝大多数设备都是这类 文件系统相关篇 ...
- Linux内核源码分析之内存管理
本文站的角度更底层,基本都是从Linux内核出发,会更深入.所以当你都读完,然后再次审视这些功能的实现和设计时,我相信你会有种豁然开朗的感觉. 1.页 内核把物理页作为内存管理的基本单元. 尽管处理器 ...
- 【技术分享篇】Linux内核——手把手带你实现一个Linux内核文件系统丨Linux内核源码分析
手把手带你实现一个Linux内核文件系统 1. 内核文件系统架构分析 2. 行行珠玑,代码实现 [技术分享篇]Linux内核--手把手带你实现一个Linux内核文件系统丨Linux内核源码分析 更多L ...
最新文章
- Jmeter之Bean shell使用(五)
- DCMTK:创建,编写和读取细分对象
- java xml字符串提取元素,如何从Java中将子元素从XML提取到字符串?
- linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本
- 顺序队列,循环队列,链队列
- 云图说|威胁检测服务赐您“火眼金睛” ,让潜在威胁无处遁行
- 浅析 C++智能指针和 enable_shared_from_this 机制
- 蓝桥杯 ADV-105 算法提高 不同单词个数统计
- 经典人生感悟 看看你少了那一条
- NVIDIA-CUDA编程初探
- Chrome 扩展程序——FireShot:网页截图工具
- H5 canvas制作数字连线效果
- 虚拟摄像头(拉rtsp流或桌面作为图像源)
- 618手机争夺战:5G时代首场大考,荣耀再度领跑
- ASK调制的matlab代码
- 腾讯云API与国家气象局API获取实时天气
- 机器学习- MACHINE LEARNING
- android应用中自动化埋点的实现,Android 自动化埋点方案
- 数据库系统概念 引言(一)
- Flag壁纸生成器诞生记
热门文章
- 安排CCleaner系统清理
- php热图,科学网—使用ComplexHeatmap包绘制个性化热图 - 刘永鑫的博文
- 炼丹志 | 2021显卡挑选指南
- 为什么华为手机总有不明照片?赶紧查看一下这3个功能,尽快关闭
- [Oracle]-[OCP]-申请纸质版OCP证书
- linux python优势_来讲讲 Julia胜于Python的5个优势
- 世界上排名前100的英文歌详细名单及介绍
- java 游戏管理系统_从零开始实现放置游戏(三):后台管理系统搭建
- 集成ci jenkins_使用jenkins fastlane第1 2部分将ci cd集成到多个环境中
- Angelababy 首攻好莱坞 获封最闪亮新星