驱动开发期末复习手册


客观题

  1. Linux使用mknod命令创建设备节点

  2. Linux使用mkdir命令创建目录文件

  3. Linux使用mkfifo命令来创建管道文件(管道的本质就是队列,先进先出)

  4. Linux设备驱动主要分为:字符设备块设备网络设备(其主要的区别在于字符设备是按照字节流来处理数据,不支持随机存取,典型字符设备有鼠标键盘等;块设备顾名思义,处理数据是按块空间来处理的,支持随机存取,也可以顺序存取,典型的设备有磁盘EEPROM等;网络设备,因其特点在于对网络协议的处理以及网络数据包的封包和拆包而归类,典型设备:网卡

  5. Linux驱动模块的后缀名为:.ko

  6. Linux下常用系统调用名,系统调用实际也是VFS层提供的功能
    (其调用流程就是,在我们调用open函数时,调用的是glibc的open函数,产生SWI中断,使得CPU进入到SVC模式,进而调用VFS的do_sys_open函数)
    read:读取设备
    open:打开设备
    close:关闭设备
    lseek:偏移设备
    注意:fopen\fwrite不是系统调用,是标准IO,其产生的主要原因在于通过开辟一块缓冲区,使得减少系统调用,提高效率和节省资源

  7. platform_driverplatform_device在总线匹配成功后,执行platform_driver中指定的probe函数(platform_driver就是驱动,plateform_device就是设备,一个描述如何操作硬件设备,一个描述该硬件的属性信息(寄存器地址,引脚等等))

  8. Linux通过ioremap(注意是,不是函数)实现物理地址到虚拟地址的映射

  9. 设备树被内核识别后,会在/sys目录下为用户提供可视化操作接口

  10. Linux的miscdevice(混杂设备:就是无法归类的设备)的主设备号为10

  11. printk打印内核信息时,以信息级打印应设置KERN_INFO前缀(更改printk打印优先级 echo 1 4 1 7 > /proc/sys/kernel/printk ;前缀有很多,大家自行百度)

  12. 设备树定义节点时,定义资源的属性名是reg(其实最重要的资源就是寄存器物理地址,所以我认为reg就是register)

  13. 实现内核空间拷贝到用户空间的接口名:copy_to_uer(不知道与mmap的机制是否有关系,但是有机会会详细研究一下)

  14. 内核提供cdev结构体描述字符设备,cdev_init是绑定设备与file_operations结构体cdev_add是向内核添加/注册你的驱动,主次设备好cdev_del是从内核移除,因为内核总是认为我的东西在污染它,事实也确实是这样!!!

  15. 内核模块源码可以配置为编译进进内核和以模块编译的方式(没毛病,你在对应的kconfig文件中,将你的驱动源码设置为tristate三态的意思,-m就是以模块的方式编译-y就是编译进内核-n就是不编译

  16. 内核模块的入口函数需要通过module_init进行注册到内核(√)

  17. Linux字符设备和块设备独占主设备号(√)(其实主设备号就是用来指定使用那一套驱动程序的,而次设备号的作用是来区分同一类物品的多个东西,比如两个LED)

  18. Linux设备号中主设备号为12位(√)(对应次设备号就是20位)

  19. 内核模块通过insmode命令来实现用户空间向内核空间加载驱动;

  20. 使用kmalloc函数在内核空间申请内存,使用malloc函数在用户空间申请内存

  21. 内核platform总线设备是一种虚拟的设备驱动(√)(并不是真的硬件设备,只是platform_driver和platform_deivce匹配的机制像一条线两边,所以就类比到芯片上的总线一样,但并不是芯片中那样真实存在的总线)

  22. 内核通过sysfs文件系统导出内核设备模型

  23. Linux内核的虚拟内存是3G-4G空间

  24. 使用wait_event接口将当前访问进程设置位等待状态

主观题

驱动Makefile框架

#体系结构
ARCH :=
#编译链前缀
CROSS_COMPILE :=
# 要编译的内核目录
KERNEL_DIR ?=
#应用程序测试代码
SOURCE :=
TARGET :=
all:
	make -C $(KERNEL_DIR) M=`pwd` modules
	$(CROSS_COMPILE)gcc -o $(TARGET) $(SOURCE)
.PHONY:clean
clean:
	make -C $(KERNEL_DIR) M=`pwd` modules clean
	rm -rf $(TARGET)
# 驱动源文件
obj-m += 驱动源文件名.o  
# 如果你需要多个文件生成驱动文件
# xxx-y :=yyy.o zzz.o aaa.o
# obj-m +=xxx.o

驱动程序模块相关

  1. 模块加载函数,通过insmod命令来加载内核,模块的加载函数会自动被内核执行,完成本模块相关的初始化工作。(用modeprobe也可以加载,区别就是modeprobe会解决驱动模块依赖的问题)
  2. 模块卸载函数,通过rmmod命令来卸载某模块,被调用执行
  3. 模块许可证声明,使用MODULE_LICENSE配置GPL的声明
  4. 可选模块参数、模块导出符号表、模块作者信息等声明

编写global_memory的open函数

static int mem_open(struct inode *node, struct file *fp)
{
	struct mem_dev *dev;
	//通过子类找基类
	dev = container_of(node->i_cdev,struct mem_dev, cdev);
	//得到文件描述符,就可以操作该设备了
	fp->private_data = dev;
	return 0;
}

编写一个最简单的驱动

驱动程序从下网上写与看

#include <linux/module.h>
#include <linux/init.h>

static __init int hello_init(void)
{
	printk("Hello world\n");
	return 0; //必须返回0
}

static __exit void hello_exit(void)
{
	printk("GoodBye\n");
	return;
}
module_init(hello_init);
module_init(hello_exit);
MODULE_LICENSE("GPL");
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jacky~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值