2015-05-27 11:07:55 mz454619501 阅读数 302
  • SSH面试和笔试指导

    由于SSH部分内容庞杂,各大高校和培训机构在教学中存在着大量的问题。如重点不突出、理解错误等。为了便于大家掌握SSH的重点知识,在面试和笔试中轻松通过,肖老师整理了大量的重要试题,并进行了详细讲解!

    9326 人正在学习 去看看 肖海鹏
在一个只有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);
}

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


函数原型:

extern void *malloc(unsigned int num_bytes);

头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)

功能:分配长度为num_bytes字节的内存块

说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

当内存不再使用时,应使用free()函数将内存块释放。

返回值可以强制转换为任何类型;




2016-07-12 12:26:29 caochenxian 阅读数 4799
  • SSH面试和笔试指导

    由于SSH部分内容庞杂,各大高校和培训机构在教学中存在着大量的问题。如重点不突出、理解错误等。为了便于大家掌握SSH的重点知识,在面试和笔试中轻松通过,肖老师整理了大量的重要试题,并进行了详细讲解!

    9326 人正在学习 去看看 肖海鹏

linux驱动笔试题总结

试题取之于网络,用之于民。最近在学习linux驱动,驱动开发在笔试的时候考的知识点是有规律可循的,并且这些面点也是平时驱动工作中的理论指导,深刻的理解这些面点还是很有必要的,所以在此总结记录,相信会用到的。
ps:以后面试驱动,谁在问我这些问题,我鄙视死他。权威答案整蒙b他。


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

答:
-在32位架构cpu中,物理内存大小限制在4G。linux将4G内存分为两部分,0~1G为kernel使用,1~4G为用户使用;进程运行在kernel,就是运行在0-1G,进程运行在用户空间,就是运行在1-4G。
-用户空间和内核空间通信方式有那些?
1. 使用API:这是最常使用的一种方式了
A.get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中。
B.put_user(x,ptr):在内核中被调用,将内核空间的变量x的数值保存到到用户空间指定地址处。
C.Copy_from_user()/copy_to_user():主要应用于设备驱动读写函数中,通过系统调用触发。
2. 使用proc文件系统:和sysfs文件系统类似,也可以作为内核空间和用户空间交互的手段。
3. netlink
4. 使用mmap系统调用
5. 信号
内核空间和用户空间通信方式

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

 1. 用户虚拟地址
     这是在用户空间进程所能看到的常规地址。每个进程多有自己的虚拟地址,并且可以使用大于物理内存大小的空间。
 2. 物理地址
     该地址在处理器和系统内存之间使用,对应与真是物理地址。
 3. 总线地址
     没看懂,不说了。
 4. 内核逻辑地址
     内核逻辑地址组成了内核的常规地址空间。该地址映射了部分(或者全部)内存,并经常被视为物理地址。
     逻辑地址使用硬件内建的指针大小,因此在安装了大量内存的32位系统中,它无法寻址全部的物理内存。
     逻辑地址通常保存在unsigned long或者void *这样类型的变量中。kmalloc返回的内存就是内核逻辑地址。
     (上面这段话很重要,一定要理解,建议自己使用记号笔标红)
 5. 内核虚拟地址
     内核虚拟地址与物理地址的映射不必是一对一的,而这是虚拟地址的特点。

     所有逻辑地址都是内核虚拟地址,但是许多内核虚拟地址不是逻辑地址。vmalloc分配的内存就是一个虚拟地址。
     可以参考下面的地址:  

内存详解

内存结构图

总结:高端内存的作用就是用于建立临时地址映射,用于kernel申请user空间内存

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

答:
tasklet和workqueue区别?
tasklet运行于中断上下文,不允许阻塞 、休眠,而workqueue运行与进程上下文,可以休眠和阻塞。
为什么要区分上半部和下半部?
中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此,为了避免被中断的代码延迟太长的时间,中断服务程序需要尽快运行,而且执行的时间越短越好,所以中断程序只作必须的工作,其他工作推迟到以后处理。所以Linux把中断处理切为两个部分:上半部和下半部。上半部就是中断处理程序,它需要完成的工作越少越好,执行得越快越好,一旦接收到一个中断,它就立即开始执行。像对时间敏感、与硬件相关、要求保证不被其他中断打断的任务往往放在中断处理程序中执行;而剩下的与中断有相关性但是可以延后的任务,如对数据的操作处理,则推迟一点由下半部完成。下半部分延后执行且执行期间可以相应所有中断,这样可使系统处于中断屏蔽状态的时间尽可能的短,提高了系统的响应能力。实现了程序运行快同时完成的工作量多的目标。

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

中断的响应流程:cpu接受终端->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。
中断的申请request_irq的正确位置:应该是在第一次打开 、硬件被告知终端之前。

5:linux中的同步机制?spinlock与信号量的区别?

linux中的同步机制:自旋锁/信号量/读取所/循环缓冲区
spinlock在得不到锁的时候,程序会循环访问锁,性能下降
信号量在得不到锁的时候会休眠,等到可以获得锁的时候,继续执行。

2019-06-14 22:57:41 Qinus 阅读数 638
  • SSH面试和笔试指导

    由于SSH部分内容庞杂,各大高校和培训机构在教学中存在着大量的问题。如重点不突出、理解错误等。为了便于大家掌握SSH的重点知识,在面试和笔试中轻松通过,肖老师整理了大量的重要试题,并进行了详细讲解!

    9326 人正在学习 去看看 肖海鹏

linux驱动面试题2018(面试题整理,含答案)

版权声明:本文为博主原创文章,未经博主允许不得转载。 

