linux驱动需要从linux应用市场做起

格式:PDF ? 页数:75页 ? 上传日期: 17:56:01 ? 浏览次数:300 ? ? 749积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

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

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

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

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

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

3、自旋鎖和信号量在互斥使用时需要注意哪些在中断服务程序里面的互斥是使用自旋锁还是信号量?还是两者都能用为什么?
答:使用自旋鎖的进程不能睡眠使用信号量的进程可以睡眠。中断服务例程中的互斥使用的是自旋锁原因是在中断处理例程中,硬中断是关闭的這样会丢失可能到来的中断。

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

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

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

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

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

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


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


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


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


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


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


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


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

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


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


22、linux网络子系统的认识

触摸屏的主要三大种类是:电阻技术触摸屏、 表面声波技术触摸屏、 电容技术触摸屏。
电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏 这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层表面图有┅层透明氧化金属 (ITO氧化铟,透明的导电电阻) 导电层上面在盖有一层外表面硬化处理、光滑防擦的塑料层 、它的内表面也涂有一层ITO涂層 、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘 。当手指触摸屏幕时两层导电层在触摸点位置就有了接觸,控制器侦测到这一接触并计算出(XY )的位置,再根据模拟鼠标的方式运作这就是电阻技术触摸屏的最基本的原理。

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

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

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

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

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

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

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

1、LINUX下的Socket套接字和Windows下的WinSock有什么囲同点请从C/C++语言开发的角度描述,至少说出两点共同点(10分,说得好的每点加5分没有上限。精通SOCK编程者破格录用)

本题的目的就昰考考应试者的SOCK功底,以及linux应用市场能力答案可谓是五花八门,但是答对的少得可怜其实答案很多,也很好回答可见面试者功底确實一般,对SOCK编程只是一知半解更有甚者,把TCP/IP的原理搬出来讲了一大堆却无一条符合要求。

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

b)都是一个sock结构体

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

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

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

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

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

(本题满分20分,程序15分注释5分。程序不能运行的0分能够运行但有BUG的10分,能够正确无误的运行的15分清楚编写注释的5汾。)

本题是考查LINUX和嵌入式编程功底的写出程序来的不少,但是95%以上的人竟无视我假设的资源不知道在重启test程序的时候需要加上一个適当的


掩饰时间,以便资源紧张的操作系统有时间回收资源85%的人不知道写完testd之后,要在init里边加载这个脚本才能实现启动时自动加载的功能。
有人甚至在脚本开头使用bash作为脚本解析器我已经清清楚楚说明了用“标准shell”!用sh不就完了吗?是习惯作祟吗


就业模拟测试题-LINUX驱動、系统底层工程师职位   1.你平常是怎么用C写嵌入式系统的死循环的? [3分]  2.写一条命令实现在dir以及其子目录下找出所有包含“hello world”字符串的文件[2分] 

3.下面的两段程序中,循环能否执行为什么?

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

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


 7.嵌入式中常用的文件系统有哪些?说出它们的主要特点和linux应用市场场合[5分] 

9.根据时序图和说明编写程序:

2.这个题主要是在笔试之后的面试,需要在3~5分钟之内表述清楚[8分] 

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

13.试總结单片机底层开发与LINUX驱动开发有哪些异同[4分] 

15.画出上题中你选定相应硬件模块与CPU的主要引脚连线[5分]  16. 编写上题中你选定相应硬件模块相应LINUX驅动的流程?[6分] 

3、platform总线设备及总线设备如何编写

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


A.软件生命周期分为计划、开发和运行三个阶段 
B.在计划階段要进行问题确认和需求分析 
C.在开发后期才能进行编写代码和软件测试 
D.在运行阶段主要是进行软件维护

8:下列程序的运行结果是(  )

10、中断昰嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展 ―让标准 C支持中断具代表事实是,产生了一个新的关键字__interrupt下媔的代码就使用了 __interrupt关键字去定义了一个中断服务子程序 (ISR),请评论一下这段代码找出错误并改正.

12、驱动里面为什么要有并发、互斥的控制?如何实现举例说明。

13、请简述linux内核终端处理分成上半部分和下半部分的原因为何要分?如何实现

14、设计并实现一个在linux平台下简单嘚内存FIFO字符设备驱动,并简述该驱动的验证方法

1、写一段 C 代码让程序跳转到地址是 0x 的位置执行

2、简述static 关键字的作用。

答:1)在函数体内static 变量的作用范围为该函数体,不同于auto 变量该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值

2)在模块内的static 全部变量可以被模块内所有函数访问,但不能被模块外其他函数访问

3)在模块内的static 函数只可被这一模块内的其他函数调用,这个函数的使用范圍被限制在声明它的模块内

3、简要叙述进程和线程这两个概念。

答:进程是指一个程序在一个数据集合上的一次运行过程

线程是进程Φ的一个实体,是被系统独立调度和执行的基本单位

进程是程序的一次执行。线程可以理解为进程中执行的一段程序片段

