赞
踩
90,宏和函数的优缺点?
答:不同点:
1,宏做的是简单的字符串的替换,而函数是参数的传递,参数是有数据类型的;
2,宏在编译之前进行(先用宏替换宏名,再进行编译),而函数是在编译之后执行才调用的;
3,宏的参数替换是直接替换的,不经过任何计算,而函数调用时将形参的值传给形参;
4,宏的参数是不占内存空间的,因为只做字符串的替换,而函数调用时参数之间的传递,所以占用内存;
函数调用需要空间开销,因为在函数调用时它既要保存现场又要跳转到另一个函数调用中去执行,然后返回现场,但宏函数中就不存在。
优缺点:
使用宏函数定义编译生成的目标文件比普通函数生成的目标文件大;
宏函数会导致代码的执行效率降低;
主要小心使用宏还是会显著提高代码的执行效率。
91,用户空间驱动程序的优点?
答:1,可以和整个C库链接。驱动程序不用借助外部程序就可以完成许多非常规任务;
2,可以使用通常的调试器调试驱动程序代码,而不用费力地调试正在运行的内核;
3,如果用户空间驱动程序被挂起,则简单地杀掉它就行了。驱动程序带来的问题不会挂起整个系统,除非所驱动的硬件已经发生严重故障;
4,和内核内存不同,用户内存可以换出。如果驱动程序很大但是不经常使用,则除了正在使用的情况之外,不会占用太多内存;
5,良好设计的驱动程序仍然支持对设备的并发访问;
6,如果读者必须编写封闭源码的驱动程序,则用户空间驱动程序可更加容易地避免因为修改内核接口而导致的不明确的许可问题。
用户空间驱动程序的缺点?
1,中断在用户空间中不可用。对该限制,在某些平台上也有相应的解决办法,比如IA32架构上的vm86系统调用;
2,只有在调用iopen映射/dev/mem才能直接访问内存,但只有特权用户才可以执行这个操作;
3,只有在调用ioperm或者iopl后才可以访问I/O端口。然而并不是所有平台都支持两个系统调用,并且访问/dev/port可能非常慢,因而并非十分有效。同样只有特权用户才能引用这些系统调用和访问设备文件;
相应时间很慢。这是因为在客户端和硬件之间传递数据和动作需要上下文切换;
5,更严重的是,如果驱动程序被换到磁盘,相应时间将令人难以忍受。使用mlock系统调用或许可以缓解这一问题,但由于用户空间程序一般需要链接多个库,因此通常需要占用多个内存页。同样,mlock也只有特权用户才能使用;
6,用户空间中不能处理一些非常重要的设备,包括(但不限于)网络接口和块设备等。
92,DMA原理?
答:一个完整的DMA传输过程必须经过下面的4个步骤。
(1)DMA请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。
(2)DMA响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
(3)DMA传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
(4)DMA结束:当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。
由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。
参考:https://blog.csdn.net/dddd0216/article/details/50906504
93,中断的上半段和下半段指?
答:中断是一个很霸道的东西,处理器一旦接收到中断,就会打断正在执行的代码,调用中断处理函数。如果在中断处理函数中没有禁止中断,该中断处理函数执行过程中仍有可能被其他中断打断。出于这样的原因,大家都希望中断处理函数执行得越快越好。
另外,中断上下文中不能阻塞,这也限制了中断上下文中能干的事。
基于上面的原因,内核将整个的中断处理流程分为了上半部和下半部。上半部就是之前所说的中断处理函数,它能最快的响应中断,并且做一些必须在中断响应之后马上要做的事情。而一些需要在中断处理函数后继续执行的操作,内核建议把它放在下半部执行。
拿网卡来举例,在linux内核中,当网卡一旦接受到数据,网卡会通过中断告诉内核处理数据,内核会在网卡中断处理函数(上半部)执行一些网卡硬件的必要设置,因为这是在中断响应后急切要干的事情。接着,内核调用对应的下半部函数来处理网卡接收到的数据,因为数据处理没必要在中断处理函数里面马上执行,可以将中断让出来做更紧迫的事情。
三种方法来实现下半部:软中断、tasklet和等待队列。
参考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=24690947&id=3491821
94,运算符优先级,左右结合到底是怎么回事?
答:举例:+a-,左结合,就是a和a左边的符号结合参与运算,即+a,右结合,就是a和a右边的符号结合起来参与运算,即a-。
95,socket编程?
答:参考:https://www.cnblogs.com/liushui-sky/p/5609535.html
96,mknod命令怎么用?
答:mknod /dev/ttyUSB32 c 188 32
/dev/ttyUSB32 文件名:要创建的设备文件名;
C 类型:指定要创建的设备文件的类型;
188 主设备号:指定设备文件的主设备号;
32 次设备号:指定设备文件的次设备号。
Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录 下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。
为了管理这些设备,系统为设备编了号,每 个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编 号,如硬盘的主设备号是3。
Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设 的种类较多,操作方式各不相同。Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。
打开一个文件就是调用这个文件file_operations中的open操作。不同类型的文件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。
97,自旋锁?及其代码?
答:是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
参考:https://baike.so.com/doc/9186718-9519957.html
98,can原理?
答:控制器局域网总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议由德国的 Robert Bosch公司开发,用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。
CAN总线是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电子干扰性,并且能够检测出产生的任何错误。CAN总线可以应用于汽车电控制系统、电梯控制系统、安全监测系统、医疗仪器、纺织机械、船舶运输等领域。
CAN总线的特点
(1)具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;
(2)采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;
(3)具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus 上,形成多主机局部网络;
(4)可根据报文的ID决定接收或屏蔽该报文;
(5)可靠的错误处理和检错机制;
(6)发送的信息遭到破坏后,可自动重发;
(7)节点在错误严重的情况下具有自动退出总线的功能;
(8)报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。
参考:http://embed.21ic.com/hardware/can/201611/42974.html
99,底半部实现方法1:软中断?及其代码?
答:“硬中断是外部设备对CPU的中断”,“软中断通常是硬中断服务程序对内核的中断”,“信号则是由内核(或其他进程)对某个进程的中断”。
100,底半部实现方法2:tasklet?及其代码?
答:工作队列,将一个work提交到workqueue上,而这个workqueue是挂到一个特殊内核进程上,当这个特殊内核进程被调度时,会从workqueue上取出work来执行。当然这里的work是与函数联系起来的。这个过程表现为,此刻先接下work,但不立刻执行这个work,等有时间再执行,而这个时间是不确定的。
工作队列运行在进程上下文,可以睡眠。
101,底半部实现方法3:工作队列?及其代码?
答:工作队列,将一个work提交到workqueue上,而这个workqueue是挂到一个特殊内核进程上,当这个特殊内核进程被调度时,会从workqueue上取出work来执行。当然这里的work是与函数联系起来的。这个过程表现为,此刻先接下work,但不立刻执行这个work,等有时间再执行,而这个时间是不确定的。
工作队列运行在进程上下文,可以睡眠。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。