设备驱动程序学习笔记(1)

1. 主从设备号是用一个32位的整数(dev_t)来表示,这个整数的高12位表示主设备号,后面20位表示从设备号,内核定义了一些宏来转换:

#define MINORBITS 20

#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))

#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))

#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))


2. 注册,管理设备

用kobj_map来管理和跟踪各个设备:

// drivers/base/map.c

struct kobj_map {
struct probe {
struct probe *next;
dev_t dev;
unsigned long range;        //从设备号的连续范围
struct module *owner;
kobj_probe_t *get;
int (*lock)(dev_t, void *);
void *data;        //根据设备的不同,data分别指向字符设备cdev和块设备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)调用register_chrdev_region或alloc_chrdev_region来分配设备号的范围

2)调用如下两个函数进行注册

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

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

块设备直接调用一个函数即可以注册:

int register_blkdev(unsigned int major, const char *name);


4. 字符设备的操作

<cdev.h>

struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;        //从设备数
};
字符设备的打开:

在第一次打开一个设备文件时,用fs_devices.c里面的通用函数chrdev_open打开,并根据设备号查找得到cdev实例,同时关联inode和cdev实例,最后调用驱动程序提供的file_operations里的open函数做一些初始化的工作。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux设备驱动程序是用于控制和管理硬件设备的软件模块。学习Linux设备驱动程序可以帮助开发人员理解和掌握Linux内核的工作原理,以及如何编写和调试设备驱动程序。 以下是一些学习Linux设备驱动程序笔记和建议: 1. 理解Linux设备模型:Linux设备模型是一种用于管理设备的框架,它提供了一种统一的方式来表示和操作设备学习Linux设备模型可以帮助你理解设备的注册、初始化和销毁过程。 2. 学习字符设备驱动程序:字符设备是一种以字节为单位进行读写的设备,如串口、终端等。学习字符设备驱动程序可以帮助你了解字符设备的打开、关闭、读写等操作,并学习如何实现设备文件的注册和操作。 3. 学习设备驱动程序:块设备是一种以块为单位进行读写的设备,如硬盘、闪存等。学习设备驱动程序可以帮助你了解块设备的分区、缓存、IO调度等操作,并学习如何实现块设备的注册和操作。 4. 学习中断处理:中断是设备向处理器发送信号的一种机制,用于通知处理器设备的状态变化。学习中断处理可以帮助你了解中断的注册、处理和释放过程,并学习如何编写中断处理程序。 5. 学习设备驱动程序的调试技巧:设备驱动程序的调试是一个重要的技能,可以帮助你快速定位和解决问题。学习设备驱动程序的调试技巧可以帮助你理解和使用调试工具,如 printk、kprobe等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值