转载请标明原址:https://blog.csdn.net/kai_zone/article/details/82021233

      前言: 这篇文章主要是对linux驱动面试题一个整理跟总结,参考了很多网上的资料,基本涵盖linux驱动相关面试内容。我把他们大概的分为三部分:基础部分,同步相关,还有中断部分。中断,同步相关基本都是必问的。下面也会对这几个方面的面试题进行详细的解答,你把下面的面试题弄懂了,应该可以应付大部分linux驱动面试了。要想真正的理解,还的在实践中多动手调试多总结,如果有什么地方错了或者不全,欢迎小伙伴们留言。

 

一.  基础题:

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

https://blog.csdn.net/bingqingsuimeng/article/details/7924756

2. 字符设备和块设备的区别,请分别列举一些实际的设备说出它们是属于哪一类设备

     字符设备字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。

    块设备和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备上能够容纳文件系统,如:u盘,SD卡,磁盘等。

    字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。

3. linux内核的启动过程(源代码级)?

https://www.cnblogs.com/CrazyCatJack/p/6135435.html

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

https://blog.csdn.net/kai_zone/article/details/80459334

https://my.oschina.net/haomcu/blog/468656

5. linux调度原理?

https://blog.csdn.net/janneoevans/article/details/8125106

6. 查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?

   1) 查看驱动模块中打印信息的命令:dmesg

   2) 查看字符设备信息可以用lsmod 和modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的        模块。

   3) 显示当前使用的中断号cat /proc/interrupt

7. copy_to_user()和copy_from_user()主要用于实现什么功能?一般用于file_operations结构的哪些函数里面?

       由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存数据交换作用的函数。当然,如果ioctl没有用到内存数据复制,那么就不会用到这两个函数。

8. 请简述主设备号和次设备号的用途。如果执行mknod chartest c 4 64,创建chartest设备。请分析chartest使用的是那一类设备驱动程序。

1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允许多个驱动程序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。

     次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。

2)chartest 表示设备节点,4表示主设备号,64表示次设备号。(感觉类似于串口终端或者字符设备终端)。

9. 设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。

    注册一个字符设备驱动有两种方法:

    1) void cdev_init(struct cdev *cdev, struct file_operations *fops)

    该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于f       file_operations结构(可以是file_operations结构,但不限于该结构)的指针.

    2) int register_chrdev(unsigned int major, const char *namem , struct file)operations *fopen);

        该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这       是只限于file_operations结构)。对于register_chrdev的调用将为给定的主设备号注册0-255作为次设备号,并为每个  设备建     立一个对应的默认cdev结构。

10. linux中RCU原理?

      https://www.cnblogs.com/-wang-cheng/p/5401653.html

11. linux内存如何划分以及如何使用?虚拟地址及物理地址的概念以及转换,高端内存的概念?

      https://www.cnblogs.com/dongzhiquan/p/5621906.html

      https://www.cnblogs.com/wuchanming/p/4360277.html

12. 字符型驱动设备怎么创建设备文件?

     手动创建:mknod /dev/led c 250 0    其中dev/led 为设备节点 c 代表字符设备 250代表主设备号 0代表次设备号

     还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。在  /etc/init.d/rcS 脚本文件中会执行 mdev -s 自动创建设备节点。

13. insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?

     答: insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

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

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

        设备驱动模型三个重要成员是 总线、设备、驱动;

         platfoem总线的匹配规则是:要匹配的设备和驱动都要注册,设备可以在设备树里注册,也可以通过代码注册设备,匹配成功会去调用驱动程序里的probe函数(probe函数在这个platform_driver结构体中注册)。

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

      https://blog.csdn.net/yinjiabin/article/details/7575653

      https://blog.csdn.net/edwardlulinux/article/details/8604400 

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

       https://blog.csdn.net/kangear/article/details/8217329

17. ioctl和unlock_ioctl有什么区别?

     https://blog.csdn.net/zhuangtim1987/article/details/41963411

     https://blog.csdn.net/cbl709/article/details/7295772

18. 驱动中操作物理绝对地址为什么要先ioremap?

   因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址

   https://blog.csdn.net/zqixiao_09/article/details/50859505

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

      for(;;){}  

      while(1){}

     一般for(;;)性能更优

     for(;;){}  

     这两个;; 空语句,编译器一般会优掉的,直接进入死循环

    while(1){}  

    每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事

    不过从汇编的角度来说,都是一样的代码。

20. 列举最少3种你所知道的嵌入式的体系结构,并请说明什么是ARM体系结构。

     arm,mips,x86

    https://blog.csdn.net/qq_32651225/article/details/78176567

    https://blog.csdn.net/chengtong222/article/details/64440661

21. kmalloc和vmalloc的区别

     https://www.cnblogs.com/hongzhunzhun/p/4533960.html

     https://www.cnblogs.com/wuchanming/p/4465155.html

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

     https://blog.csdn.net/kai_zone/article/details/78026931

     https://blog.csdn.net/kai_zone/article/details/78029501

23.  kernel panic

     https://www.cnblogs.com/cherishui/p/3881428.html

24.  Linux中的用户模式和内核模式是什么含意?

     https://blog.csdn.net/sinat_15799399/article/details/44238893

25.  怎样申请大块内核内存?

       vmalloc

26. 用户进程间通信主要哪几种方式?

    https://blog.csdn.net/wh_sjc/article/details/70283843

27.linux编译时用到的参数含义及?

    https://blog.csdn.net/taoyanqi8932/article/details/51758722

28. 内核配置编译及Makefile?

      https://www.cnblogs.com/CrazyCatJack/p/6121231.html

29.谈谈对Volatile关键字的理解?

https://blog.csdn.net/kai_zone/article/details/77965302

