linux驱动工程师面试题整理.docx

上传人:b****6 文档编号:8504442 上传时间:2023-01-31 格式:DOCX 页数:21 大小:254.36KB
下载 相关 举报
linux驱动工程师面试题整理.docx_第1页
第1页 / 共21页
linux驱动工程师面试题整理.docx_第2页
第2页 / 共21页
linux驱动工程师面试题整理.docx_第3页
第3页 / 共21页
linux驱动工程师面试题整理.docx_第4页
第4页 / 共21页
linux驱动工程师面试题整理.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

linux驱动工程师面试题整理.docx

《linux驱动工程师面试题整理.docx》由会员分享,可在线阅读,更多相关《linux驱动工程师面试题整理.docx(21页珍藏版)》请在冰豆网上搜索。

linux驱动工程师面试题整理.docx

linux驱动工程师面试题整理

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

序打开使用的文件?

答:

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

评:

这只是其中一种方式,也叫手动创建设备文件。

还有UDEV/MDE自动创建设备文件的方式,UDEV/MDE是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,

运行在用户态意味着系统要运行之后。

那么在系统启动期间还有devfs创建了设备文件。

共有三种方式可以创建设备文件。

2、写一个中断服务需要注意哪些?

如果中断产生之后要做比较多的事情你是怎么做的?

答:

中断处理例程应该尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后

半段。

评:

写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬

件信息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。

也就是中断上

半部和下半部。

第二:

中断服务程序中不能有阻塞操作。

为什么?

大家可以讨论。

第三:

中断服务程序注意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的

OKFAIL之类的。

3、自旋锁和信号量在互斥使用时需要注意哪些?

在中断服务程序里面的互斥是使用自旋锁还是信号量?

还是两者都能用?

为什么?

答:

使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。

中断服务例程中的互斥使用

的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。

4、原子操作你怎么理解?

为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行?

答:

原子操作指的是无法被打断的操作。

我没懂第二句是什么意思,自己定义一个变量怎么

可能标记资源的使用情况?

其他进程又看不见这个变量

评:

第二句话的意思是:

定义一个变量,比如intflag=0;

if(flag==0)

{

flag=1;

操作临界区;

flag=0;

}这样可否?

5、insmod一个驱动模块,会执行模块中的哪个函数?

rmmod呢?

这两个函数在设计上要注

意哪些?

遇到过卸载驱动出现异常没?

是什么问题引起的?

答:

insmod调用init函数,rmmod调用exit函数。

这两个函数在设计时要注意什么?

卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁

的问题。

评:

要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工作队列等等。

也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。

9、设备驱动模型三个重要成员是?

platfoem总线的匹配规则是?

在具体应用上要不要先注

册驱动再注册设备?

有先后顺序没?

 

12、linux

中中断的实现机制,tasklet与workqueue的区别及底层实现区别?

为什么要区分上半部和下半部?

19、linux

核空间?

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

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

18、MIPSCpu中空间地址是怎么划分的?

如在uboot中如何操作设备的特定的寄存器?

中系统调用过程?

如:

应用程序中read()在linux中执行过程即从用户空间到内

 

内核里面,内存申请有哪几个函数,各自的区另

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

25.中断的上半部分和下半部分的问题:

讲下分成上半部分和下半部分的原因,为何要分?

讲下如何实现?

上半部分执行与硬件相关的处理要求快,而有些驱动在中断处理程序中又需要完成大量工

作,这构成矛盾,所以Linux有所谓的bottomhalf机制,中断处理程序中所有不要求立即完成的,在开中断的环境下,由底半程序随后完成「

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

没有workqueue),其实底半可以理解成一种工作的延迟。

