《linu驱动工程师面试题.docx》由会员分享,可在线阅读,更多相关《linu驱动工程师面试题.docx(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1、字符型驱动设备你是怎么创立设备文件的,就是/dev/下面的设备文件,供上层应用程 序翻开使用的文件?答:mknod命令结合设备的主设备号和次设备号,可创立一个设备文件。评:这只是其中一种方式,也叫手动创立设备文件。还有L-DliV/MDliV自动创立设备文件的方 式UDEV/MDEV是运行在用户态的程序,可以动态治理设备文件,包括创立和删除设备文件,运 行在用户态意味着系统要运行之后。那么在系统启动期间还有devfs创立了设备文件。一 共有三种方式可以创立设备文件。2、写一个中断效劳需要留意哪些?假设中断产生之后要做比较多的事情你是怎么做的? 答:中断处理例程应当尽量短,把能放在后半段(t
2、asklet,等待队列等)的任务尽量放在后 半段。评:写一个中断效劳程序要留意快进快出,在中断效劳程序里面尽量快速采集信息,包括硬件信 息,然后推出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部 和下半部。其次:中断效劳程序中不能有堵塞操作。为什么?大家可以争论。第三:中断效劳程序留意返回值,要用操作系统定义的宏做为返回值,而不是自己定义的 OK, FAIL之类的。3、自旋锁和信号量在互斥使用时需要留意哪些?在中断效劳程序里面的互斥是使用自旋锁 还是信号量?还是两者都能用?为什么?答:使用自旋锁的进程不能睡眠,使用信号量的进程可以睡眠。中断效劳例程中的互斥使用 的是
3、自旋锁,缘由是在中断处理例程中,硬中断是关闭的,这样会丧失可能到来的中断。4、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源 只有一个使用者行不行?答:原子操作指的是无法被打断的操作。我没懂其次句是什么意思,自己定义一个变量怎么可能 标记资源的使用状况?其他进程又看不见这个变量 评:其次句话的意思是:定义一个变量,比方int flag =0;if(flag = 0)flag = 1;操作临界区;flag = 0;这样可否?由于自旋锁在同时刻只能被最多个内核任务持有,所以个时刻只有-个线程允许存 在于临界区中。这点很好地满足了对称多处理机器需要的锁定效劳。在单处理器
4、上,自旋锁仅仅 当作一个设置内核抢占的开关。假设内核抢占也不存在,那么自旋锁会在编译时被完全剔除出 内核。简洁的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成 的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁一一由于睡眠有 可能造成持有锁的内核任务被重调度,而再次申请自己已持有的锁),它能够在中断上下文 中使用。死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中的一个资源, 但全部的资源都已经被占用了。这便会发生全部内核任务都在相互等待,但它们永久不会释放 已经占有的资源,于是任何内核任务都无法获得所需要的资源,无法连续运行,这便意
5、味着死 锁发生了。自死琐是说自己占有了某个资源,然后自己乂申请自己已占有的资源,明显不行能 再获得该资源,因此就自缚手脚了。递归使用1个自旋锁就会消灭这种状况。信号量信号量是种睡眠锁.假设有个任务试图获得个已被持有的信号量时,信号量会将其推入等 待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释 放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量的睡眠特性,使得信号量适用锁会被长时间持有的状况:只能在进程上下文中使 用,由于中断上卜.文中是不能被调度的;另外当代码持有信号量时,不行以再持有自旋锁。信号 量根本使用形式为:static DEC
6、LARE_MUTEX(mr_sem);声明互斥信号量if (down interruptible (ftinrscm)可被中断的睡眠.,当信号来到,睡眠的任务被唤醒临界区up (&mr _sem);信号量和自旋锁区分从严格意义上讲,信号量和自旋锁属于不同层次的互斥手段,前者的实现有赖于后者。 留意以下原则:假设代码需要睡眠一一这往往是发生在和用户空间同步时一一使用信号量是唯 一的选择。由于不受睡眠的限制,使用信号量通常来说更加简洁一叫。假设需要在自旋锁和信号 量中作选择,应当取决于锁被持有的时间长短。抱负状况是全部的锁都应当尽可能短的被持有, 但是假设锁的持有时间较长的话,使用信号量是更好的选
7、择。另外,信号量不同于自旋锁,它 不会关闭内核抢占,所以持有信号量的代码可以被抢占。这意味者信号量不会对 影响调度反响时间带来负面影响。自旋锁对信号量中断上下文中加锁使用自旋锁需求建议的加锁方法低开销加锁优先使用自旋锁短期锁定优先使用自旋锁长期加锁优先使用信号量持有锁是需要睡眠、调度使用信号量56s platform总线设备及总线设备如何编写57、kmalloc 和 vmalloc 的区分kmalloc和 vmalloc介绍kmalloc用于申请较小的、连续的物理内存1. 以字节为单位进展安排,在linux/slab.h中void 4. void kfree(const void *ptr)释
8、放由kmalloc安排出来的内存块vmalloc用于申请较大的内存空间,虚拟内存是连续的1.以字节为单位进展安排,在1 inux/vmal loc. h中2. void *vmalloc(unsigned long size)安排的内存虚拟地址上连续,物理地址不连续3. 一般状况卜,只有硬件设备才需要物理地址连续的内存,由于硬件设备往往存在于MMU之 外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用kmalloc,而只有在需要 获得大块内存时才使用vmalloc,例如当模块被动态加载到内核当中时,就把模块装载到由 vmalloc安排的内存上。4. void vfree(void *a
9、ddr),这个函数可以睡眠,因此不能从中断上下文调用。malloc, vmalloc和 kmalloc区分*kmalloc和vmalloc是安排的是内核的内存,mal安c安排的是用户的内存2. void 4. void kfree(const void *ptr)释放由kmalloc安排出来的内存块vmalloc用于申请较大的内存空间,虚拟内存是连续的1.以字节为单位进展安排,在1 inux/vmal loc. h中2. void *vmalloc(unsigned long size)安排的内存虚拟地址上连续,物理地址不连续3. 一般状况卜,只有硬件设备才需要物理地址连续的内存,由于硬件设备
10、往往存在于MMU之 外,根本不了解虚拟地址;但为了性能上的考虑,内核中一般使用kmalloc,而只有在需要 获得大块内存时才使用vmalloc,例如当模块被动态加载到内核当中时,就把模块装载到由 vmalloc安排的内存上。4. void vfree(void *addr),这个函数可以睡眠,因此不能从中断上下文调用。malloc, vmalloc和 kmalloc区分*kmalloc和vmalloc是安排的是内核的内存,mal安c安排的是用户的内存 kmalloc保证安排的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连 续,malloc不保证任何东西(这点是自己猜测的,不愿
11、定正确)*kmal loc能安排的大小有限,vmal loc和ma 11 oc能安排的大小相对较大*内存只有在要被DMA访问的时候才需要物埋上连续* vmal loc 比 kmalloc 要慢58、module_init 的级别 最简洁的传输,把握传输由三个阶段构成(初始配置阶段、可选数据阶段、状态信息步 骤),每个阶段能够看成个的传输,也就是说把握传输其实是由三个传输构成的,用来 于USB设备初次加接到主机之后,主机通过把握传输来交换信息,设备地址和读取设备的描述 符,使得主机识别设备,并安装相应的驱动程式,这是每一个USB研发者都要关心的问题。URB:USB恳求块(USB request
12、block, urb)是LSB设备驱动中用来描述与USB设备通信所用的 根本载体和核心数据构造,格外类似网络设备驱动中的sk buff构造体,是USB主机与设 备通信的“电波”。63、同步和互斥 同步和互斥必需认真此撤销初始化函数所作的一切。2)该机制有助于缩短模块的开发周期。即:注册和卸载都很灵敏便利。67、copy_to_user和copy_from_user主要用于实现什么功能?一般用于 file_operations构造的哪些函数里面? 所以中断和川)A的区分就是MDA不需CPU参与而中断是需要CPU参与的。2)中断注册函数和中断注销函数注册中断:int request irq(uns
13、igned int irq, irqreturn t (*handler)(int, void *, struct pt regs *), unsigned long flags, const char *dev name, void *dev id);参数意义依次是:中断号,中断处理函数,中断治理有关的掩码,中断恳求设备名,中断信 然后将sk buff递交给下层,各层在sk buff中添加不同的协议头直至交给网络设备发送。 同样的,当网络设备从网络媒介上承受到数据包后,它必需将承受到的数据转换为sk_buff 数据构造并传递给上层,盖层不抛去相应的协议头直至交给用户。安排sk_buff在接收
14、开 始就应当安排,在发送完毕数据之后可以释放sk_buff。kmalloc(size_t size, int flags)安排的内存物理地址上连续,虚拟地址上自 然连续gfp mask标志:什么时候使用哪种标忐?如下:情形相应标志 进程上下文,可以睡眠GFP_KERNEL进程上下文,不行以睡眠GFP ATOMIC中断处理程序GFP ATOMIC软中断 GFP_ATOMICTasklet GEB_ATOMIC用广DMA的内存,可以睡眠GFP_DMA | GFP_KERNEL用于DMA的内存,不行以睡眠GFP DMAGFP ATOMIC59、添加驱动静态加载和动态加载:静态加载是系统启动的时候由内
15、核自动加载的,这个要事先将驱动编译进内核才行;动态加载,也就是模块加载方式,这种方式下驱动以模块的形式存放在文件系统中,需要时动态 载入内核,这种主要用在调试的时候,比较便利灵敏。insmod module, ko60、IIC原理,总线框架,设备编写方法,i2c_msg61、 kernel panic62、USB总线,USB传输种类,urb等USB总线:USB总线属于一种轮询式总线,主机把握端口初始化全部的数据传输。每一总线动作最多传 送三个数据包,包括令牌(Token)、数据(Data)、联络(HandShakc)。依据传输前制定好的原 则,在每次传送开头时,主机送一个描述传输动作的种类、方
16、向、USB设备地址和终端号的 USB数据包,这个数据包通常被称为令牌包(TokenPacket)。USB设备从解码后的数据包的适当 位置取出属于臼己的数据。数据传输方向不是从主机到设备就是从设备到主机。在传输开始 时,由标志包来标志数据的传输方向,然后发送端开头发送包含信息的数据包或说明没有数据传 送。接收端也要相应发送一个握手的数据包说明是否传送成功。发送端和接收端之间的CSB数 据传输,在主机和设备的端口之间,可视为一个通道。USB中有一个特别的通道-缺省把握通 道,它属于消息通道,设备一启动即存在,从而为设备的设置、状态查询和输入 把握信息供给一个入口。USB总线的四种传输类型:1、中断
17、传输:由OUT事务和IN事务构成,用于键盘、鼠标等HID设备的数据传输中2、批量 传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带 宽,当总线忙时,USB会优先进展其他类型的数据传输,而临时停顿批量转输。3、同步传 输:由OUT事务和IN事务构成,有两个特别地方,第一,在同步传输的【N和OUT事务中是没 有返回包阶段的;其次,在数据包阶段任何的数据包都为DATA0 4、把握传输:最重要的也是相交进程之间的关系主要有两种,同步与互斥。所谓互斥,是指闲逛在不同进程之间的假 设干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序 片段
18、,只能等到该进程运行完这个程序片段后才可以运行。所谓同步,是指闲逛在不同进程之间 的假设干程序片断,它们的运行必需严格依据规定的某种先后次序来运行,这种先后次序依靠 于要完成的特定的任务。明显,同步是一种更为简洁的互斥,而互斥是一种特别的同步。也就是说互斥是两个线程之 间不行以同时运行,他们会相互排斥,必需等待一个线程运行完毕,另一个才能运行,而同 步也是不能同时运行,但他是必需要安照某种次序来运行相应的线程(也是一种互斥)!总结:互斥:是指某资源同时只允许个访问者对其进展访问,具有唯性和排它性。但互斥 无法限制访问者对资源的访问挨次,即访问是无序的.同步:是指在互斥的根底上(大多数状况),通
19、过其它机制实现访问者对资源的有序访 问。在大多数状况下,同步已经实现了互斥,特别是全部写入资源的状况必定是互斥的。少数 状况是指可以允很多个访问者同时访问资源64、 Linux设备中字符设备与块设备有什么主要的区分?请分别列举一些实际的设备说出 它们是属于哪一类设备。答:字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备 驱动程序来实现这种特性。字符设备驱动程序通常至少实现open, close, read和write系统调 用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。块设备:和字符设备类似,块设备也是通过/dev名目下的文件系统节点来访问。
20、块设备上 能够容纳文件系统,如:u盘,SD卡,磁盘等。字符设备和块设备的区分仅仅在内核内部治理数据的方式,也就是内核及驱动程序 之间的软件接口,而这些不同对用户来讲是透亮的。在内核中,和字符驱动程序相比,哪 动程序具有完全不同的接口65、查看驱动模块中打印信息应当使用什么命令?如何查看内核中已有的字符设备的信息? 如何查看正在使用的有哪些中断号?答:1)杳看驱动模块中打印信息的命令:dmesg2)查看字符设备信息可以用Ismod和modprobeJsmod可以查看模块的依靠关系, modprobe在加载模块时会加载其他依靠的模块。3)显示当前使用的中断号cat /proc/interrupt6
21、6、Linux中引入模块机制有什么好处?答:首先,模块是预先注册自己以便效劳于将来的某个恳求,然后他的初始化函数就马上完毕。换句话说,模块初始化函数的任务就是为以后调用函数预先作预备.好处二1)应用程序在退出时,可以不管资源的释放或者其他的去除工作,但是模块的退出函数却 答:由于内核空间和用户空间是不能相互访问的,假设需要访问就必需借助内核函数进展数据读 写。copy,o_user:完成内核空间到用户空间的复制,copy_rom_user:是完成用户空间到 内核空间的复制。一般用于fil jopcrations构造里的read, write, ioctl等内存数据交换 作用的函数。固然,假设i
22、octl没有用到内存数据复:制,那么就不会用到这两个函 数。68、请简述主设备号和次设备号的用途。假设执行mknod chartest c 4 64,创立chartest 设备。请分析chartest使用的是那一类设备驱动程序。答:1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允很多个驱动程 序共享主设备号,但我们对待的大多数设备照旧依据“一个主设备对应一个驱动程序”的原则 组织。次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依靠于驱动程序 的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设 备本地数组的索引。2) ch
23、artost由驱动程序4治理,该文件所指的设备是64号设备。(感觉类似于串口终端 或者字符设备终端)。69、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。答:注册一个字符设备驱动有两种方法:1) void cdev init(struct cdev *cdev, struct file operations *fops)该注册函数可以将cdev构造嵌入到自己的设备特定的构造中。cdev是个指向构造体cdev 的指针,而fops是指向一个类似于file operations构造(可以是file_operations构造, 但不限于该构造)的指针.2) int registe
24、r一chrdev(unsigned int major, const char *namem , struct file)operations *fopen);该注册函数是早期的注册函数,major是设备的主:设备号,name是驱动程序的名称,而fops 是默认的filjoperations构造(这是只限于file opcrations构造)。对于 register chrdev的调用将为给定的主设备号注册0255作为次设备号,并为每个设备建 立一个对应的默认cdev构造。70、请简述中断与DMA的区分。Linux设备驱动程序中,使用哪个函数注册和注销中断处理 程序?答:1) DMA:是一种无
25、须CPU的参与就可以让外设与系统内存之间进展双向数据传输的硬件 机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系 统的吞吐率。中断:是指CPU在执行程序的过程中,消灭了某些突发大事时CPU必需暂停执行当前的程序, 转去处理突发大事,处理完毕后CPU又返同源程序被中断的位置并连续执行。号线。过程是:dev_name设备恳求中断-cpu安排中断号设置中断治理的掩码安排中断信号线-处理中断函数- 完成之后再依据设置状况返回原处理程序处连续处理程序。注销中断;Void free irq(unsigned int irq, void *dev id);释放中断和中断信
26、号线71、中断和轮询哪个效率高?怎样打算是承受中断方式还是承受轮询方式去实现驱动?答:中断是CPU处于被中状态下来承受设备的信号,而轮询是CPU主动去查询该设备是否有 恳求。凡事都是两面性,所以,看效率不能简洁的说那个效率高。假设是恳求设备是1个频繁 恳求cpu的设备,或者有大量数据恳求的网络设备,那么轮询的效率是比中断高。假设是 一般设备,并且该设备恳求cpu的频率比较底,则用中断效率要高一些。72、简洁描述在CS8900的驱动设计中,发送数据frame和接收数据frame的过程。答:1)发送流程如下:(I)网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长度,
27、将有效数据放入临时缓冲区。(2)对于以太网,假设有效数据的长度小于以太网冲突检测所要求的数据桢的最小长度, 则给临时缓冲区的末尾填充0(3)设置硬件存放器,驱使网络设备进展数据发送操作。2)接收流程网络设备接收数据主要是由中断引发设备的中断处理函数,中断处理函数推断中断类 型,假设为接收中断,则读取承受到的数据,安排sk_buff数据构造和数据缓冲区,将接收 到的数据复制到数据缓冲区,并调用netifjx函数将sk_buff传递给上层协议。73、cs8900. c的驱动中,发送数据frame的过程为什么需要关中断?接收数据frame的过程 为什么不需要关中断?答:在发送过程中是不能被打断的,在
28、发送的过程中,不关中断,这时候假设有一个中断到 来,那么cpu有可能会去相应当中断,假设该中断需要改写的数据是发送数据的缓冲区,那 么缓冲区将被改写,这样即使cpu相应完毕该中断,再发送数据,接收方也不生疏该数据不 能接收。在接收数据的时候,需要翻开中断,是由于要准时的相应接收到的数据假设关闭该中断, 那么接收方有可能由于相应优先级高的中断而接收不到该数据。74、简洁描述skbuff这个数据构造在网络构造中所起到的作用,为什么需要一个skbuff, 它的安排和释放主要都在什么部位答:sk buff构造格外重要,它的含义为“套接字缓冲区”,用于在linux网络子系统中的 各层之间传递数据。当发送
29、数据包时,linux内核的网络处理模块必需建立一个包含要传输的数据包的sk buf,5、insmod 一个驱动模块,会执行模块中的哪个函数? rmmod呢?这两个函数在设计上要留 意哪些?遇到过卸载驱动消灭特别没?是什么问题引起的?答:insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要留意什么?卸载 模块时曾消灭卸载失败的情形,缘由是存在进程正在使用模块,检查代码后觉察产生了死锁 的问题。评:要留意在init函数中申请的资源在exil函数中要释放,包括存储,ioremap,定时器, 工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留
30、下一点痕迹。6、在驱动调试过程中遇到过。ops没?你是怎么处理的?7、ioctl 和 unlock_ioctl 有什么区分?驱动中操作物理确定地址为什么要先ioremap?答:由于内核没有方法直接访问物理内存地址,必需先通过iorcmap获得对应的虚拟地址。9、设备驱动模型三个重要成员是? platfoem总线的匹配规章是?在具体应用上要不要先注 册驱动再注册设备?有先后挨次没?10. linux中内核空间及用户空间的区分?用户空间与内核通信方式有哪些?11、linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化,高端内 存概念?12、linux中中断的实现机制,taskle
31、t与workqueue的区分及底层实现区分?为什么要区 分上半部和下半部?13. linux中断的响应执行流程?中断的申请及何时执行(何时执行中断处理函数)?14、linux中的同步机制? spinlock与信号量的区分?15、linux 中 RCU 原理?16s linux中软中断的实现原理?17. linux系统实现原子操作有哪些方法?18、MIPS Cpu中空间地址是怎么划分的?如在uboot中如何操作设备的特定的存放器?19s linux中系统调用过程?如:应用程序中read在linux中执行过程即从用户空间到内核 空间?20、linux内核的启动过程(源代码级)?21、linux调度
32、原理?22、linux网络子系统的生疏?23、linux内核里面,内存申请有哪几个函数,各自的区分?Kmalloc_get_free_mempool_create. IRQ和FIQ有什么区分,在CPU里面是是怎么做的?24 .中断的上半局部和下半局部的问题:讲下分成上半局部和下半局部的缘由,为何要分? 讲下如何实现?上半局部执行与硬件相关的处理要求快,而有些驱动在中断处理程序中又需要完成大量工 作,这构成冲突,所以Linux有所谓的bottom half机制,中断处理程序中全部不要求马上完 成的,在开中断的环境下,由底半程序随后完成.Linux的底半处理实际上是建立在内核的软中断机制上的Lin
33、ux的底半机制主要有Tasklet和work queue以及softirq ( 2. 4内核则有BH , Task queue , softirq , tasklet没有work queue),其实底半可以理解成一种工作的延迟。所 以实际使用时跟timer机制根本上一个意思。25 .内核函数mmap的实现原理,机制?mmap函数实现把一个文件映射到一个内存区域,从而我们可以像读写内存一样读写文件, 他比单纯调用rcad/writc也要快上很多。在某些时候我们可以把内存的内容拷贝到一个文 件中实现内存备份,固然,也可以把文件的内容映射到内存来恢复某些效劳。另外,mmap 实现共享内存也是其主要应
34、用之一,mmap系统调用使得进程之间通过映射同一个一般文件 实现共享内存。26 .驱动里面为什么要有并发、互斥的把握?如何实现?讲个例子?27 . spinlock自旋锁是如何实现的?自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界 区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定效劳。这里也介绍下信号量的概念,由于它的用法和自旋锁有相像的地方。linux中的信号量 是二种睡眠锁。假设有三个任务试图获得二个已被持有的信号量时,信号量会将其推入等待队 列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放 后
35、,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。28 .任务调度的机制?29 .嵌入式linux和wince操作系统的特点和特性?30 .嵌入式linux中tty设备驱动的体系构造?31 .嵌入式设备,为加快启动速度,可以做哪些方面的优化?32 . USB设备的枚举过程?(1) Get Device Descriptor。主机的第一个命令要求得到设备描述符,此SETUP包为8个 字节数据(80, 06, 00, 01, 00, 00, 40, 00),发向地址0,端口 0。“40”表示返回数 据长度最大为40H个字节。实际上,只返回个包,即数组DEV_DESC中的前8个字节, 用于
36、说明设备的描述符的真实长度和设备的类型。(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),与上次不同的是,要求的数据的长度是实际的数据长度,同时是发 送到
37、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),设置接I I值 为0oSet Conifguration,确定USB设备工作在哪一个配置下。对于U盘设备来说,一般只 有1个配置值,其值为01。主机发送数据包(00, 09, 01, 00
38、, 00, 00, 00, 00)。(7)假设以上步骤都正确,主机将找到设备,并且配置成功,该设备可以正常使用,可以进 展后续的U盘枚举过程了。(8)用busHound观看计算机对于U盘的枚举过程,觉察上述步骤后还有一个GetMaxLun的 榻作.伯昂文麻卜对干IJ拗来说王初该方出沿有何颗C. PSRAM、SDRAM DDR、DDR2 的时序特性?33 .什么是GPIO?general purpose input/outputGPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高 或低电平使用,固然某个脚具有复用的功能,即可做GPIO也可做其他用途。也就是说你可
39、以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led的 一极来把握它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状 态,这给epu供给了 一个便利的把握周边设备的途经。假设没有足够多的gpi。管脚,在控 制些外围设备时就会力有不逮,这时可实行的方案是使用CPLD来帮助治理。34 .触摸屏的硬件原理?触摸屏的主要三大种类是:电阻技术触摸屏、外表声波技术触摸屏、电容技术触摸屏。电 阻触摸屏的主要局部是一块与显示器外表格外协作的电阻薄膜屏,这是一种多层的更合薄 膜,它以一层玻璃或硬塑料平板作为基层,外表图有层透亮氧化金属 UT0K化锢,透 亮的导电电阻)导电层,上
40、面在盖有一层外外表硬化处理、光滑防擦的塑料层、它的内外 表也涂有一层1T0涂层、在他们之间有很多细小的(小于1/1000英寸)的透亮隔离点把两 层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,把握器侦 测到这接触并计算出(X, Y )的位置,再依据模拟鼠标的方式运作。这就是电阻技术触 摸屏的最根本的原理。外表声波技术是利用声波在物体的外表进展传输,当有物体触摸到外表时,阻碍声波的传输, 换能器侦测到这个变化,反映给计算机,进而进展鼠标的模拟。电容技术触摸屏利用人体的电流感应进展工作。用户触摸屏幕时,由于人体电场,用户和 触摸屏外表形成以一个耦合电容,对于高频电流来说,电容
41、是直接导体,于是手指从接触 点吸走一个很小的电流.在Linux C中,1s这个命令是怎么被执行的?使用fork创立一个进程或exec函数族掩盖原进程。35 .在一个只有128M内存并且没有交换分区的机器上,说说下面两个程序的运行结果 1define MEMSIZE 1024*1024int count = 0;void *p = NULL;while(l) p = (void *)malloc(MEMSIZE);if (!p) break;prinlf ( Current al 1 ocation %d MBn , +count);)2while(l) if (!p) break;memset
42、(p, 1, MEMSIZE);printf( MCurrent al location %d MBn a, +count);)第一道程序安排内存但没有填充,编译器可能会把内存安排优化掉,程序死循环:其次道, 程序安排内存并进展填充,系统会始终安排内存,直到内存缺乏,退出循环。36 .请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句搞的比较简洁。主要思想就是a-b的值的最高位是否为0;但是乂得考虑整数溢出的问题, 所以很简洁。不知道哪位大侠有更好的方法,教育教育。#includedefine ZHENG(i) (i 31)= 0)define FU(i)(i 31)!= 0)
43、define COMPARE(a, b)(ZHENG(a)& FU(b)|(ZHENG(a)&ZHENG(b) H (Fl(a)&FC(b)&(a)-(b) 3l)= 0)void mainint a = 0x80000001;int b = 0x6FFFFFFF;if (COMPARE (a, b)printf( e bn );else(printf ( a bn );I40、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?请从C/C+语言开 发的角度描述,至少说出两点共同点。 参考答案:第1题,答中一个得5分,答出其它正确答案的,也得5分。a)都基于TCP/
44、IP协议,都供给了面对连接的TCP SOCK和无连接的UDP SOCK。b)都是一个sock构造体。c)都是使用sock文件句柄进展访问。d)都具有缓冲机制。41、请编写一个标准Shell脚本testd,实现如下功能:A、在Linux操作系统启动的时候,自动加载/mnt/test/test程序。B、当test特别退出之后,自动重启动。C、当test程序重启次数超过100次,自动复位操作系统。假设你所拥有的资源:A、目标机器是一台具有标准shell的嵌入式计算机,CPU为ARM7 56MB,内存16MB,软件 环境基于Linux2. 6. 11 和BusyBoxl.2 构建。B、当前已有11个用
45、户进程在运行,占用了大局部的CPL时间和内存,你可使用的内存只有 2MB左右,CPU时间由系统分派。此题是考察LINUX和嵌入式编程功底的,写出程序来的不少,但是95%以上的人竟无视我假 设的资源,不知道在重启lesi程序的时候需要加上一个适当的掩饰时间,以便资源紧急的操 作系统有时间回收资源。85%的人不知道写完testd之后,要在init里边加载这个脚本,才 能实现启动时自动加载的功能。参考答案:#Stestd is a daemon script to start an watch the program test#!/bin/sh#load *. so that may needif
46、-r /sbin/ldconfig ; thenIdconfigfi#add the libs PATH that may needexport LD_L1BRARY_PATH= /lib “#count is the counter of test started timescount=0#main loopwhile 1 ;do#add execute property for /mnt/test/tostchmod +x /mnt/test/test#start test/mnt/test/test#lhe running times counterlet count=counl+lec
47、ho utest running times isScount “#Is test running too manytimes?if “$count ” -gt 100 ; thenecho “Will reboot because of test running too manytimes urebootfi#wait for test stoping.sleep 3clone即# 的#附附# 附.你寻常是怎么用C写嵌入式系统的死循环的?42 .写一条命令,实现在dir以及其子名目下找出全部包含hello world字符串的文件.下面的两段程序中,循环能否执行?为什么?A: unsigned short i; unsigned short index = 0; for (i = 0; iindexT; i+) ( printf( “an );)unsigned short i; unsigned long index = 0; for (i = 0; i QndexT; i+) printf ( “bn”); 45. 一个打算跑LINUX系统的ARM系统把boot loader烧录进去后,上电后串口
限制150内