30.  framebuffer机制?

      Linux抽象出FrameBuffer这个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显卡硬件结构抽象掉,可以通过Framebuffer的读写直接对显存进行操作。用户可以将Framebuffer看成是显示内存的一个映像,通过mmap将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。用户不必关心物理显存的位置、换页机制等等具体细节,这些都是由Framebuffer设备驱动来完成的。通过mmap调用把显卡的物理内存空间映射到用户空间

二.  同步相关:

1.  spinlock与信号量的区别?

      https://blog.csdn.net/xiaohuima_dong/article/details/46423793

      https://www.cnblogs.com/tureno/articles/6067441.html

2.  linux中的同步机制?

     https://blog.csdn.net/waltonhuang/article/details/52212762

     https://blog.csdn.net/tong646591/article/details/8484596

3.  linux系统实现原子操作有哪些方法?

https://www.cnblogs.com/fanzhidongyzby/p/3654855.html

https://blog.csdn.net/vividonly/article/details/6599502

4.  自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么(答案见1分析)?

    答:使用自旋锁的进程不能睡眠,使用执行时间短的任务,使用信号量的进程可以睡眠,适合于执行时间较长的任务。中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的,这样会丢失可能到来的中断。

5. 驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?

      并发(concurrency)指的是多个执行单元同时、并行被执行,而并发的执行单元对共 享资源(硬件资源和软件上的全局变量、静态变量等)的访问则很容易导致竞态(race conditions)。

       解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问就是指一个执行单元 在访问共享资源的时候,其他的执行单元都被禁止访问。

访问共享资源的代码区域被称为临界区,临界区需要以某种互斥机 制加以保护,中断屏蔽,原子操作,自旋锁,和信号量都是linux设备驱动中可采用的互斥途径。

 

三.  中断相关:

可以先看一下五篇系列文章:https://blog.csdn.net/droidphone/article/category/1118447

      这篇我收藏的文档详细的叙述了中断上半部及下半部的原理及注意点,如果对其不理解可以下载下来看看,由于CSDN最低没有0积分,那就最低的一个积分吧。下载地址:https://download.csdn.net/download/kai_zone/10631972

1.  linux中软中断的实现原理?

      https://blog.csdn.net/DroidPhone/article/details/7518428   

      https://www.linuxidc.com/Linux/2014-03/98013.htm

2. linux中断响应的执行流程

     https://blog.csdn.net/yimu13/article/details/6803957

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

  (中断上半部及下半部详细文档:https://download.csdn.net/download/kai_zone/10631972

tasklet和workqueue区别? 
tasklet运行于中断上下文,不允许阻塞 、休眠,而workqueue运行与进程上下文,可以休眠和阻塞。 
为什么要区分上半部和下半部? 
中断服务程序异步执行,可能会中断其他的重要代码,包括其他中断服务程序。因此,为了避免被中断的代码延迟太长的时间,中断服务程序需要尽快运行,而且执行的时间越短越好,所以中断程序只作必须的工作,其他工作推迟到以后处理。所以Linux把中断处理切为两个部分:上半部和下半部。上半部就是中断处理程序,它需要完成的工作越少越好,执行得越快越好,一旦接收到一个中断,它就立即开始执行。像对时间敏感、与硬件相关、要求保证不被其他中断打断的任务往往放在中断处理程序中执行;而剩下的与中断有相关性但是可以延后的任务,如对数据的操作处理,则推迟一点由下半部完成。下半部分延后执行且执行期间可以相应所有中断,这样可使系统处于中断屏蔽状态的时间尽可能的短,提高了系统的响应能力。实现了程序运行快同时完成的工作量多的目标。

4. 中断的申请及何时执行(何时执行中断处理函数)?

    中断的响应流程:cpu接受中断->保存中断上下文跳转到中断处理历程->执行中断上半部->执行中断下半部->恢复中断上下文。 
中断的申请request_irq的正确位置:应该是在第一次打开 、硬件被告知终端之前。

5. 中断注册函数和中断注销函数

    https://www.cnblogs.com/lifexy/p/7506613.html

6. 中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?

    中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,并且该设备请求cpu的频率比较底,则用中断效率要高一些。主要是看请求频率。

7. 写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?

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

     写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后退出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。

    第二:中断服务程序中不能有阻塞操作。应为中断期间是完全占用CPU的(即不存在内核调度),中断被阻塞住,其他进程将无法操作;

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

8. 驱动中操作物理绝对地址为什么要先ioremap?

    因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址

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

     https://blog.csdn.net/u011308691/article/details/46476985

10. Linux软中断和工作队列的作用是什么?

      https://blog.csdn.net/godleading/article/details/52971179

 

参考文章:http://www.mamicode.com/info-detail-2283409.html

                  https://blog.csdn.net/suiyuan19840208/article/details/20392151

                  https://blog.csdn.net/zqixiao_09/article/details/50937907

                  https://blog.csdn.net/lhhero701/article/details/51171948

       

2018-05-05 14:12:00 weixin_33796177 阅读数 90
  • SSH面试和笔试指导

    由于SSH部分内容庞杂,各大高校和培训机构在教学中存在着大量的问题。如重点不突出、理解错误等。为了便于大家掌握SSH的重点知识,在面试和笔试中轻松通过,肖老师整理了大量的重要试题,并进行了详细讲解!

    9326 人正在学习 去看看 肖海鹏

1、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。

    字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。

    块设备:和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备上能够容纳文件系统,如:u盘,SD卡,磁盘等。

    字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。

 

2、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?

1) 查看驱动模块中打印信息的命令:dmesg

2) 查看字符设备信息可以用lsmod modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的模块。

3) 显示当前使用的中断号cat /proc/interrupt


3、Linux中引入模块机制有什么好处?

       首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结束。换句话说,模块初始化函数的任务就是为以后调用函数预先作准备

好处:

1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却必须仔细此撤销初始化函数所作的一切。

2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。

 