Linux的底半机制主要有Tasklet和workqueue以及softirq(2.4内核则有BH,Taskqueue,softirq,tasklet

以实际使用时跟timer机制基本上一个意思。

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

mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上许多。

在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,当然,也可以把文件的内容映射到内存来恢复某些服务。

另外,mm/p

实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个普通文件

实现共享内存。

27.驱动里面为什么要有并发、互斥的控制?

如何实现?

讲个例子?

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

自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临

界区中。

这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。

这里也介绍下信号量的概念,因为它的用法和自旋锁有相似的地方。

linUX中的信号量

是一种睡眠锁。

如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待

队列,然后让其睡眠。

这时处理器获得自由去执行其它代码。

当持有信号量的进程将信号量

释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

 

30.

嵌入式linUX和winee操作系统的特点和特性?

 

32.

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

33.USB设备的枚举过程?

(1)GetDeviceDescriptor。

主机的第一个命令要求得到设备描述符,此SETUP包为8个

字节数据(80,06,00,01,00,00,40,00),发向地址0,端口0。

“40”表示返回数据长度最大为40H个字节。

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

(2)

主机发送一个含有指定地址的数据包(00,

USB设备的时候,这个地址一般会是2,

设置地址事件处理结束后,设备进入地址

SetAddress。

接着是设置设备地址处理事件,

05,02,00,00,00,00,00),在主机只有一个

最大地址127,USB协议中可以连接127个设备。

状态,主机以后会在新的指定地址处访问设备。

⑶GetDeviceDescriptor。

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

⑷读取全部ConfigurationDescriptor。

接着主机要求得到设备全部的配置描述符、接

口描述符和节点描述符(80,06,00,02,00,00,40,00),由于主机不知道设备描述符的真实长度,因此它要求得到64个字节。

⑸SetInterface,主机发送数据包(01,0B,00,00,00,00,00,00),设置接口值

为0。

⑹SetConifguration,确定USB设备工作在哪一个配置下。

对于U盘设备来说,一般只

有1个配置值,其值为01。

主机发送数据包(00,09,01,00,00,00,00,00)。

(7)如果以上步骤都正确,主机将找到新设备,并且配置成功,该设备可以正常使用,可以

进行后续的U盘枚举过程了。

(8)用busHound观察计算机对于U盘的枚举过程,发现上述步骤后还有一个GetMaxLun的

操作,但是实际上对于U盘来说忽略该步骤也没有问题。

34.PSRAM、SDRAMDDRDDR2的时序特性?

35.什么是GPIO?

generalpurposeinput/output

GPIO脚,则该脚可作为输入或输出高GPIO也可做其他用途。

GPIO是相对于芯片本身而言的,如某个管脚是芯片的或低电平使用,当然某个脚具有复用的功能,即可做也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led

的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状

态,这给cpu提供了一个方便的控制周边设备的途经。

如果没有足够多的gpio管脚,在控

CPLD来帮助管理。

制一些外围设备时就会力有不逮,这时可采取的方案是使用

表面声波技术触摸屏、电容技术触摸屏。

这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面图有一层透明氧化金属(ITO氧化铟,

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

当有物体触摸到表面时,阻碍声波的传输,

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

当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,控制器侦测到这一接触并计算出(__X,丫)的位置,再根据模拟鼠标的方式运作。

这就是电阻技术触摸屏的最基本的原理。

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

电容技术触摸屏利用人体的电流感应进行工作。

用户触摸屏幕时,由于人体电场,用户和

触摸屏表面形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触

点吸走一个很小的电流

37.在LinUXC中,Is这个命令是怎么被执行的?

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

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

1#defineMEMSIZE1024*1024intcount=0;void*p=NULL;

while

(1){

P=(void*)malloc(MEMSIZE);

if(!

p)break;

printf("Currentallocation%dMB\n",++count);

2

while

(1){

p=(void*)malloc(MEMSIZE);

if(!

p)break;

memset(p,1,MEMSIZE);

printf("Currentallocation%dMB\n",++count);

}

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

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

搞的比较复杂。

主要思想就是a-b的值的最高位是否为0;但是又得考虑整数溢出的问题,

所以很复杂。

不知道哪位大侠有更好的办法,指点指点。

#include#defineZHENG(i)((i>>31)==0)

#defineFU(i)((i>>31)!

=0)#defineCOMPARE(a,b)((ZHENG(a)&&FU(b))||(((ZHENG(a)&&

ZHENG(b))||(FU(a)&&FU(b)))&&((((a)-(b))>>31)==0)))voidmain()

L

inta=0x80000001;intb=0X6FFFFFFF;if(COMPARE(a,b))

{

printf("a>=b\n");

}

else

