1.通过宏实现一个swap函数,不使用中间变量
#define swap(x,y) {(*x)=(*x)+(*y);(*y)=(*x)-(*y);(*x)=(*x)-(*y)}
2.字符设备和块设备的区别
块设备是随机的读取和写入设备的,而字符设备是按顺序读取和写入设备的
3.linux内核的启动过程
Vmlinux--->禁止FIQ,IRQ进入SVC(管理员)模式---->禁止cache---->开启MMU---->清除BSS段---->start_kernel---->inittab
head.S-->head-common.S---->main.c
4.设备驱动程序中如何注册一个字符设备
1.cdev_init
2.register_chrdev
5.什么是RCU
RCU(Read-Copy Update)在修改数据的时候,首先需要读取数据,然后生成一个副本,对副本进行修改,修改完成之后再将老数据update成新的数据
6.Linux 虚拟地址空间如何分布
只读段,数据段,堆,文件映射区域,栈,内核虚拟空间
7,字符型驱动设备怎么创建设备文件
mknod UDEV/MDEV devfs
8.设备驱动模型三个重要成员
总线、设备、驱动
9.kmalloc和vmalloc的区别
都是内核空间开辟内存,kmalloc函数申请的是物理连续地址,vmalloc分配的内存物理地址不一定连续
10.Kernel Panic常见原因
1.Linux在中断处理程序,2,内核堆栈溢出,或者指针异常访问,3,除0异常、内存访问越界、缓冲区溢出等错误,4,陷入死锁状态,自旋锁有嵌套使用,5,在线程中,存在死循环
11.用户进程间通信主要哪几种方式?
管道,FIFO,消息队列,信号量,共享内存
12.对Volatile关键字的理解
防止本条指令不会因编译器的优化而省略
13, 一个参数既可以是const还可以是volatile吗
加const的volatile可以是只读的寄存器
14,framebuffer机制
fb设备被抽象出来供用户态进程实现直接写屏。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。通过mmap调用把物理内存空间映射到用户空间
15.tasklet和workqueue区别
tasklet运行于中断上下文,不允许阻塞 、休眠,而workqueue运行与进程上下文,可以休眠和阻塞。
16.什么是软中断
产生后并不是马上可以执行,必须要等待内核的调度才能执行
17,自旋锁和信号量在互斥使用时需要注意哪些
使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠
18,驱动中操作物理绝对地址为什么要先ioremap
因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址
19,什么是mmap
一种内存映射文件的方法,将一个文件或者其它对象映射到进程的地址空间,这样对文件的操作而不必再调用read,write等系统调用函数
20,USB设备的枚举过程
1Get Device Descriptor 2Set Address 3Get Device Descriptor 4Configuration Descriptor 5Set Interface 6Set Conifguration
21,前序遍历,中序遍历,后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点。
前序遍历首先访问根结点然后遍历左子树,最后遍历右子树
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树
22,Linux的用户态与内核态的转换方法
syscall,procfs,netlink,ioctl