4、copy_to_user()和copy_from_user()主要用于实现什么功能?一般用于file_operations结构的哪些函数里面?

      由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存数据交换作用的函数。当然,如果ioctl没有用到内存数据复制,那么就不会用到这两个函数。

 

5、请简述主设备号和次设备号的用途。如果执行mknod chartest c 4 64,创建chartest设备。请分析chartest使用的是那一类设备驱动程序。

1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允许多个驱动程序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。

   次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。

2)chartest 由驱动程序4管理,该文件所指的设备是64号设备。(感觉类似于串口终端或者字符设备终端)。


6、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。

注册一个字符设备驱动有两种方法:

1) void cdev_init(struct cdev *cdev, struct file_operations *fops)

该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于file_operations结构(可以是file_operations结构,但不限于该结构)的指针.

2) int register_chrdev(unsigned int major, const char *namem , struct file)operations *fopen);

该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这是只限于file_operations结构)。对于register_chrdev的调用将为给定的主设备号注册0-255作为次设备号,并为每个设备建立一个对应的默认cdev结构

 

7、请简述中断于DMA的区别。Linux设备驱动程序中,使用哪个函数注册和注销中断处理程序?

1)DMA:是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制,使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率.

      中断:是指CPU在执行程序的过程中,出现了某些突发事件时CPU必须暂停执行当前的程序,转去处理突发事件,处理完毕后CPU又返回源程序被中断的位置并继续执行。

     所以中断和DMA的区别就是DMA不需CPU参与而中断是需要CPU参与的

 

2)中断注册函数和中断注销函数

注册中断:

int request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *dev_name, void *dev_id);

参数意义依次是:中断号,中断处理函数,中断管理有关的掩码,中断请求设备名,中断信号线。

过程是:dev_name设备请求中断->cpu分配中断号->设置中断管理的掩码->分配中断信号线->处理中断函数->完成之后再根据设置情况返回原处理程序处继续处理程序。

注销中断

Void free_irq(unsigned int irq, void *dev_id);

释放中断和中断信号线

 

8、中断和轮询哪个效率高?怎样决定是采用中断方式还是采用轮询方式去实现驱动?

     中断是CPU处于被动状态下来接受设备的信号,而轮询是CPU主动去查询该设备是否有请求。凡事都是两面性,所以,看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率是比中断高。如果是一般设备,并且该设备请求cpu的频率比较底,则用中断效率要高一些。主要是看请求频率

 

9、简单描述在cs8900的驱动设计中, 发送数据frame和接收数据frame的过程。

1)发送流程如下:

(1) 网络设备驱动程序从上层协议传递过来的sk_buff参数获得数据包的有效数据和长度,将有效数据放入临时缓冲区。
(2) 对于以太网,如果有效数据的长度小于以太网冲突检测所要求的数据桢的最小长度,则给临时缓冲区的末尾填充0
(3) 设置硬件寄存器,驱使网络设备进行数据发送操作。

2)接收流程

   网络设备接收数据主要是由中断引发设备的中断处理函数,中断处理函数判断中断类型,如果为接收中断,则读取接受到的数据,分配sk_buff数据结构和数据缓冲区,将接收到的数据复制到数据缓冲区,并调用netif_rx()函数将sk_buff传递给上层协议。


10、Cs8900.c的驱动中,发送数据frame的过程为什么需要关中断?接收数据frame的过程为什么不需要关中断?

       在发送过程中是不能被打断的,在发送的过程中,不关中断,这时候如果有一个中断到来,那么cpu有可能会去相应该中断,如果该中断需要改写的数据是发送数据的缓冲区,那么缓冲区将被改写,这样即使cpu相应完毕该中断,再发送数据,接收方也不认识该数据不能接收。

      在接收数据的时候,需要打开中断,是因为要及时的相应接收到的数据。如果关闭该中断,那么接收方有可能因为相应优先级高的中断而接收不到该数据。

 

11、简单描述skbuff这个数据结构在网络结构中所起到的作用,为什么需要一个skbuff,它的分配和释放主要都在什么部位

        sk_buff结构非常重要,它的含义为“套接字缓冲区”,用于在linux网络子系统中的盖层之间传递数据。

当发送数据包时,linux内核的网络处理模块必须建立一个包含要传输的数据包的sk_buff,然后将sk_buff递交给下层,各层在sk_buff中添加不同的协议头直至交给网络设备发送。同样的,当网络设备从网络媒介上接受到数据包后,它必须将接受到的数据转换为sk_buff数据结构并传递给上层,盖层不抛去相应的协议头直至交给用户。分配sk_buff在接受一开始就应该分配,在发送完毕数据之后可以释放sk_buff

 

12、字符型驱动设备怎么创建设备文件

        手动创建:mknod /dev/led c 250 0    其中dev/led 为设备节点 c 代表字符设备 250代表主设备号 0代表次设备号

       还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后。在  /etc/init.d/rcS 脚本文件中会执行mdev -s 自动创建设备节点。

 

13、写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的?

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

     写一个中断服务程序要注意快进快出,在中断服务程序里面尽量快速采集信息,包括硬件信息,然后退出中断,要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。

第二:中断服务程序中不能有阻塞操作。应为中断期间是完全占用CPU的(即不存在内核调度),中断被阻塞住,其他进程将无法操作;

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

 

14、自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用?为什么?

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

      中断服务例程中的互斥使用的是自旋锁,原因是在中断处理例程中,硬中断是关闭的;但是要注意这样会丢失可能到来的中断。

 

15、原子操作你怎么理解?为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行?

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

        第二句话的意思是:

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

   if(flag == 0)
  {
       flag = 1;


       操作临界区;
      flag = 0;
   }

 

16、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?

        insmod调用init函数,rmmod调用exit函数。这两个函数在设计时要注意什么?卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

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

 

