linux驱动没活干_linux驱动面试题整理

这篇博客整理了Linux驱动开发面试中常见的问题,涵盖了设备文件创建、中断处理、自旋锁与信号量的使用、内存分配、系统调用、设备驱动模型等方面。通过实例解释了如何创建和管理设备文件、中断服务程序设计注意事项、并发控制机制以及Linux内核中的同步机制。还讨论了字符设备和块设备的区别,并给出了编写Shell脚本实现系统启动时自动加载、异常退出后自动重启以及超过一定次数重启后自动复位操作系统的示例。
摘要由CSDN通过智能技术生成

1、字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件?

答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件。

评:这只是其中一种方式,也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。那么在系统启动期间还有devfs创建了设备文件。一共有三种方式可以创建设备文件。

2、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?答:中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。评:写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。第二:中断服务程序中不能有阻塞操作。为什么?大家可以讨论。

第三:中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL之类的。

3、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行?答:原子操作指的是无法被打断的操作。我没懂第二句是什么意思,自己定义一个变量怎么可能标记资源的使用情况?其他进程又看不见这个变量评:第二句话的意思是:定义一个变量,比如 int flag =0;if(flag == 0){flag = 1;操作临界区;flag = 0;

}这样可否?

5、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?答:insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

评:要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。

6、在驱动调试过程中遇到过oops没?你是怎么处理的?

7、ioctl和unlock_ioctl有什么区别?

8、驱动中操作物理绝对地址为什么要先ioremap?答:因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址。

9、设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有先后顺序没?

10、linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些?

11、linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内存概念?

12、linux中中断的实现机制,tasklet与workqueue的区别及底层实现区别?为什么要区分上半部和下半部?

13、linux中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函数)?

14、linux中的同步机制?spinlock与信号量的区别?

15、linux中RCU原理?

16、linux中软中断的实现原理?

17、linux系统实现原子操作有哪些方法?

18、MIPS Cpu中空间地址是怎么划分的?如在uboot中如何操作设备的特定的寄存器?

19、linux中系统调用过程?如:应用程序中read()在linux中执行过程即从用户空间到内核空间?

20、linux内核的启动过程(源代码级)?

21、linux调度原理?

22、linux网络子系统的认识?

23、linux内核里面,内存申请有哪几个函数,各自的区别?

Kmalloc()   __get_free_page()  mempool_create()

24. IRQ和FIQ有什么区别,在CPU里面是是怎么做的?

25. 中断的上半部分和下半部分的问题:讲下分成上半部分和下半部分的原因,为何要分?讲下如何实现?

上半部分执行与硬件相关的处理要求快, 而有些驱动在中断处理程序中又需要完成大量工作,这构成矛盾,所以Linux有所谓的bottom half机制,中断处理程序中所有不要求立即完成的,在开中断的环境下,由底半程序随后完成.

Linux的底半处理实际上是建立在内核的软中断机制上的.

Linux 的底半 机制主要有Tasklet 和 work queue 以及 softirq ( 2.4内核则有BH , Task queue ,

softirq , tasklet 没有work

queue),其实底半可以理解成一种工作的延迟。所以实际使用时跟timer机制基本上一个意思。

26. 内核函数mmap的实现原理,机制?

mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。

27. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对 共 享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions) 。 解决竞态问题的途径是保证对共享资源的互斥访问, 所谓互斥访问就是指一个执行单 元 在访问共享资源的时候,其他的执行单元都被禁止访问。 访问共享资源的代码区域被称为临界区, 临界区需要以某种互斥机 制加以保护, 中断屏蔽, 原子操作,自旋锁,和信号量都是 linux 设备驱动中可采用的互斥途径。

28. spinlock自旋锁是如何实现的?

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。

这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

29. 任务调度的机制?

30. 嵌入式linux和wince操作系统的特点和特性?

31. 嵌入式linux中tty设备驱动的体系结构?

32. 嵌入式设备,为加快启动速度,可以做哪些方面的优化?

33. USB设备的枚举过程?

