insmod一个驱动模块和rmmod一个驱动模块各会执行模块中的哪个函数?
卸载驱动出现异常一般是什么问题引起的?
insmod调用init函数,rmmod调用exit函数。
卸载模块时出现卸载失败是因为存在进程正在使用模块。
copy_to_user()和copy_from_user()主要用于实现什么功能?
一般用于file_operations结构的哪些函数里面?
copy_to_user()用于完成内核空间到用户空间的复制,copy_from_user()用于完成用户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存数据交换作用的函数。
主设备号和次设备号的用途是什么?
如果执行mknod chartest c 4 64,创建chartest设备。请分析chartest使用的是那一类设备驱动程序。
主设备号标识设备对应的驱动程序。
次设备号由内核使用,用于正确确定设备文件所指的设备。
设备驱动程序中如何注册一个字符设备?分别解释它的几个参数的含义。
void cdev_init(struct cdev *cdev, struct file_operations *fops)
该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于file_operations结构(可以是file_operations结构,但不限于该结构)的指针。
int register_chrdev(unsigned int major, const char *name , struct file_operations *fopen)
该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这是只限于file_operations结构)。对于register_chrdev的调用将为给定的主设备号注册0-255作为次设备号,并为每个设备建立一个对应的默认cdev结构。
Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。
字符设备:串口、鼠标、键盘。块设备:U盘、SD卡。
字符设备和块设备的区别在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。
malloc(), vmalloc()和kmalloc()区别?
kmalloc和vmalloc分配的是内核内存,malloc分配的是用户内存。
kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大。
Linux 中有哪几种设备?
字符设备和块设备。
网卡是例外,他不直接与设备文件对应,mknod 系统调用用来创建设备文件。
字符设备驱动程序的关键数据结构是哪个?
字符设备描述符 struct cdev,cdev_alloc()用于动态的分配 cdev 描述符,cdev_add()用于注册一个 cdev 描述符,cdev 包含一个 struct kobject 类型的数据结构它是核心的数据结构
自旋锁和信号量在互斥使用时需要注意哪些?
中断服务程序里面的互斥使用的是自旋锁还是信号量?还是两者都能用?
使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。
中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的。
linux中的同步机制?spinlock与信号量的区别?
linux中的同步机制:自旋锁、信号量、读写锁、循环缓冲区 。
spinlock在得不到锁的时候,程序会循环访问锁,性能下降。
信号量在得不到锁的时候会休眠,等到可以获得锁的时候,继续执行。
编写字符设备驱动的一般流程?
① 确定主设备号,也可让内核分配
② 定义自己的file_operations结构体
③ 实现对应的drv_open/drv_read/drv_write等函数,填入file_operations结构体
④ 把file_operations结构体告诉内核:register_chrdev
⑤ 安装驱动程序时,调用入口函数注册驱动程序
⑥ 卸载驱动程序时,出口函数调用unregister_chrdev
⑦ 其他完善:提供设备信息,自动创建设备节点:class_create, device_create
说明中断分成上半部分和下半部分的原因,为何要分?如何实现?
中断分成上半部分和下半部分主要是因为内核要保证内核中进程的正常调度和运行。
顶半部完成尽可能少的比较紧急的功能,底半部就由tasklet或者工作队列的方法实现。
定义和初始化
struct tasklet_struct tlet;
tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
参数
第一个:定义的tasklet变量
第二个:函数
第三个:数据 传递给回调函数的数据
定义函数
void jit_tasklet_fn(unsigned long arg)
//中断的底半部 执行该函数的时候,已经出中断了
printk("in jit_tasklet_fn jiffies=%ld\n",jiffies);}
在需要调度的地方调用以下函数
tasklet_schedule(&tlet);
一般在中断函数当中调度在不晚于下一个时钟滴答之前执行
Linux中的用户模式和内核模式是什么含义?
在Linux机器上,CPU要么处于受信任的内核模式,要么处于受限制的用户模式。
除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。
模块和应用程序分别运行在什么空间?
模块运行在内核空间,应用程序运行在用户空间。
用户进程间通信主要哪几种方式?
管道、命名管道、信号、消息、共享内存、信号量、套接字。
Linux 虚拟文件系统的关键数据结构有哪些?(至少写出两个)
struct super_block,struct inode,struct file,struct dentry;
对文件或设备的操作函数保存在哪个数据结构中?
struct file_operations
Linux 中的文件包括哪些?
执行文件,普通文件,目录文件,链接文件和设备文件,管道文件。
模块程序能否使用可链接的库函数?
模块程序运行在内核空间,不能链接库函数。
设备驱动程序包括哪些功能函数?
open(),read(),write(),llseek(),realse()
查看驱动模块中打印信息应该使用什么命令?
如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?
1) 查看驱动模块中打印信息的命令:dmesg
2) 查看字符设备信息可以用lsmod 和modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的模块。
3) 显示当前使用的中断号cat /proc/interrupt
Linux中引入模块机制有什么好处?
首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结束。
换句话说,模块初始化函数的任务就是为以后调用函数预先作准备。
1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却必须仔细此撤销初始化函数所作的一切。
2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。
字符型驱动设备怎么创建设备文件?
手动创建:mknod /dev/led c 250 0 其中dev/led 为设备节点 c 代表字符设备 250代表主设备号 0代表次设备号
还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。在 /etc/init.d/rcS 脚本文件中会执行 mdev -s 自动创建设备节点。
关键字static的作用是什么?
驱动里面为什么要有并发、互斥的控制,如何实现?