1. 字符设备与块设备区别
(1)字符设备:提供连续的数据流,应用程序可以顺序读取,通常不支持随机存取。相反,此类设备支持按字节自/字符来读写数据。键盘、串口、调制解调器都是典型的字符设备。
(2)块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘、CD-ROM驱动器和闪存都是典型度的块设备,应用程序可以寻址磁盘上的任何位置,并由此读取数据。此外,数据的读写知只能以块(通常是512B)的倍数进行。与字符设备不同,块设备并不支持基于字符的寻址。
这两种类型的设备的根本区别在于它们是否可以被随机访问。字符设备只能顺序读取,块设备可以随机读取。
2. 查看字符设备信息命令
lsmod和modprobe
3. modprobe和insmod
modprobe和insmod都可以实现加载模块。
区别一:modprobe可以解决模块间依赖的问题,比如A模块使用了符号导出,导出的符号需要在B模块中使用,这就要求在加载模块时需要先加载模块A再加载模块B,在insmod的情况下会给报错,而用modprobe则会在/lib/modules/$(shell uname -r)/目录下去寻找依赖模块。
区别二:,现在需要加载模块A,而模块A已经加载过了,已经存在了,使用insmod再次加载会报错,而使用modprobe加载模块A就不会有错误提示
4. 注册字符设备方法
void cdev_init(struct cdev *cdev, struct file_operations *fops);
int register_chrdev(unsigned int major, const char *name, struct file_operations *fops);
5. ioremap函数作用
ioremap将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问。
void *ioremap(unsigned long phys_addr, unsigned long size)
入口: phys_addr:要映射的起始的IO地址;
size:要映射的空间的大小;
6. 设备驱动程序三个重要概念总线bus, 设备device, 驱动driver,三者关系
总线将设备和驱动绑定。在系统注册一个设备的时候,会寻找与之匹配的驱动;
同样,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线自动完成
7. insmode回调用什么函数?rmmode呢
insmode会调用module_init函数, 做一些初始化,
rmmode会调用module_exit函数,会释放内存
8. 有哪些原子操作
void atomic_inc(atomic_t *v)
void atomic_dec(atomic_t *v)
void atomic_add(int i, atomic_t *v)
void atomic_sub(int i, atomic_t *v)
int atomic_dec_and_test(atomic_t *v);
对原子类型的变量v原子地减1,并判断结果是否为0,如果为0,返回真,否则返回假。
int atomic_inc_and_test(atomic_t *v);
对原子类型的变量v原子地增加1,并判断结果是否为0,如果为0,返回真,否则返回假。
int atomic_add_negative(int i, atomic_t *v);
对原子类型的变量v原子地增加I,并判断结果是否为负数,如果是,返回真,否则返回假。
int atomic_add_return(int i, atomic_t *v);
对原子类型的变量v原子地增加i,并且返回指向v的指针。
9. spinlock和semaphore差异
(1)spinlock不能睡眠,semaphore可以
(2)spinlock可以用在中断处理程序(或上半部分),semaphore 不可以
(3)spinlock尽量短,semaphore无此限制
10.mmap作用
mmap将一个文件或者其它对象映射进内存,mmap()必须以PAGE_SIZE为单位进行映射,而内存也只能以页为单位进行映射
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);
int munmap(void* start,size_t length);
11. tasklet、workqueue区别
tasklet中断上下文,不可睡眠,softirq特殊实现
workqueue进程上下文,可以睡眠,内核线程实现
tasklet 更适合执行短小、不耗时的任务,而 workqueue 更适合执行较为耗时的任务。
12. kmalloc, vmalloc区别
kmalloc物理内存连续,虚拟内存也连续;vmalloc物理内存不一定连续,虚拟内存连续
kmalloc分配内存小, vmalloc分配的大
kmalloc快,vmalloc慢
kmalloc slab内存分配机制,vmalloc是buddy机制
13. I2C
数据线SDA, 时钟SCL
空闲时都是高电平, SCL稳定在高电平时,SDA由高到低产生一个开始位,由低到高产生一个停止位。开始位和停止位都是由主设备产生。
在传输过程前,主设备先发送1字节的地址信息,7bit是设备地址,1bit是读写标志
之后每次传输的数据也是1个字节,从MSB开始传输。
在每个字节传完后,在SCL的第9个上升沿到来之前,接收方应该发出1个ACK
14. SPI
SCLK, SI,SO, CS(低电平有效)
15. USB
半双工 低速1.5Mbit/s, 全速12Mbit/s 高速480Mbit/s VBUS, D+,D-,Groud
全双工 USB3.0(super speed) 5Gbit/s,增加4个引脚
四种传输方式:
控制ccontrol
同步Isochronous
中断 Interrupt
批量Bulk
设备device,配置Configuration,接口Interface, 端点Endpoint