(1) Get Device Descriptor。主机的第一个命令要求得到设备描述符,此SETUP 包为8

个字节数据(80,06,00,01,00,00,40,00),发向地址0,端口0。“40”表示返回数据长度最大为40H

个字节。实际上,只返回一个包,即数组DEV_DESC[ ]中的前8 个字节,用于说明设备的描述符的真实长度和设备的类型。

(2) Set

Address。接着是设置设备地址处理事件,主机发送一个含有指定地址的数据包(00,05,02,00,00,00,00,00),在主机只有一个USB

设备的时候,这个地址一般会是2,最大地址127,USB 协议中可以连接127

个设备。设置地址事件处理结束后,设备进入地址状态,主机以后会在新的指定地址处访问设备。

(3) Get Device Descriptor。主机再次发送请求得到设备描述符的数据包(80,06,00,01,00,00,12,00),与上次不同的是,要求的数据的长度是实际的数据长度,同时是发送到Set Address命令所设置的地址。

(4) 读取全部Configuration Descriptor。接着主机要求得到设备全部的配置描述符、接口描述符和节点描述符(80,06,00,02,00,00,40,00),由于主机不知道设备描述符的真实长度,因此它要求得到64个字节。

(5) Set Interface,主机发送数据包(01,0B,00,00,00,00,00,00),设置接口值为0。

(6) Set Conifguration,确定USB设备工作在哪一个配置下。对于U盘设备来说,一般只有1个配置值,其值为01。主机发送数据包(00,09,01,00,00,00,00,00)。

(7) 如果以上步骤都正确,主机将找到新设备,并且配置成功,该设备可以正常使用,可以进行后续的U盘枚举过程了。

(8) 用busHound观察计算机对于U盘的枚举过程,发现上述步骤后还有一个GetMaxLun的操作,但是实际上对于U盘来说忽略该步骤也没有问题。

34. PSRAM、SDRAM、DDR、DDR2的时序特性?

35.什么是GPIO?

general purpose input/output

GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。

也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。如果没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可采取的方案是使用CPLD来帮助管理。

36.触摸屏的硬件原理?

触摸屏的主要三大种类是:电阻技术触摸屏、 表面声波技术触摸屏、 电容技术触摸屏。

电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏, 这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化金属

(ITO氧化铟,透明的导电电阻) 导电层,上面在盖有一层外表面硬化处理、光滑防擦的塑料层 、它的内表面也涂有一层ITO涂层

、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘

。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器侦测到这一接触并计算出(X,Y

)的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。

表面声波技术是利用声波在物体的表面进行传输,当有物体触摸到表面时,阻碍声波的传输,换能器侦测到这个变化,反映给计算机,进而进行鼠标的模拟。

电容技术触摸屏利用人体的电流感应进行工作 。用户触摸屏幕时 ,由于人体电场,用户和触摸屏表面形成以一个耦合电容, 对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流

37.在Linux C中,ls这个命令是怎么被执行的?

使用fork创建一个进程或exec函数族覆盖原进程。

38.在一个只有128M内存并且没有交换分区的机器上,说说下面两个程序的运行结果

1

#define MEMSIZE 1024*1024

int count = 0;

void *p = NULL;

while(1) {

p = (void *)malloc(MEMSIZE);

if (!p) break;

printf("Current allocation %d MB\n", ++count);

}

2

while(1) {

p = (void *)malloc(MEMSIZE);

if (!p) break;

memset(p, 1, MEMSIZE);

printf("Current allocation %d MB\n", ++count);

}

第一道程序分配内存但没有填充,编译器可能会把内存分配优化掉,程序死循环;第二道,程序分配内存并进行填充,系统会一直分配内存,直到内存不足,退出循环。

39.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

搞的比较复杂。主要思想就是a-b的值的最高位是否为0;但是又得考虑整数溢出的问题,所以很复杂。不知道哪位大侠有更好的办法,指点指点。

#include

#define ZHENG(i)((i>> 31)== 0)

#define FU(i)((i>> 31)!= 0)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值