{

printf("a

40、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?

请从C/C++语言开发的角度描述,至少说出两点共同点。

参考答案:

第1题,答中一个得5分,答出其它正确答案的,也得__5分。

a)都基于TCP/IP协议,都提供了面向连接的TCPSOCK和无连接的UDPSOCK

b)都是一个sock结构体。

C)都是使用sock文件句柄进行访问。

d)都具有缓冲机制。

41、请编写一个标准Shell脚本testd,实现如下功能:

A、在Linux操作系统启动的时候,自动加载/mnt/test/test程序。

B当test异常退出之后,自动重新启动。

C当test程序重启次数超过100次,自动复位操作系统。

假设你所拥有的资源:

A目标机器是一台具有标准shell的嵌入式计算机,CPU为ARM756MB内存16MB软件环境基于LinuX2611和BusyBox1.2构建。

B当前已有11个用户进程在运行,占用了大部分的CPU时间和内存,你可使用的内存只有2MB左右,CPU时间由系统分派。

本题是考查LINUX和嵌入式编程功底的,写出程序来的不少,但是95%X上的人竟无视我假

设的资源,不知道在重启test程序的时候需要加上一个适当的掩饰时间,以便资源紧张的

操作系统有时间回收资源。

85%勺人不知道写完testd之后,要在init里边加载这个脚本,

才能实现启动时自动加载的功能。

参考答案:

#########################################testdisadaemonscripttostartanwatchtheprogramtest########################################

#!

/bin/sh#load*.sothatmayneedif[-r/sbin/ldconfig];then

Idconfig

#addthelibsPATHthatmayneedexportLDLIBRARYPATH="/lib"#countisthecounterofteststartedtimescount=0#mainloop

while[1];do

#addexecutepropertyfor/mnt/test/testchmod+x/mnt/test/test

#starttest/mnt/test/test#therunningtimescounterletcount=count+1echo"testrunningtimesis$count"#Istestrunningtoomanytimes?

if[”$count"-gt100];thenecho"Willrebootbecauseoftestrunningtoomanytimes"reboot

fL

#waitforteststoping...

sleep3

done#########################################

42.你平常是怎么用C写嵌入式系统的死循环的

43.写一条命令,实现在dir以及其子目录下找出所有包含“helloworld”字符串的文件

45.一个计划跑LINUX系统的ARM系统把bootloader烧录进去后,上电后串口上没有任何输出,硬件和软件各应该去检查什么?

提示:

1.跑LINUX的系统一般都需要外扩DRAM一般的系统也经常有NOF或NAND

FLASH

47.请简述下面这段代码的功能

movr12,#0x0

Idrr13,=0x30100000

movr14,#4096

loop:

cmp

bl

r12,r14

loop

48.嵌入式中常用的文件系统有哪些?

说出它们的主要特点和应用场合49.某外设寄存器rGpioBase的地址是0x56000000,寄存器的0~15位有效,请写出给外设寄存器高八位(8~'15位)设置成0xc3的代码

50.如何编写一个LINUX驱动?

提示:

主要说字符设备的编写过程

51.简述LINUX驱动中字符设备和块设备的区另ij?

52.试总结单片机底层开发与

LINUX驱动开发有哪些异同?

 

53.请从网卡、USBHOST

个(可以以具体的芯片为例)

1)如果是外部扩展芯片,请说出你用的芯片的型号

LCD驱动器、NANDFLASHWIFI、音频芯片中选择一个或者2

,对下面的问题做答:

2)画出上题中你选定相应硬件模块与CPU的主要引脚连线

3)编写上题中你选定相应硬件模块相应LINUX驱动的流程?

54、linUX驱动分类

LinUX设备驱动的分类

(1)字符设备。

(2)块设备。

(3)网络设备。

字符设备指那些必须以串行顺序依次进行访问的设备,块设备可以用任意顺序进行访问,以块为单位进行操作,系统的快速缓冲,而块设备经过系统的快速缓冲。

但是,

如触摸屏、磁带驱动器、鼠标等。

如硬盘、软驱等。

字符设备不经过字符设备和块设备并没有明显的界

限,如对于Flash设备,符合块设备的特点,但是我们仍然可以把它作为一个字符设备来访

问。

网络设备在LinUX里做专门的处理。

Linux的网络系统主要是基于BSDunix的socket机制。

在系统和驱动程序之间定义有专门的数据结构(skbuff)进行数据的传递。