17、驱动中操作物理绝对地址为什么要先ioremap?

        因为内核没有办法直接访问物理内存地址,必须先通过ioremap获得对应的虚拟地址

 

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

         设备驱动模型三个重要成员是 总线、设备、驱动;

         platfoem总线的匹配规则是:要匹配的设备和驱动都要注册;

 

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

         Kmalloc()   __get_free_page()  mempool_create()  

 

20、 IRQ和FIQ有什么区别,在CPU里面是是怎么做的


21

int *a;
char *b;

a 和 b本身是什么类型?

a、b里面本身存放的只是一个地址,难道是这两个地址有不同么?


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

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

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

两种方式

【tasklet  工作队列】

1.定义和初始化

struct tasklet_struct tlet;

tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
参数
第一个:定义的tasklet变量
第二个:函数
第三个:数据  传递给回调函数的数据

2. 定义函数

void jit_tasklet_fn(unsigned long arg)
{
//中断的底半部 执行该函数的时候,已经出中断了
printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies);
}

3. 在需要调度的地方调用以下函数

tasklet_schedule(&tlet);

   一般在中断函数当中调度在不晚于下一个时钟滴答之前执行


【tasklet 和定期器的区别】

1. 执行时间

定时器的执行:时间是确定的
tasklet       :不确定的

2.tasklet 执行耗时的操作的

 

23、内核函数mmap的实现原理,机制?

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

 

24、驱动里面为什么要有并发、互斥的控制?如何实现?讲个例子?

 

25、spinlock自旋锁是如何实现的?

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



26、信号量简介

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

       Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。

 

27、 任务调度的机制?

 

28、什么是GPIO?

         general purpose input/output  

         GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。 也就是说你可以把这些引脚拿来用作任何一般用途的输入输出,例如用一根引脚连到led的一极来控制它的亮灭,也可以用一根(一些)引脚连到一个传感器上以获得该传感器的状态,这给cpu提供了一个方便的控制周边设备的途经。如果没有足够多的gpio管脚,在控制一些外围设备时就会力有不逮,这时可采取的方案是使用CPLD来帮助管理。

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

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

 

30、LINUX下的Socket套接字和Windows下的WinSock有什么共同点?请从C/C++语言

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

b)都是一个sock结构体。

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

d)都具有缓冲机制。

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

 提示: 1.跑LINUX的系统一般都需要外扩DRAM,一般的系统也经常有NOR或NAND FLASH          

        bootloader一般是由汇编和C编写的裸奔程序[5分]

 

 

 

Linux内核与驱动面试要点

 

 

1. 实际经验:所开发驱动程序或内核模块的来龙去脉(需求、设计思想、实现方法、要点难点,特别是硬件调试过程中所遇到的特殊情况),所修复BUG的现象、调试手段、原因分析和解决方案。

2. 驱动调试:内核的调试手段、应用程序的调试手段(内核Panic所dump的信息以及Panic的分析、应用程序core dump的分析)。

3. 驱动基础:mknod与udev,module相关API,内核Makefile的编写,设备编号的申请,设备的注册,简单驱动的fops(open/read/write/ioctl/release),用户空间和内核空间的数据交换,阻塞操作的实现、select/poll的支持,mmap的实现,DMA机制及其注意事项。

4. 中断机制:Linux中断机制的内在逻辑,中断处理程序的实现要点,中断共享机制,中断上下文与进程上下文的区别(为什么在中断上下文中不能执行导致进程调度的函数)中断与异常的区别,中断的管理(开中断与关中断)。

5. 下半部:Linux下半部机制的必要性,三种类型下半部(softirq/tasklet/work queue)的区别与应用场景,三种下半部机制的API,中断处理程序、下半部以及进程上下文之间的同步问题。

6. 内核同步:内核中竞争与同步机制的内在逻辑,内核同步方法(原子操作/spinlock/信号量/读写锁/完成变量completionvariable/Seq_lock/Read-copy-update/Per-CPU变量/禁止内核抢占、中断和下半部/内存屏障)的内在逻辑、区别与应用场景。

7. 内存分配:Linux内存管理及分配机制(buddy system和slab等),kmalloc的原理、应用场景及参数,alloc_pages物理页面分配,高端内存映射,Per-CPU数据,alloc_bootmem启动时的内存分配。

8. 定时延时:内核定时、延时及等待机制(忙等待,内核定时器,schedule_timeout,等待队列、进程的阻塞与唤醒)

9. 电源管理:Linux内核的电源管理机制,驱动程序中电源管理的实现。

10. 驱动子系统:嵌入式系统中常用简单总线接口(I2C/SPI/UART/SDIO)驱动子系统,重点外设模块(MTD及其文件系统/MicroSD/LCD/Camera/Audio/网卡/WIFI/BT/USB/键盘与触屏)驱动子系统。

11. 硬件基础:ARM体系结构的基础知识(寄存器、运行模式、MMU、Cache、常用汇编指令),中断控制器,DMA控制器等,重点外设的硬件逻辑。

12. 进程管理:O(1)调度算法和CFS调度算法的思想与实现方法,优先级反转及其解决方法,内核抢占(禁止抢占、抢占时机),进程的管理(阻塞与唤醒、等待队列、调度、放弃CPU等),进程与线程的区别、内核线程与普通进程的区别。

13. 系统启动:内核启动详细顺序(上电 -> Bootloader -> start_kernel() -> 各内核子系统的启动 ->启动新线程Init用于启动系统[...] -> 启动新线程用于创建各内核线程 ->IDLE),模块INIT的实现机制(各种INIT宏所标识的函数的调用时机)。

14. 文件系统:Linux虚拟文件系统VFS的架构,文件open的过程(普通文件、字符设备、块设备)、系统调用open和字符设备驱动open函数的参数差异。

