》lsmod时会执行驱动中的init函数,rmmod时会执行驱动程序中的exit函数。init函数中申请的资源要在rmmod中释放。
》mknod结合主设备号与从设备号可以创建一个设备文件
》0~3G用户空间,3~4G是内核空间
》内核的内存申请函数
Kmalloc:分配的内存在物理上是连续的,能分配的内存较小
Vmalloc:分配的内存在虚拟地址上是连续的,能分配的内存较
》驱动中如何操作物理地址:使用ioremap
》设备驱动模型三个重要成员是:总线、设备、驱动;
》中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?
上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工作,这构成矛盾,所以Linux有所谓的bottom half机制,中断处理程序中所有不要求立即完成的,在开中断的环境下,由底半程序随后完成.
Linux的底半处理实际上是建立在内核的软中断机制上的
》线程同步和进程同步:自旋锁和信号量(互斥锁)
》自旋锁和信号量有什么区别:
》字符设备和块设备的区别:
》Linux的用户态与内核态的通信方式:
Linux下内核空间与用户空间进行通信的方式主要有syscall(system call)、procfs、ioctl和netlink等。
syscall:一般情况下,用户进程是不能访问内核的。它既不能访问内核所在的内存空间,也不能调用内核中的函数。Linux内核中设置了一组用于实现各种系统功能的子程序,用户可以通过调用他们访问linux内核的数据和函数,这些系统调用接口(SCI)称为系统调用;
procfs:是一种特殊的伪文件系统 ,是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就可以简单直接的通过echo或cat这样的文件操作命令对系统信息进行查取;
netlink:用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能;
ioctl:函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。