系统里支持

对发送数据和接收数据的缓存,提供流量控制机制,提供对多协议的支持。

55、信号量与自旋锁

自旋锁

它应用于中断处理等部分。

对于单处

自旋锁是专为防止多处理器并发而引入的一种锁,

理器来说,防止中断处理中的并发可简单采用关闭中断的方式,不需要自旋锁。

自旋锁最多只能被一个内核任务持有,如果一个内核任务试图请求一个已被争用

(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环一一旋转一一等待锁重新可用。

要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行。

自旋锁可以在任何时刻防止

多于一个的内核任务同时进入临界区,因此这种锁可有效地避免多处理器上并发运行的内核

任务竞争共享资源。

事实上,自旋锁的初衷就是:

在短期间内进行轻量级的锁定。

一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。

如果需要长时间锁定的话,最好使用信号量。

但是自旋锁节省了上下文切

换的开销。

自旋锁的基本形式如下:

spin_lock(&mr_lock);

〃临界区

spin_unlock(&mr_lock);

 

因为自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许

存在于临界区中。

这点很好地满足了对称多处理机器需要的锁定服务。

在单处理器上,自旋

锁仅仅当作一个设置内核抢占的开关。

如果内核抢占也不存在,那么自旋锁会在编译时被完

全剔除出内核。

),它能够在中断上

简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。

另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁一一因为睡眠—有可能造成持有锁的内核任务被重新调度,而再次申请自己已持有的锁

F文中使用。

死锁:

假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,但所有的资源都已经被占用了。

这便会发生所有内核任务都在相互等待,但它们永远不会释

放已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法继续运行,这便意味

显然

着死锁发生了。

自死琐是说自己占有了某个资源,然后自己又申请自己已占有的资源,

不可能再获得该资源,因此就自缚手脚了。

递归使用一个自旋锁就会出现这种情况。

信号量

信号量是一种睡眠锁。

如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推

只能在进程上下文中不可以再持有自旋锁。

入等待队列,然后让其睡眠。

这时处理器获得自由去执行其它代码。

当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;

使用,因为中断上下文中是不能被调度的;另外当代码持有信号量时,

信号量基本使用形式为:

staticDECLAREMUTEX(mrsem);//声明互斥信号量

if(down_interruptible(&mr_sem))

〃可被中断的睡眠,当信号来到,睡眠的任务被唤醒〃临界区

up(&mr_sem);

信号量和自旋锁区别

从严格意义上讲,信号量和自旋锁属于不同层次的互斥手段,前者的实现有赖于后者。

注意以下原则:

如果代码需要睡眠一一这往往是发生在和用户空间同步时一一使用信号量是唯一的选择。

由于不受睡眠的限制,使用信号量通常来说更加简单一些。

如果需要在自旋锁和

信号量中作选择,应该取决于锁被持有的时间长短。

理想情况是所有的锁都应该尽可能短的

另外,信号量不同于这意味者信号量不会对

被持有,但是如果锁的持有时间较长的话,使用信号量是更好的选择。

自旋锁,它不会关闭内核抢占,所以持有信号量的代码可以被抢占。

影响调度反应时间带来负面影响。

自旋锁对信号量

需求

建议的加锁方法

低开销加锁

优先使用自旋锁

短期锁定

优先使用自旋锁

长期加锁

优先使用信号量

中断上下文中加锁

使用自旋锁

持有锁是需要睡眠、调度

使用信号量

malloc(),vmalloc()和kmalloc()区别

[]kmalloc禾口vmalloc是分配的是内核的内存,malloc分配的是用户的内存

[*]kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连

续,malloc不保证任何东西(这点是自己猜测的,不一定正确)

[*]kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大

[*]内存只有在要被DMA访问的时候才需要物理上连续

59、添加驱动

静态加载和动态加载:

需要时

60、

静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进内核才行;动态加载,也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,动态载入内核,这种主要用在调试的时候,比较方便灵活。

insmodmodule.ko

IIC原理,总线框架,设备编写方法,i2c_msg

USB总线:

USB总线属于一种轮询式总线,主机控制端口初始化所有的数据传输。

每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)。

按照传输前制定好的原则,在每次传送开始时,主机送一个描述传输动作的种类、方向、USB设备地址和终端号的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1