15. 其他知识:Makefile的编写/Shell编程/Busybox/GCC编译过程及其优化/GDB命令/动态链接库的链接方式/NPTL之线程管理接口/ELF/Linux的Log机制/变量在内存中的存储/Daemon进程/孤儿进程

 

 

 

 

常见linux驱动面试题

 

 

1、驱动中操作物理绝对地址为什么要先ioremap?
因为在内核中操作的都是虚拟地址,内核访问不到物理地址,只能通过ioremap映射为虚拟地址 内核才能访问此内存空间

2、设备驱动模型三个重要成员是?platform总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备?有先后顺序没?
设备驱动模型的三个重要成员是总线,驱动,设备。
platfoem总线的匹配规则是:要匹配的设备和驱动都要注册,驱动和设备的匹配规则如下
1.基于设备树风格的匹配
2.匹配ID表(即platform_device设备名是否出现在platform_driver的id表内)
3.匹配platform_device设备名和驱动的名字
4.基于ACPI风格的匹配

3、中断的上半部分和下半部分的问题:请说明分成上半部分和下半部分的原因,为何要分?该如何实现?
中断分成上半部分和下班部分的原因主要是因为内核要保证内核中进程的正常调度和运行,中断程序所以需要短小精悍,但是有些驱动在中断处理程序需要完成大量的工作,所以就很耗时。为了解决这个问题就Linux 将中断
处理程序分解为两个半部:顶半部(top half)和底半部(bottom half)。顶半部完成尽可能少的比较紧急的功能,底半部就由tasklet或者工作队列的方法实现 具体的实现效果如下

1.定义和初始化
struct tasklet_struct tlet;
tasklet_init(&tlet, jit_tasklet_fn, (unsigned long) data);
参数
第一个:定义的tasklet变量
第二个:函数
第三个:数据  传递给回调函数的数据

2. 定义函数
void jit_tasklet_fn(unsigned long arg)
{
//中断的底半部  执行该函数的时候,已经出中断了
printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies);
}
3. 在需要调度的地方调用以下函数
tasklet_schedule(&tlet);
   一般在中断函数当中调度在不晚于下一个时钟滴答之前执行

【tasklet 和定时器的区别】
1. 执行时间
定时器的执行:时间是确定的
tasklet:不确定的

2.tasklet 执行耗时的操作的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

   操作临界区;
  flag = 0;
  • 1
  • 2
  • 3

}

6、insmod 一个驱动模块,会执行模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?
insmod调用init函数,rmmod调用exit函数。这两个函数在设计时 要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器,工作队列等等。也就是一个模块注册进内核,退出内核时要清理所带来的影响,带走一切不留下一点痕迹。
卸载模块时曾出现卸载失败的情形,原因是存在进程正在使用模块,检查代码后发现产生了死锁的问题。

7、 copy_to_user()和copy_from_user()主要用于实现什么功能?一般用于file_operations结构的哪些函数里面?
由于内核空间和用户空间是不能互相访问的,如果需要访问就必须借助内核函数进行数据读写。copy_to_user():完成内核空间到用户空间的复制,copy_from_user():是完成用户空间到内核空间的复制。一般用于file_operations结构里的read,write,ioctl等内存数据交换作用的函数。当然,如果ioctl没有用到内存数据复制,那么就不会用到这两个函数。

8、请简述主设备号和次设备号的用途。如果执行mknod chartest c 4 64,创建chartest设备。请分析chartest使用的是那一类设备驱动程序。
1)主设备号:主设备号标识设备对应的驱动程序。虽然现代的linux内核允许多个驱动程序共享主设备号,但我们看待的大多数设备仍然按照“一个主设备对应一个驱动程序”的原则组织。

次设备号:次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将此设备号当作设备本地数组的索引。

2)chartest 由驱动程序4管理,该文件所指的设备是64号设备。(感觉类似于串口终端或者字符设备终端)。

9、设备驱动程序中如何注册一个字符设备?分别解释一下它的几个参数的含义。
注册一个字符设备驱动有两种方法:
1) void cdev_init(struct cdev *cdev, struct file_operations *fops)
该注册函数可以将cdev结构嵌入到自己的设备特定的结构中。cdev是一个指向结构体cdev的指针,而fops是指向一个类似于file_operations结构(可以是file_operations结构,但不限于该结构)的指针.

2) int register_chrdev(unsigned int major, const char *name , struct file_operations *fopen);
该注册函数是早期的注册函数,major是设备的主设备号,name是驱动程序的名称,而fops是默认的file_operations结构(这是只限于file_operations结构)。对于register_chrdev的调用将为给定的主设备号注册0-255作为次设备号,
并为每个设备建立一个对应的默认cdev结构。

10、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。
字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。

块设备:和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备上能够容纳文件系统,如:u盘,SD卡,磁盘等。

字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。

11、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号?、
1) 查看驱动模块中打印信息的命令:dmesg

2) 查看字符设备信息可以用lsmod 和modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的模块。

3) 显示当前使用的中断号cat /proc/interrupt

