![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux设备驱动程序
Linux内核远航者
探索Linux内核的奥秘,涉及处理器架构,内存管理,进程管理,容器和虚拟化等底层干货分享,当沉浸在庞大的内核源代码中难免会迷失自己,但参透某个子系统的设计思想时又会欣喜若狂,Linux内核远航者乘风破浪,在探索的道路上唯有热爱可抵岁月漫长。
展开
-
通用(内核)链表详解
Linux内核中充斥着大量的数据结构,这些数据结构很多都是使用结构体来表示:如cdev结构体用于描述一个字符设备,再如task_struct结构体,是我们所说的进程控制块PCB,用于描述一个进程的所有信息。追寻内核源码我们会发现很多都是表示设备的结构体中都有list_head这样的字段,没错这就是内核链表的节点类型。描述设备的结构体中只要包含这个字段,内核就能通过链表来管理我们的设备,试想浩瀚的内核原创 2016-12-31 16:21:52 · 9122 阅读 · 2 评论 -
驱动中使用内核链表
前面我们详细介绍了如何实现内核链表,实际上内核中已经为我们实现了内核链表,给我提供了一些操作内核链表的API,接下来我们将在驱动模块中使用内核链表。原创 2016-12-31 17:02:37 · 501 阅读 · 0 评论 -
内核中inode结构体
在介绍inode结构体之前先做一个链接文件的实验: 1.创建一个普通的文件test.txt,并写入内容查看,如下 2.创建test.txt的硬链接文件,并测试如下: 3.创建test.txt的软连接文件并测试,如下: 4.ls命令查看文件相关信息,如下: 根据现象可以发现,test.txt文件的硬链接文件test_hardlink的inode号和原文件一样,而它的软链接文件原创 2017-12-27 15:16:10 · 7704 阅读 · 0 评论 -
字符设备的内核抽象
Linux内核中处处体现面向对象的设计思想,为了统一形形色色的设备,Linux系统将设备分为三类:字符设备、块设备、网络设备。并将其分别抽象为struct cdev,struct block_device,struct net_devce三个对象,具体的设备都可以包含着三种对象从而继承和三种对象属性和操作,并通过各自的对象添加到相应的驱动模型中,从而进行统一的管理和操作。 顾名思义,字符设备驱动程原创 2017-12-29 10:03:44 · 270 阅读 · 0 评论 -
字符设备cdev的分配和初始化
我们知道注册字符设备首先要有已经分配并初始化好的的cdev,那么就需要内核提供的接口cdev_alloc和cdev_init。下面我们来看看着两个接口是如何实现的: 设备驱动程序中可以使用两种方式来产生struct cdev对象。一种是静态定义的方式,一种是在程序执行期间通过动态分配方式产生: 1.静态定义 static struct cdev chr_dev; 2.动态分配 static原创 2017-12-29 10:43:25 · 637 阅读 · 0 评论 -
Linux字符设备驱动模型--字符设备的注册
当我们编写字符设备驱动程序的时候,在进行字符设备对象cdev的分配、初始化,设备号的注册这些初始化阶段之后,就可以将它加入到系统中,这样才能使用这个字符设备。将一个字符设备加入到系统中调用的函数时cdev_add,内核源码如下:int cdev_add(struct cdev *p, dev_t dev, unsigned count){ p->dev = dev; p->coun原创 2017-12-29 15:51:52 · 472 阅读 · 2 评论 -
Linux设备号的构成和分配内核机制
我们知道“Linux下一切皆文件”(当然由于历史原因,网络设备除外,它是通过socket进行操作的),我们操作设备都要通过文件进行操作也就是所所谓的操作设备文件节点,但是在Linux内核中是使用设备号来唯一的识别和管理设备,就相当于公民的省份证号码一样(其实吧,计算机还是喜欢数字的像标识进程使用进程的PID,管理用户使用UID,管理磁盘上的文件使用的inode号,管理网络中的计算机使用IP地址等等)原创 2017-12-29 14:59:17 · 2127 阅读 · 1 评论