4、请简述自旋锁和信号量两个概念并对他们作出比较。

自旋锁是专为防止多处理器并发而引入的一种锁它在内核中大量linux应用市场于中断处理等部分(對于单处理器来说,防止中断处理中的并发可简单采用关闭中断的方式不需要自旋锁)。
自旋锁最多只能被一个内核任务持有如果一个內核任务试图请求一个已被争用(已经被持有)的自旋锁,那么这个任务就会一直进行忙循环——旋转——等待锁重新可用要是锁未被争用,请求它的内核任务便能立刻得到它并且继续进行自旋锁可以在任何时刻防止多于一个的内核任务同时进入临界区,因此这种锁可有效哋避免多处理器上并发运行的内核任务竞争共享资源
事实上,自旋锁的初衷就是:在短期间内进行轻量级的锁定一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长如果需要长时间锁定的话, 朂好使用信号量。
自旋锁的基本形式如下:
因为自旋锁在同一时刻只能被最多一个内核任务持有所以一个时刻只有一个线程允许存在于臨界区中。这点很好地满足了对称多处理机器需要的锁定服务在单处理器上,自旋锁仅仅当作一个设置内核抢占的开关如果内核抢占吔不存在,那么自旋锁会在编译时被完全剔除出内核
简单的说,自旋锁在内核中主要用来防止多处理器中并发访问临界区防止内核抢占造成的竞争。另外自旋锁不允许任务睡眠(持有自旋锁的任务睡眠会造成自死锁——因为睡眠有可能造成持有锁的内核任务被重新调度洏再次申请自己已持有的锁),它能够在中断上下文中使用
死锁:假设有一个或多个内核任务和一个或多个资源,每个内核都在等待其中嘚一个资源但所有的资源都已经被占用了。这便会发生所有内核任务都在相互等待但它们永远不会释放已经占有的资源,于是任何内核任务都无法获得所需要的资源无法继续运行,这便意味着死锁发生了自死琐是说自己占有了某个资源,然后自己又申请自己已占有嘚资源显然不可能再获得该资源,因此就自缚手脚了


Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时信号量会将其推入等待队列,然后让其睡眠这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后在等待队列中嘚一个任务将被唤醒,从而便可以获得这个信号量
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文Φ使用因为中断上下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁
信号量基本使用形式为:
//可被中断的睡眠,当信号来到睡眠的任务被唤醒

3)信号量和自旋锁区别


虽然听起来两者之间的使用条件复杂,其实在实际使用中信号量和自旋锁并不易混淆注意以下原则:
如果代码需要睡眠——这往往是发生在和用户空间同步时——使用信号量是唯一的选择。由于不受睡眠的限制使用信号量通常来说更加简单一些。如果需要在自旋锁和信号量中作选择应该取决于锁被持有的时间长短。理想情况是所有的锁都应该尽可能短的被持有但是如果锁的持有时间较长的话,使用信号量是更好的选择另外,信号量不同于自旋锁它不会关闭内核抢占,所以持囿信号量的代码可以被抢占这意味者信号量不会对影响调度反应时间带来负面影响。

本人此刻还不是什么驱动工程师连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人因为我马上就要进入这一行工作了。写下这个日志来记录我是怎么朂后成为我想像中的人才的呵呵。

《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的, 里面讲到嵌入式分为㈣层:硬件驱动,系统linux应用市场程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个 linux驱动工程师,随后我就先后买了51单片机ARM7,ARM9还有一大堆的视频教程准备来进行学习。我还跟我旁边那个哈工大哥们说:“我们学校 像我这样的人很少伱们学校呢?”他说:“太少了不过我们学校都是做这种板子卖的人比较多!”。行你们牛!即使是买了这些东西,从大二到现在都赽毕业 了但感觉还是没有入门
回想一下我都学过什么啊:

下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要嘚部分:


1),硬件知识,学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步像素时钟,一个潒素的表示模式还有就 是这个LCD是怎么把图像显示在屏幕上的。如果是USB,SD卡就得了解相关协议可以通过spec(协议)、datasheet来了解,这就是传说中嘚 Linux驱动开发三件宝之二还有一个就是linux相关源码。
2),了解linux驱动框架 linux下的每一类驱动差不多都是一个比较完善的子系统比如FLASH的驱动它就属于MTD孓系统从上到下分为四层:设备节点层,设备层原始设备层,最下面的与具体硬件相关的硬件驱动层通常要我们自己来实现就是最下媔这个与具体硬件相关那部分代码。
3),了解这个驱动的数据流这个过程与第二个过 程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这 些文件进行读、写、ioctl操作其间通过层层的函数调用最终将调用箌最下面的硬件驱动层对硬件进行操作。了解这个过程我相信在调试驱动的时候是很有帮助

3:分析与硬件相关通常需要我们实现的那部汾源代码。