12、linux中引入模块机制有什么好处?
首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结束。换句话说,模块初始化函数的任务就是为以后调用函数预先作准备。
好处:
1) 应用程序在退出时,可以不管资源的释放或者其他的清除工作,但是模块的退出函数却必须仔细此撤销初始化函数所作的一切。
2) 该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。

 

 

 

 

  1. 二分查找
  2. 校验
  3. 关于字符串:
  4. 关于数据结构
  5. 关于其他简答题:
  6. 关于编程
    (一) 1.5n次比较,求出数组的最大值和最小值(数组乱序)
    (二) 环形缓冲区,用数据结构实现?
    (三) 链表的删除,头部插入,尾部插入实现?
    (四) 求出一个字符串的最长重复串,如“ababc”,返回“ab”
    (五) 求出一个周期字符串的最长周期,如“abcabc”,返回3
    (六) 使用C/C++实现一个单向链表,链表需要支持如下接口:
    (七) 网络字节序转换,大端小端。
    (八) 打开一个设备,读取文件,打印输出。
    (九) 给一个整数,转换为十六进制字符输出
    (十) 给在 32 位处理器上,将任一整数转换为二进制形式。
  7. C语言宏中”#”和”##”的用法
  8. 关于IPv6:
  9. Arm有多少32位寄存器?
  10. HAL层:硬件抽象层
  11. Arm2440和6410有什么区别?
  12. 开发板时钟(2410和6410对比)什么是PLL(锁相环):
  13. Arm开发板的资源,主频多大?内存多大?
  14. CPU,MPU,MCU,SOC,SOPC联系与差别
  15. 线程池怎么设计
    (一) 什么是线程池?
    (二) 为什么要用线程池?
    (三) 线程的工作流程
    (四) 线程池设计
  16. free函数怎么知道释放内存大小
  17. 构造函数和析构函数抛出异常
  18. tcp/udp上层网络协议举例并说明原理
    (一) HTTP:
    (二) TFTP:
  19. 关于内存泄漏
  20. 一个服务器对10000客户端,服务器上的线程模型
  21. 代码效率优化怎么搞
  22. GPIO三种状态:输入输出和高阻态
  23. 上拉和下拉:
  24. GPIO外部有三种情况:1)直接接地2)直接接电源3)悬挂。请问在GPIO内部可以实现上拉和下拉的情况下如何判断这三种情况?
  25. 串口协议讲一讲?
  26. RS232和RS485通讯接口有什么区别?
  27. IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?
  28. 讲解一下IIC总线
  29. Bootloader的流程
  30. 为什么2440的内存起始地址是3后面7个0呢?
  31. 为什么6410的内存起始地址是5后面7个0呢?
  32. 三个字节char型,上电为随机数,求三者之和为零的概率
  33. VS中Debug和Release的区别
  34. Zigbee的传输速率多大?(智能家居)为什么用它,和其他传输有什么区别?WIFI安全吗,为什么?
  35. 用户和内核如何通讯?(追问:驱动程序中如何从用户到内核)
  36. 计算机访问哪个最快?
  37. 线程和进程的区别?
  38. 设计模式有哪些?
  39. 软件的设计流程?
  40. 指针和引用的区别?
  41. 内存管理有什么看法?(MMU)
  42. 锁有哪些?有什么注意事项
  43. 信号量和自旋锁区别
  44. 中断能不能睡眠,为什么?下半部能不能睡眠?
  45. 上下文有哪些?怎么理解?
  46. 死锁产生的原因及四个必要条件
  47. 驱动中首先执行什么?
  48. 触摸屏和lCD驱动中做了什么,流程是什么?
  49. 输入子系统上报系统有什么函数?怎么知道有没有上报成功?
  50. 总线设备驱动模型之间是什么关系?设备和驱动之间的如何匹配,匹配规则是否可变?
  51. 什么是交叉编译?为什么需要交叉编译?为什么还要主机编译
  52. 简述linux系统启动过程
  53. Linux设备中字符设备和块设备有什么主要区别?分别举例。
  54. 主设备号和次设备号的用途
  55. Linux下rs232和rs485编程有什么区别?
  56. Uart和IIC和SPI的区别(提示:关于异步和同步,电子器件上的)?
  57. 用串口发送十个字节就丢失一个两个你会怎样检查;发送的时候对方设备不响应你该怎么办
  58. IIC,scl频率多大
  59. 触摸屏中断做了什么,LCD中断做了什么?
  60. zigbee用的哪家方案?zigbee端点类型有哪些,这些概念的区别?端点能够中转吗?一个端点上有哪些设备?你做的项目或者实践有多少节点?zigbee上有操作系统吗?
  61. 客户端是否单独连接服务器(客户端和客户端直接是否点对点连接)?客户端之间有没有交互?有没有考虑服务器进程如果崩溃了,客户端资源没有得到释放怎么做?那么如果服务器正常,客户端中途断开连接怎么办?如果发送文件,是直接点对点吗,也就是客户端之间直接通讯?线程池中线程之间是分离的吗?
  62. 没有使用MySQL之类的吗?sqlite是线程安全的吗
  63. 视频监控系统这个项目能不能做图像的简单处理,比如截取?网页中如果要打印换行符,怎么打印?这个项目中做的驱动中,你这个视频子系统用的是不是内核的?
  64. QT,用的熟吗?做的驱动有没有编入内核?既然没有编入内核,那是需要手动去启动和装载吗?需不需要创建设备节点?用户是如何访问这些驱动的?做的驱动都是字符设备吗?
  65. 你这个项目中zigbee用的是哪家的方案?控制设备有哪些?有多少节点?也就是说只是一对用于通讯是吗?。
  66. 线程和进程,为什么选择线程?线程为什么占用更少的资源?线程共享进程的哪些资源?线程池如何实现的?是不是什么都用线程比较好?
  67. 画一下Arm的体系架构
  68. 以下图片是哪种语言
  69. typedef struct _MAD_SYS_CONFIG{ MAD_U32 smiBase,…}MAD_SYS_CONFIG_t;
    typedef struct {MAD_U32 smiBase,…} MAD_SYS_CONFIG; 这两种写法是一个意思吗?
  70. 关注过哪些开源的东西?
  71. 内核定时器如何实现(通过链表)?如何找到具体的链表?
  72. 内核链表为什么具有通用性?
  73. 网盘妙传功能如何实现?
  74. 用户态和内核态通信方式?
  75. 分配内存哪些函数?kmalloc有两个参数,各个作用是什么?
  76. 有哪些锁,各自的效率问题?自选锁怎样实现的?
  77. 孤儿进程与僵尸进程[总结]和守护进程如何实现?
  78. 第三个项目是如何处理并发的,除了线程池还有更好的哪些方法?
  79. 主线程如何知道子线程的退出?
  80. 讲解下内核网络体系?
  81. 软中断是如何实现的?
  82. 对内存管理有什么看法和了解?
  83. 哈希表原理?针对字符串,如何确定key值(hash表存储字符串时,key怎么确定)?map怎样实现的?map和哈西表不一样吧?Hash和B树的区别?
  84. 接触过哪些STL容器?哪个效率最高?
  85. 写驱动的时候有没有遇到问题,怎么检查?有没有遇到coredump?
  86. 应用程序如果运行时出现错误该怎么排查;如果越界该怎么排查?
  87. open和fopen有什么区别?read/write和fread/fwrite区别?
  88. 线程池如何使用创建的?让你自己写一个线程池怎么实现?
  89. 主线程如何检测一个子线程也就是客户端的退出?如果现在让你实现可以浏览文件夹里文件再传输,你会怎么做?

 

