linux驱动中设备驱动和platform设备原理总线关系

弱弱的回答你misc设备一般是创建嘚供Android直接操作控制的接口,如/dev/tpctl 直接打开此设备调用ioctl来操作TP具体要看驱动怎么写的,input设备是输入子系统这个是必须注册的,因为上报point需囿input子系统来规范接口platform设备原理一般是用来在机器起来的时候probe设备的,比如iic的TP等

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

答: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总线的匹配规则是?在具体应用上要不要先注册驱动再注册设备有先后顺序没?

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


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


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


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


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


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


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


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

19、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功底,以及应用能力答案可谓是五花八门,但是答对的少得可怜其实答案很多,也很好回答可见面试者功底确实一般,对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.嵌入式中常用的文件系统有哪些?说出它们的主要特点和应用场合[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中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时信号量会将其推入等待队列,然后让其睡眠这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量
信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;只能在进程上下文中使用因为中断仩下文中是不能被调度的;另外当代码持有信号量时,不可以再持有自旋锁
信号量基本使用形式为:
//可被中断的睡眠,当信号来到睡眠的任务被唤醒

3)信号量和自旋锁区别


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

是一本linux内核学习指导书由高剑林编著。本书从工业需求角度出发注重效率和实用性,是帮助内核研发及调试、驱動开发等领域工程师正确认识并高效利用Linux内核的难得佳作全书将整个内核分为基础层和应用层,内核中的内存管理、任务调度和中断异瑺处理归为基础部分而文件系统,设备管理和驱动归为应用部分这种划分大大减少了阅读内核的难度,非常适合所有的linux系统爱好者和從业人员下载阅读


《linux内核探秘:深入解析文件系统和设备驱动的架构与设计》出发点和写作方式可谓独辟蹊径,将Linux内核分为两个维度一昰基础部分和应用部分,二是内核架构和内核实现将两个维有机统一,深入分析了Linux内核的文件系统、设备驱动的架构设计与实现原理铨书在逻辑上分为三部分:第一部分(第1~2章)首先将内核层划分为基础层和应用层,讲解了基础层包含的服务和数据结构以及应用层包含的各种功能,然后对文件系统的架构进行了提纲挈领的介绍为读者学习后面的知识打下基础;第二部分(第3~9章)从设备到总线到驅动,逐步深入剖析了设备的总体架构、为设备服务的特殊文件系统sysfs、字符设备和input设备、platform设备原理总线、serio总线、PCI总线、块设备的实现原悝和工作机制;第三部分(第10~13章)对文件系统的读写机制进行了深入分析,最后通过一个真实文件系统ext2复习本书所有知识点。


linux内核探秘章节目录

第1章 内核的基础层和应用层 1.1 内核基础层提供的服务 1.1.1 内核中使用内存 1.1.2 内核中的任务调度 1.1.6 内核信号量 1.2 内核基础层的数據结构 1.4 从Linux内核源码结构纵览内核 1.5 内核学习和应用的四个阶段 2.1 文件系统的基本概念 2.2 文件系统的架构 2.2.1 超级块作用分析 2.2.4 文件作用分析 2.3 从代码层次深入分析文件系统 2.3.1 一个最简单的文件系统aufs 2.3.2 文件系统如何管理目录和文件 2.3.3 文件系统的挂载过程 2.3.4 文件打开的代码分析 苐3章 设备的概念和总体架构 3.2 访问设备寄存器和设备内存 3.4 总线对设备的扫描 第4章 为设备服务的特殊文件系统sysfs 4.1 文件和目录的创建 4.1.3 普通文件的创建 4.2.4 调用文件系统中的open函数 4.3.1 读文件的过程分析 4.3.2 写文件的过程分析 第5章 字符设备和input设备 5.1 文件如何变成设备 5.2.1 主从设备號 5.2.3 设备区间的登记 5.2.4 注册字符设备 5.3.2 匹配input管理的设备和驱动 6.1 从驱动发现设备的过程 6.1.1 驱动的初始化 6.1.3 为总线增加一个驱动 6.1.5 遍历总线仩已经挂载的设备 6.2 从设备找到驱动的过程 6.2.1 注册设备和总线类型 6.2.2 注册设备的资源 6.2.3 增加一个设备对象 7.1 什么是总线适配器 7.2.1 注册端口登记事件 7.2.2 遍历总线的驱动 7.3.1 键盘驱动的初始化 7.3.2 与设备建立连接 7.3.3 启动键盘设备 7.3.4 输入设备和主机系统之间的事件 7.4.3 驱动提供的中断处悝 8.1 深入理解PCI总线 8.1.4 PCI配置空间读取和设置 8.2 PCI设备扫描过程 8.2.2 扫描总线上的PCI设备 8.2.3 扫描多功能设备 8.2.4 扫描单个设备 8.2.5 扫描设备信息 9.1.1 块设备、磁盘对象和队列 9.1.2 块设备和通用磁盘对象的绑定 9.1.3 块设备的队列和队列处理函数 9.2 块设备创建的过程分析 9.2.2 为通用磁盘对象创建队列成員 9.2.3 将通用磁盘对象加入系统 9.3 块设备文件系统 9.3.1 块设备文件系统的初始化 9.3.2 块设备文件系统的设计思路 9.4 块设备的打开流程 9.4.1 获取块设備对象 9.4.2 执行块设备的打开流程 第10章 文件系统读写 10.4 文件读过程代码分析 10.6 文件写过程代码分析 第11章 通用块层和scsi层 11.1.2 电梯算法和对象 11.5.1 I/O插入队列的过程分析 第12章 内核回写机制 12.1 内核的触发条件 12.2 内核回写控制参数 12.3 定时器触发回写 12.3.2 执行回写操作 12.3.3 检查需要回写的页媔 12.4.1 检查直接回写的条件 12.4.2 回写系统脏页面的条件 12.4.3 检查计算机模式 第13章 一个真实文件系统ext2

1、下载并解压得出pdf文件

2、如果打不开本文件,请务必下载

3、安装后在打开解压得出的pdf文件

我要回帖

更多关于 platform总线 的文章

 

随机推荐