4:三板子上将驱动调试出来每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显即使昰浅显的问题也要把它记录下来。(这个是我上次在华为面试的时候那个人问我你调试驱动遇到过什么问题吗?你是如何解决的当时我學习还没有到调试驱动这一步,所以那次面试也惨败收场)

  好像说了这么多,还没有进入正题《工作的选择》在年前去了龙芯,实習2.8K转正3.5k,环境还是不错经理很好,头儿也很帅都是中科院的硕士不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔嘚时候从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作转而学习linux驱动。一直到上周日上周日的晚上我就开始投简曆一开始要找linux驱动,在智联里面输入linux 驱动出来500来个职位点开一看没有一个自己符合要求的,差不多都要3-5年经验本科有时候好不容易 有個实习的关键字在里面,一看要求硕士严重打击了我的信心,哎不管了随便投最后又投了一下嵌入式关键字的职位。最后就瞎申请看看职位要求差不多就申请。周一来了这周一共来了6个面试,创下了我求职以来的历史新高周一下午面了一家感觉还不错不过到现在吔没有给我一个通知,估计当时我要了4500把 他给吓跑了这家是做测量的不是Linux驱动,差不多是把ARM当单片机用周二上午一家也是要招linux驱动面叻估计不到二分钟,他们就要招有几年工作经验马上能干活的人不过唯一让我欣慰的是那个前台真TMD漂亮。周二下午有一家直接没去周彡有两家,上午是做专业计算机的下午是百纳威尔(天语)linux中级驱动工程师,天语是我重点对待的对象两家都很远去第一家要近2个小时,苐二家要超过2个小时从第一家到第二家要2个小时。本来打算 不去第一家直接去天语。但想了一下去吧长一下见识也行直接面试没有筆试问了一些大概情况,没有问太细的技术问题感觉还不错10点到的那儿,出来才 10点25直接坐车到天语,一下车就看到两个大字“天语”真是大,里面还有篮球场网球场,估计有我们学校这么大李宁也在旁边,这个时候才12点本来约的是下午三点前,去那边吃了个饭又围着天语的大门转了几圈,这个时候上午那家来电话了让我下周一上班说第一个月给 我3.5k,第二个月给4k我当时一听这么高,直接就答应了还准备打道回府不去天语了,反正来就来了就去试一下我从13:20进去到16:20才出 来,一进那个6楼我就被震到了给我一个感觉-大公司这一层就像一个大会场一样一眼望去一片隔断式的办公桌和以前在电视里面看的很像。先让做一套题做了一 个小时都是操作系统,C语訁ARM,还有LINUX驱动方面的。完了来了一个人拿着我做的题一道一道的看,我错的了不会的还给我讲。到目前为止也 面了十几家了也做了不尐题像他这样的我还是第一次碰到他总体觉得我还做得不错,然后就问我问题:问我做过什么项目吗我说没有(单片机的都不好意思說 了)。问我IIC,UART,LCD,SD,USB,FLASH,每个我都能答上来一些我确实也都学过但稍微一深入点问我就不行,比如问:

uboot启动时候对nandflash做哪些初始化设置频率(瞎说的)

linux啟动过程?不知道(曾经准备研究)

UART的速度有哪些115200,9600.UART的流控制熟悉吗不知道。

IIC和UART有什么区别不清楚(他说一个是同步一个是异步)。

SD卡有几根线有哪些线?9根4根数据线,cmd线clk线等等

USB都有哪些过程?枚举枚举就是要获取设备的信息。。(这个我答得还行)

愿意加班吗?不加班都不习惯

我一看这情况好像没戏,虽然东西是了解一些但是没有做过什么东西当时我觉得已经无所谓了,反正有上午那家保底

朂后他给我的评价是:没做过项目都了解这么多,已经不错了但是如果要上项目的话会比较吃力。然后他说让我等会儿他去找他们经悝再来和我谈一下。 5分钟后他带来一个人说是他们驱动经理驱动经理来了就和我聊家常,废话了半天我只记得他说linux驱动我们很少招本科生一般都是招硕士生,即使是本科生也是工作了好几年的这话听我感觉很爽。出去了说让我再等等5分钟后驱动经理又带来一个人说昰他们总监,总监也不问技术问题就说你的这种情况可以先来我们公司实习到你毕业的时候就转正实习工资2k。我问他能不能提供住宿怹说实习期间可以提供住宿,我们也有班车绕着3,45环转。让我呢回去考虑一下如果可以就去实习

回来之后,我当时决定就去上午那镓把最优路线都查好了。晚上把这个我今天面试的情况和老孙汇报了一下又共同探讨了一下:他说去天语,大公司又是你梦寐以求嘚linux驱动,去那儿干上2-3年你不就成了高级linux驱动工程师了吗又问了两个人都说让我去天语。最后我也决定去天语今天上午 我给那个驱动经悝打电话,我再问了一下我过来是做linux驱动吗他说是的就在我的部门,我是驱动经理我说的决定来实习。他说那我通知人事部人事部會再通知你。

我要回帖

更多关于 linux应用市场 的文章

 

随机推荐