我相信如果能搞懂以上问题,面试什么的便没有问题。

 

HR面试题

 

正常的HR面试:
平时喜欢干什么
高考情况,成绩,考研情况,成绩

 

特此列出部分我认为具有挑战性的问题:

 

中科创达HR面
1. 自我介绍下。被打断【她说不好意思注意回说谢谢,同时还要记得自己说到哪里】然后再次打断她没有让你继续自我介绍。到此自我介绍便结束。
2. 你家在哪,这些项目都是你做的吗?有没有让自己感到很挫败的事情?同学周围的人对你是怎么评价的?你的缺点是什么?【老掉牙的问题】
3. 分配任务,你和另外一个人合作,主要都是你做的,但是上级不知道,把功劳主要分给了另个人,你会怎么想。我首先讲了自己学习到的很多,并不会太在意!然后她追问:如果一直出现这个问题,你会怎么样。【先软后硬】
4. 分配一个任务,由你和另外一个人完成,你只能借助他完成,因为其能力比你强,如果他和你格格不入,你会怎么办?如果一直这样你会怎么办?【先自身后他人,结合团体公司利益阐述,最后可上升到公司层面
5. 我们公司有两种,一个是个人负责项目,成就感更好,一个是和同事一起做项目,你倾向于哪种?我说:可以和能力高于我的一起合作,并没有特定要求个人自己做。追问:如果有人能力不行怎么办?我说:没有关系,可以带。追问:不是托你后腿吗。我说:教同事,能提高自己,给予会带来回报,而且自己会的并不算真正会,把别人教会了才算。【注意这里的陷阱,一定要选择团队项目

 

中兴HR面
1. 你是如何完成一个分配给你的任务的?
2. 在你做的这些项目中有没有很难忘的困难或者经历,那你有没有想过,如果现在回想这个困难如何更好地去解决?【考察你的即时总结和部分记忆力的能力+真实性考察】
3. 这些项目都比较闲散,和真正工作的时候不一样,不能这块没有做好放一段时间,那你怎么办?【实战和训练的区别,可自由发挥】

 

博客写完,浙江大华和中兴的offer还没有消息,虽然手里有了9个offer,但是只有那几个是比较中意的。最后祝大家能够有博主的好运,愿都能找到自己的归处。Best wishes to you!!

 

2007-10-12 14:23:00 menuconfig 阅读数 1611
  • SSH面试和笔试指导

    由于SSH部分内容庞杂,各大高校和培训机构在教学中存在着大量的问题。如重点不突出、理解错误等。为了便于大家掌握SSH的重点知识,在面试和笔试中轻松通过,肖老师整理了大量的重要试题,并进行了详细讲解!

    9326 人正在学习 去看看 肖海鹏
一、一些常规中举的C考题
第一题:写出下述程序结果:
int m[][3] = {1,4,7,2,5,8,3,6,9};
int i, j, k = 2;
for (i = 0; i < 3; i++) {
printf(“%d”, m[k][i]);
}
问题所在:本题考点一眼就可以看出,二重数组啦!

第二题:下列哪个引用是不正确的?
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a;
(A) a[p-a]; (B) *(&a[i]); (c) p[i]; (D) *(*(a+i));

第三题:下列4个选项中,哪个结果为6?
int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p = a;
(A) *p + 6; (B) *(p+6); (C) *p += 5; (D) p+5;

第四题:关于二叉树的,给你前序与中序,让你画出二叉树图形;

第五题:关于操作系统方面的,具体题目记不清了,大概意思如下:
在多任务操作系统中,任务间的通信方式有哪几种?如何任务间互斥(并举例说明);
漏了一个考点,记不起来了,想起来再补上吧!

二、一些怪题(别误会,不是那些平时根本不用的、只放在旮旯的偏题,而是网上的原题,^_^)
此公司笔试题的另外一个怪像就是,直接将网络上已经很久很久以前的题目(可谓说是嵌入界C笔试题的经典了,在偶的“几道经典C语言面试题”贴中,已经有了)放入试卷中考你,一共大概有3道题,其中有两道是原封不动照搬的,具体题目如下:
1、写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。
2、给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。
3、在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。写代码去完成这一任务。(注:这一题稍微改了改,呵呵,改的地方就是文字变了个说法,变长了,^_^,嗯,地址也应该变了吧,唉,记不清了!)
三、还有一道《高质量C++-C编程指南》中的题目
头文件中的 ifndef/endif 干什么用?(呵呵,与原题相比只是少了define)!

还有一些就是关于结构体、++、--等一系列试题;
 
没有更多推荐了,返回首页