6.3 Linux 驱动开发 设备驱动
一、主设备号和次设备号的用途?
主设备号:标识设备类型;并区分不同的设备驱动程序。
次设备号:标识同一类型设备中的不同个体。驱动程序依据次设备号来设置具体的设备。
二、字符驱动设备怎样创建设备文件?
1、手动创建
mknod /dev/led c 250 0 //指令 设备节点 字符设备类型 主设备号 次设备号
2、自动创建
在字符设备驱动程序里面使用 class_create 和 device_create 来创建设备类和设备实例。
三、设备驱动程序如何注册一个字符设备?
dev.cdev.owner = THIS_MODULE; cdev_init(&dev.cdev, &device_fops); /* 初始化 cdev 结构体变量 */ cdev_add(&dev.cdev, dev.devid, 1); /* 添加字符设备到内核 */ void cdev_init(struct cdev *cdev, struct file_operations *fops) //该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于file_operations结构(可以是file_operations结构,但不限于该结构)的指针。
四、/dev/ 下面的设备文件是怎么创建出来的?
1、mknod
2、udev 机制中的 class_create()、device_create()
五、Linux设备中字符设备和块设备有什么主要区别?分别举例。
两者本身并没有严格区分,只是基于功能进行了分类。
字符设备:提供连续的数据流,应用程序可以按顺序读取,但不支持随机存取,这类设备按字节来传输数据。
块设备:应用程序可以随机访问设备数据,数据的读写只能按块(通常是 512 字节)的整数倍进行。
六、驱动中操作物理绝对地址为什么要先 ioremap?
ioremp 是内核中用来将外设寄存器物理地址映射到主存,。为什么非要映射呢,因为保护模式下的 cpu 只认虚拟地址,不认物理地址,给它物理地址它并不帮你做事,所以你要操作外设上的寄存器必须先映射到虚拟内存空间,拿着虚拟地址去跟 cpu 对接,从而操作寄存器。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++/嵌入式开发 秋招面经 文章被收录于专栏
一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

