linu驱动工程师面试题整理_第1页
linu驱动工程师面试题整理_第2页
linu驱动工程师面试题整理_第3页
linu驱动工程师面试题整理_第4页
linu驱动工程师面试题整理_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、字符型驱动设备你是怎么创立设备文件的,就是/dev/下面的设备文件,供上层应用程序翻开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创立一个设备文件。答:mknod命令结合设备的主设备号和次设备号,可创立一个设备文件。UDEV/MDEV自动创立设备文件的方UDEV/MDEVdevfs共有三种方式可以创立设备文件。答:中断处理例程应当尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。答:中断处理例程应当尽量短,把能放在后半段(tasklet,等待队列等)的任务尽量放在后半段。tasklet方式。也就是中断上半部和下半部。其次:中断效劳程序中不能有堵塞操作。为什么?大家可以争论。第三:中断效劳程序留意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的OK,FAIL的是自旋锁,缘由是在中断处理例程中,硬中断是关闭的,这样会丧失可能到来的中断。的是自旋锁,缘由是在中断处理例程中,硬中断是关闭的,这样会丧失可能到来的中断。可能标记资源的使用状况?其他进程又看不见这个变量可能标记资源的使用状况?其他进程又看不见这个变量评:其次句话的意思是:定义一个变量,比方intflag=0;if(flag==0){flag=1;操作临界区;flag=0;}这样可否?}这样可否?答:insmod调用initrmmod调用答:insmod调用initrmmod调用exit的问题。initexitioremap,定时器,留下一点痕迹。6、在驱动调试过程中遇到过oops7、ioctlunlock_ioctl答:由于内核没有方法直接访问物理内存地址,必需先通过ioremap获得对应的虚拟地址。8答:由于内核没有方法直接访问物理内存地址,必需先通过ioremap获得对应的虚拟地址。9platfoem总线的匹配规章是?在具体应用上要不要先注册驱动再注册设备?有先后挨次没?10、linux11linux存概念?12、linuxtaskletworkqueue分上半部和下半部?13、linux14、linuxspinlock15、linuxRCU16、linux17、linux18、MIPSCpuuboot19、linuxreadlinux核空间?20、linux21、linux22、linuxKmalloc Kmalloc get_free_mempool_createIRQFIQCPU上半局部执行与硬件相关的处理要求快,而有些驱动在中断处理程序中又需要完成大量工作,这构成冲突,所以Linux有所谓的上半局部执行与硬件相关的处理要求快,而有些驱动在中断处理程序中又需要完成大量工作,这构成冲突,所以Linux有所谓的bottomhalf成的,在开中断的环境下,由底半程序随后完成.LinuxLinux的底半机制主要有Tasklet和workqueue以及softirq2.4内核则有BHTaskqueue,softirq,tasklet没有workqueue),其实底半可以理解成一种工作的延迟。所以实际使用时跟timermmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上很多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,固然,也可以把文件的内容映射到内存来恢复某些效劳。另外,mmapmmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件,他比单纯调用read/write也要快上很多。在某些时候我们可以把内存的内容拷贝到一个文件中实现内存备份,固然,也可以把文件的内容映射到内存来恢复某些效劳。另外,mmap实现共享内存也是其主要应用之一,mmap系统调用使得进程之间通过映射同一个一般文件实现共享内存。实现共享内存。驱动里面为什么要有并发、互斥的把握?如何实现?讲个例子?自旋锁在同一时刻只能被最多一个内核任务持有自旋锁在同一时刻只能被最多一个内核任务持有linux中的信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。任务调度的机制?linuxwincelinuxtty嵌入式设备,为加快启动速度,可以做哪些方面的优化?USBGetGetDeviceDescriptor。主机的第一个命令要求得到设备描述符,此SETUP包为8个字节数据〔80,06,00,01,00,00,40,00〕,发向地址0,端口0。“40”表示返回数40HDEV_DESC[8个字节,用于说明设备的描述符的真实长度和设备的类型。SetAddress〔00,05,02,00,00,00,00,00〕,在主机只有一个USB设备的时候,这个地址一般会是2,状态,主机以后会在的指定地址处访问设备。GetDeviceDescriptor。主机再次发送恳求得到设备描述符的数据包〔80,06,00,01,00,00,12,00〕,与上次不同的是,要求的数据的长度是实际的数据长度,同时是发SetAddress读取全部ConfigurationDescriptor。接着主机要求得到设备全部的配置描述符、接口描述符和节点描述符〔80,06,00,02,00,00,40,00〕,由于主机不知道设备描述符64(5)SetInterface,主机发送数据包〔01,0B,00,00,00,00,00,00〕,设置接口值0。SetConifguration,确定USBU进展后续的UUGetMaxLun操作,但是实际上对于U盘来说无视该步骤也没有问题。generalpurposeinput/outputGPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,固然某个脚具有复用的功能,即可做generalpurposeinput/outputGPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,固然某个脚具有复用的功能,即可做GPIO也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led〔一些引脚连到一个传感器上以获得该传感器的状态,这给cpu供给了一个便利的把握周边设备的途经。假设没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可实行的方案是使用CPLD来帮助治理。触摸屏的主要三大种类是:电阻技术触摸屏、外表声波技术触摸屏、电容技术触摸屏。电阻触摸屏的主要局部是一块与显示器外表格外协作的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,外表图有一层透亮氧化金属触摸屏的主要三大种类是:电阻技术触摸屏、外表声波技术触摸屏、电容技术触摸屏。电阻触摸屏的主要局部是一块与显示器外表格外协作的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,外表图有一层透亮氧化金属〔ITO的导电电阻〕也涂有一层ITO〔1/1000的透亮隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,把握器侦测到这一接触并计算出〔X,Y〕的位置,再依据模拟鼠标的方式运作。这就是电阻技术触摸屏的最根本的原理。外表声波技术是利用声波在物体的外表进展传输换能器侦测到这个变化,反映给计算机,进而进展鼠标的模拟。触摸屏外表形成以一个耦合电容,对于高频电流来说,电容是直接导体,于是手指从接触点吸走一个很小的电流fork创立一个进程或execLinuxfork创立一个进程或exec在一个只有128M内存并且没有交换分区的机器上,说说下面两个程序的运行结果11#defineMEMSIZE1024*1024intcount=0;void*p=NULL;while(1){p=(void*)malloc(MEMSIZE);if(!p)break;printf(“Currentallocation%dMB\n“,++count);}2while(1){p=(void*)malloc(MEMSIZE);ifif(!p)break;memset(p,1,MEMSIZE);printf(“Currentallocation%dMB\n“,++count);}第一道程序安排内存但没有填充,编译器可能会把内存安排优化掉,程序死循环;其次道,程序安排内存并进展填充,系统会始终安排内存,直到内存缺乏,退出循环。请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句搞的比较简洁。主要思想就是a-b搞的比较简洁。主要思想就是a-b的值的最高位是否为0;但是又得考虑整数溢出的问题,所以很简洁。不知道哪位大侠有更好的方法,教育教育。#include<stdio.h>#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{inta=0x80000001;intb=0x6FFFFFFF;if(COMPARE(a,b)){printf(“a>=b\n“);}else{printf(“a<b\n“);}}参考答案:155都基于TCP/IP参考答案:155都基于TCP/IPTCPSOCK和无连接的UDPSOCK。都是一个sock都是使用sockd)都具有缓冲机制。A、在Linux/mnt/test/testA、在Linux/mnt/test/testB、当testC、当test100假设你所拥有的资源:A、目标机器是一台具有标准shellCPUARM756MB16MB,软件环境基于Linux2.6.11BusyBox1.2B11CPU2MBCPU此题是考察LINUX和嵌入式编程功底的,写出程序来的不少,但是95%以上的人竟无视我假设的资源,不知道在重启test程序的时候需要加上一个适当的掩饰时间,以便资源紧急的操作系统有时间回收资源。85%的人不知道写完testd之后,要在init里边加载这个脚本,才能实现启动时自动加载的功能。参考答案:#########################################testdisadaemonscripttostartanwatchtheprogramtest#########################################!/bin/sh#load*.sothatmayneedif[-r/sbin/ldconfig];thenldconfigfi#addthelibsPATHthatmayneedexportLD_LIBRARY_PATH=“/lib“#countisthecounterofteststartedtimescount=0#mainloopwhile[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“rebootfi#waitforteststoping...sleepsleep3done#########################################Cdirhelloworld”字符串的文件A:A:unsignedshorti;unsignedshortindex=0;for(i=0;i<index-1;i++){ printf(“a\n”);}B:unsignedshorti;unsignedlongindex=0;for(i=0;i<index-1;i++){ printf(“b\n”);}LINUXARMbootloader输出,硬件和软件各应当去检查什么?提示:1LINUXDRAM,一般的系统也常常有提示:1LINUXDRAM,一般的系统也常常有NOR或NANDFLASH请简述下面这段代码的功能movr12,#0x0ldrr13,movr12,#0x0ldrr13,=0x30100000movr14,#4096loop:ldmiar12!,{r0-r11}stmiar13!,{r0-r11}cmpr12,r14blloop嵌入式中常用的文件系统有哪些?说出它们的主要特点和应用场合?rGpioBase0x560000000~15器高八位(8~`150xc3提示:主要说字符设备的编写过程LINUX提示:主要说字符设备的编写过程LINUX试总结单片机底层开发与LINUX驱动开发有哪些异同?假设是外部扩展芯片,请说出你用的芯片的型号画出上题中你选定相应硬件模块与CPU的主要引脚连线请从网卡、USBHOST、LCDNANDFLASH、WIFI假设是外部扩展芯片,请说出你用的芯片的型号画出上题中你选定相应硬件模块与CPU的主要引脚连线3)编写上题中你选定相应硬件模块相应3)编写上题中你选定相应硬件模块相应LINUX54、linuxLinuxLinux字符设备。块设备。网络设备。字符设备指那些必需以串行挨次依次进展访问的设备FlashLinuxLinuxBSDunix的socket机制。在系统和驱动程序之间定义有特地的数据构造(sk_buff)进展数据的传递。系统里支持对发送数据和接收数据的缓存,供给流量把握机制,供给对多协议的支持。55、信号量与自旋锁自旋锁自旋锁理器来说,防止中断处理中的并发可简洁承受关闭中断的方式,不需要自旋锁。被持有)的自旋锁,那么这个任务就会始终进展忙循环——旋转——等待锁重可用。要是多于一个的内核任务同时进入临界区任务竞争共享资源。换的开销。自旋锁的根本形式如下:spin_lock(&mr_lock);//临界区spin_unlock(&mr_lock);由于自旋锁在同一时刻只能被最多一个内核任务持有全剔除出内核。成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——由于睡眠有可能造成持有锁的内核任务被重调度,而再次申请自己已持有的锁),它能够在中断上下文中使用。死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源,不行能再获得该资源,因此就自缚手脚了。递归使用一个自旋锁就会消灭这种状况。信号量信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量根本使用形式为:staticDECLARE_MUTEX(mr_sem);//声明互斥信号量if(down_interruptible(&mr_sem))//可被中断的睡眠,当信号来到,睡眠的任务被唤醒//临界区up(&mr_sem);信号量和自旋锁区分信号量和自旋锁区分从严格意义上讲,信号量和自旋锁属于不同层次的互斥手段,前者的实现有赖于后者。留意以下原则:假设代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯影响调度反响时间带来负面影响。自旋锁对信号量需求低开销加锁短期锁定长期加锁中断上下文中加锁持有锁是需要睡眠、调度建议的加锁方法优先使用自旋锁优先使用自旋锁优先使用信号量使用自旋锁使用信号量56、platform57、kmallocvmallockmallocvmalloc介绍kmalloc用于申请较小的、连续的物理内存以字节为单位进展安排,在<linux/slab.h>中void*kmalloc(size_tsize,intflags)安排的内存物理地址上连续,虚拟地址上自然连续gfp_mask———————————————————————————————-情形 相应标志———————————————————————————————-进程上下文,可以睡眠GFP_KERNEL进程上下文,不行以睡眠GFP_ATOMIC中断处理程序GFP_ATOMIC软中断GFP_ATOMICTaskletGFP_ATOMICDMAGFP_DMA|GFP_KERNELDMAGFP_DMA|GFP_ATOMIC———————————————————————————————-voidkfree(constvoid*ptr)释放由kmalloc安排出来的内存块vmalloc用于申请较大的内存空间,虚拟内存是连续的以字节为单位进展安排,在<linux/vmalloc.h>中void*vmalloc(unsignedlongsize)安排的内存虚拟地址上连续,物理地址不连续一般状况下,只有硬件设备才需要物理地址连续的内存,由于硬件设备往往存在于MMUkmalloc,而只有在需要获得大块内存时才使用vmalloc,例如当模块被动态加载到内核当中时,就把模块装载到由vmalloc[*]kmallocvmalloc,malloc[*]kmalloc保证安排的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc[*]kmalloc,vmalloc[*]kmallocvmalloc,malloc[*]kmalloc保证安排的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc[*]kmalloc,vmallocmalloc[*]内存只有在要被DMA[*]vmallockmalloc58、module_init59、添加驱动静态加载和动态加载:静态加载和动态加载:静态加载是系统启动的时候由内核自动加载的,这个要事先将驱动编译进内核才行;动态载入内核,这种主要用在调试的时候,比较便利灵敏。insmodmodule.ko60、IICi2c_msg61、kernelpanic62、USBUSBurbUSBUSBUSB总线属于一种轮询式总线,主机把握端口初始化全部的数据传输。每一总线动作最多传送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShake)。依据传输前制定好的原USB设备地址和终端号的USB(TokenPacketUSBUSBUSB把握信息供给一个入口。USBUSB1、中断传输:由OUT事务和INHID2、批量传输:由OUT事务和IN带宽,当总线忙时,USB3、同步传输:由OUT事务和ININOUT是没有返回包阶段的;其次,在数据包阶段任何的数据包都为DATA04、把握传输:最重要〔初始配置阶段、可选数据阶段、状态信息步骤〕,每一个阶段能够看成一个的传输,也就是说把握传输其实是由三个传输构成的,用来于USBUSB。URB:USB〔USBrequestblock,urb〕USBUSBsk_buffUSB备通信的“电波”。63、同步和互斥同步和互斥完成的特定的任务。间不行以同时运行,他们会相互排斥,必需等待一个线程运行完毕,另一个才能运行,而同〔也是一种互斥!总结:无法限制访问者对资源的访问挨次,即访问是无序的。同步:是指在互斥的根底上〔大多数状况〕,通过其它机制实现访问者对资源的有序访状况是指可以允很多个访问者同时访问资源答:字符设备:字符设备是个能够像字节流〔类似文件〕一样被访问的设备,由字符设备open,close,readwrite答:字符设备:字符设备是个能够像字节流〔类似文件〕一样被访问的设备,由字符设备open,close,readwrite调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。块设备:和字符设备类似,块设备也是通过/dev名目下的文件系统节点来访问。块设备上能够容纳文件系统,如:uSD字符设备和块设备的区分仅仅在于内核内部治理数据的方式之间的软件接口,而这些不同对用户来讲是透亮的。在内核中,和字符驱动程序相比动程序具有完全不同的接口答:1)查看驱动模块中打印信息的命令:dmesg2)查看字符设备信息可以用答:1)查看驱动模块中打印信息的命令:dmesg2)查看字符设备信息可以用lsmod和modproblsmodmodprobe3〕显示当前使用的中断号cat/proc/interrupt66、Linux中引入模块机制有什么好处?换句话说,模块初始化函数的任务就是为以后调用函数预先作预备。好处:应用程序在退出时,可以不管资源的释放或者其他的去除工作,但是模块的退出函数却必需认真此撤销初始化函数所作的一切。该机制有助于缩短模块的开发周期。即:注册和卸载都很灵敏便利。67、copy_to_user和copy_from_user主要用于实现什么功能?一般用于file_operations写。copy_to_user:完成内核空间到用户空间的复制,copy_from_user:是完成用户空间到内核空间的复制。一般用于file_operations构造里的read,write,ioctl等内存数据ioctl数。答:主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允很多个驱动程则组织。次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依靠于驱动程序作设备本地数组的索引。chartest由驱动程序464〔感觉类似于串口终端或者字符设备终端〕。68答:主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允很多个驱动程则组织。次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依靠于驱动程序作设备本地数组的索引。chartest由驱动程序464〔感觉类似于串口终端或者字符设备终端〕。69、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。答:注册一个字符设备驱动有两种方法:答:注册一个字符设备驱动有两种方法:voidcdev_init(structcdev*cdev,structfile_operations*fops)该注册函数可以将cdev构造嵌入到自己的设备特定的构造中cdev是一个指向构造体cdev但不限于该构造〕的指针.intregister_chrdev(unsignedintmajor,constchar*namem,structfile)operations*fopen);该注册函数是早期的注册函数,majorfops是默认的file_operations〔这是只限于file_operations〕。对于register_chrdev的调用将为给定的主设备号注册0-255作为次设备号,并为每个设备建立一个对应的默认cdev构造。答:1〕DMACPU机制,使用DMA可以使系统CPU答:1〕DMACPU机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。CPUCPU转去处理突发大事,处理完毕后CPU所以中断和MDA的区分就是MDA不需CPU参与而中断是需要CPU2〕中断注册函数和中断注销函数注册中断:intrequest_irq(unsignedintirq,irqreturn_t(*handler)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论