嵌⼊式⾯试笔试题⽬——附部分答案1 、如何⾃动创建设备⽂件?
class_create device_create
2、led驱动编写有⼏种⽅式?
输⼊⼦系统字符设备驱动总线platform led⼦系统
3、如何实现http服务器?
tcp服务器:socket
4、如何编写守护进程,简述syslog的作⽤?
第⼀步:创建进程、杀死⽗进程
第⼆步:创建新的会话
第三步:改变⼯作路径路径
第四步:修改⽂件掩码权限
第五步:关闭⽂件描述符
5、bootloader和uboot的区别?
bootloader是启动装载。这是⼀段很⼩的程序,⽤于在系统上电启动初期运⾏,
初始化关键接⼝,如内存,串⼝,关闭中断,关闭看门狗,引导系统进⼊内核
的⼀段初始化的程序。它主要任务就是将内核映像从硬盘读到RAM中,然后跳转
到内核的⼊⼝点去运⾏内核,从⽽建⽴系统运⾏的必要环境。
uboot:是bootloader的⼀种
6、如何移植uboot?
1、下载源码
2、解压uboot源码并进⼊⽬录
3、指定交叉编译⼯具链
4、指定产品BOARD 底板
5、编译u-boot
7、传感器驱动如何编写?
8、BL0,BL1,BL2,BL3的作⽤?
BL0 ⽂件是存放在 CPU 内部 IROM 中的⼀段固化代码,CPU 上点之后,⾸先去
运⾏soc中的BL0,运⾏时会将 BL1 拷贝到 CPU 的 IRAM 中,然后执⾏BL1;BL1⽂件执⾏
起来之后会先进⾏内存的初始化,之后将 BL2 ⽂件拷贝到外部内存中,BL2会初始化BL3
的运⾏环境,将BL3搬移到DRAM中,BL3会有⼀个⾃搬移的过程,从⽽启动内核⼊⼝。
BL0:CPU内部的固化代码
BL1:三星提供的加密⽂件
BL2:截取uboot.bin 前14k
BL3:剩下的uboot 执⾏命令以及加载引导内核
9、exynos4412 时钟 APLL,MPLL,VPLL的区别?------倍频锁相环
APLL:⽤于 CPU_BLK (可产⽣⾼达1.4GHz的频率);作为 MPLL 的补充,它也可以给
DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和 CMU_TOP 提供时钟。
MPLL:(可产⽣⾼达1GHz的频率)⽤于DMC_BLK 、LEFTBUS_BLK 、RIGHTBUS_BLK 和
CMU_TOP。
EPLL :主要给⾳频模块提供时钟,192MHz
VPLL :主要给视频系统提供54MHz时钟,给 G3D(3D图形加速器 )提供时钟,或者是
1.1V下的440MHz。
10、arm中icache的作⽤
因为CPU的运⾏速度很快,⽽内存的速度⽐CPU的速度慢很多,因为icache是⾼速
缓存寄存器,将内存中的数据读取到cache中,所以这样会提⾼CPU的运⾏效率。
11、uboot启动流程?
1、初始化异常向量表
2、关中断,关看门狗,关MMU,关闭DCACHE,使能ICACHE
3、初始化时钟
4、初始化DRAM
5、初始化串⼝
6、设置栈
7、清BSS段
8、重定位
9、进⼀步初始化硬件
10、启动内核
1、初始化硬件
2、传递参数
3、启动内核
12、标准IO和⽂件IO的区别?
标准io是带缓存的,⽂件io不带缓存
标准io是属于库,⽂件io属于系统调⽤
标准io是流,⽂件io是⽂件描述符
标准io是⼀种特殊的⽂件io
13、select,poll,epoll的区别?
(1)select,poll实现需要⾃⼰不断轮询所有fd集合,直到设备就绪,期间可
能要睡眠和唤醒多次交替。⽽epoll其实也需要调⽤epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调⽤回调函数,把就绪fd放⼊就绪链表中,并唤醒在epoll_wait中进⼊睡眠的进程。虽然都要睡眠和交替,但是select和poll 在“醒着”的时候要遍历整个fd集合,⽽epoll在“醒着”的时候只要判断⼀下就绪链表
是否为空就⾏了,这节省了⼤量的CPU时间。这就是回调机制带来的性能提升。
(2)select,poll每次调⽤都要把fd集合从⽤户态往内核态拷贝⼀次,并且要
把current往设备等待队列中挂⼀次,⽽epoll只要⼀次拷贝,⽽且把current往等待队列
上挂也只挂⼀次(在epoll_wait的开始,注意这⾥的等待队列并不是设备等待队列,只是⼀个epoll内部定义的等待队列)。这也能节省不少的开销
14、sysfs主要的作⽤?
sysfs⽂件系统不仅可以把设备(devices)和驱动程序(drivers) 的信息从内核
输出到⽤户空间,也可以⽤来对设备和驱动程序做设置,
sysfs 的⽬的是把⼀些原本在 procfs 中的,关于设备的部份,独⽴出来,以‘
设备层次结构架构’(device tree)的形式呈现
15、内核为什么要引⼊平台总线?
是为了使得驱动程序中的硬件信息和软件分开
16、字符设备驱动实现流程?
申请设备号
注册设备号
调⽤file_operations函数
17、内核中select和异步通知的区别?
18、const int a,int const a, const int * a, const int const * a;
的区别?
const int a
int const a :表⽰都是int型变量a是只读的,不可写。
const int * a:表⽰指针地址不可以修改,为只读
const int const * a:表⽰指针*a和指针所指向的内容都是只读,不可修改
19、inline的作⽤?
内联函数,在程序设计的过程中,为了不让调⽤函数,使得程序跳来跳去,提供
程序的执⾏效率,⽤空间换取效率的⼀种⼿段
20、volatile 的作⽤?
防⽌编译器的过度优化
1.中断⼦服务的⾮⾃动变量
2.多线程中的被多个线程共享的变量
3.并⾏设备的硬件寄存器
21 、#ifndef define #end 的作⽤
防⽌在头⽂件中重复定义
22、设备树中
reg interrupt-parent interrupts status pinctl-0 pinctl-name
compatible 表⽰什么?
reg表⽰⼦节点数
interrupt-parent 表⽰中断⽗节点
interrupts 中断号
status 中断的开启状态
pinctl-0
pinctl-name 中断名字
compatible 匹配的中断的兼容性
23.进程和线程区别?
进程的地址空间是独⽴的。线程的地址空间共享的。
进程消耗的资源⽐较⼤,线程消耗的资源⽐较⼩
进程和进程通信通过进程间通信⽅式,线程和线程通信通过全局变量。
24.fork和vfork的区别?
vfork保证⼦进程先运⾏,在他调⽤exec或者exit之后,⽗进程才可能被调度运
⾏,如果在调⽤者两个函数之前⼦进程依赖于⽗进程的动作,会导致死锁
fork需要拷贝整个⽗进程的环境,⽽vfork不需要拷贝⽗进程的环境,在⼦进程
没有调⽤exec或者exit之前,⽗进程u⼦进程共享环境,此时的⽗进程相当于阻塞等待25.进程间通信⽅式有⼏种?每⼀种的特点?
8种通信⽅式
有名管道
⽆名管道
信号
信号量
共享内存
消息队列
套接字
26.字符型驱动设备你是怎么创建设备⽂件的,就是/dev/下⾯的设备⽂件,供上层应⽤程
序打开使⽤的⽂件?
mknod⼿动进⾏创建
⾃动创建class_create
device_create
27.insmod ⼀个驱动模块,会执⾏模块中的哪个函数?rmmod呢?这两个函数在设计上要注意哪些?遇到过卸载驱动出现异常没?是什么问题引起的?
会执⾏init函数,rmmod会执⾏exit函数
卸载模块时曾出现卸载失败的情形,原因是存在进程正在使⽤模块,检查代码后
发现产⽣了死锁的问题。
评:要注意在init函数中申请的资源在exit函数中要释放,包括存储,ioremap,定时器
,⼯作队列等等。也就是⼀个模块注册进内核,退出内核时要清理所带来的影响,带⾛⼀切不留下⼀点痕迹。
28.static作⽤?
1、修饰全局变量,限制全局变量在该⽬录下使⽤,不能被其他⽂件使⽤
2、修饰函数,限制函数在该⽬录下使⽤,不能被其他⽂件使⽤
3、修饰局部变量,使得该局部变量⽣命周期变长,改变了存储⽅式
29.inline的作⽤?
内联函数,在程序设计的过程中,为了不让调⽤函数,使得程序跳来跳去,提供
程序的执⾏效率,⽤空间换取效率的⼀种⼿段
30.在驱动调试过程中遇到过oops没?你是怎么处理的?
pc c
arm-none-linux-gnueabi-addr2line 地址 -e vmlinux -f
printk
汇编:
点灯
31.ioctl和unlock_ioctl有什么区别?
ioctl是应⽤层的,unlock_ioctl是底层提供给应⽤层的接⼝属于内核层的
32.驱动中操作物理绝对地址为什么要先ioremap?
将⼀个IO地址空间映射到内核的虚拟地址空间上去。因为内核没有办法直接访问
物理内存地址,必须先通过ioremap获得对应的虚拟地址。,便于访问
33.设备驱动模型三个重要成员是?platfoem总线的匹配规则是?在具体应⽤上要不要先
注册驱动再注册设备?有先后顺序没?
驱动设备总线
34.内核函数mmap的实现原理,机制?
map将⼀个⽂件或者其它对象映射进内存。⽂件被映射到多个页上,如果⽂件
的⼤⼩不是所有页的⼤⼩之和,最后⼀个页不被使⽤的空间将会清零。mmap在⽤户空间映射调⽤系统中作⽤很⼤。
35.在Linux C中,ls这个命令是怎么被执⾏的?
fork+exec
system("ls -l");
36.uboot是如何引导内核?
37.请从⽹卡、LCD驱动器、传感器芯⽚中选择⼀个或者2个(可以以具体的芯⽚为例),对下⾯的问题做答:
1)如果是外部扩展芯⽚,请说出你⽤的芯⽚的型号
2)画出上题中你选定相应硬件模块与CPU的主要引脚连线
3) 编写上题中你选定相应硬件模块相应LINUX驱动的流程?
38.platform总线设备及总线设备如何编写?
驱动硬件
39.IIC原理,总线框架,设备编写⽅法,i2c_msg
40.查看驱动模块中打印信息应该使⽤什么命令?如何查看内核中已有的字符设备的信息
如何查看正在使⽤的有哪些中断号
dmesg cat /proc/devices
cat /proc/interrupt
41.中断和轮询哪个效率⾼?怎样决定是采⽤中断⽅式还是采⽤轮询⽅式去实现驱动?
中断是CPU处于被动状态下来接受设备的信号,⽽轮询是CPU主动去查询该设备是
否有请求。
凡事都是两⾯性,所以,看效率不能简单的说那个效率⾼。如果是请求设备是⼀个频
繁请求cpu的设备,
或者有⼤量数据请求的⽹络设备,那么轮询的效率是⽐中断⾼。如果是⼀般设备,
并且该设备请求cpu的频率⽐较低,则⽤中断效率要⾼⼀些。主要是看请求频率。
42、IIC,SPI,串⼝的区别?
SPI总线由三条信号线组成printf函数是如何实现的
串⾏时钟(SCLK)、串⾏数据输出(SDO)、串⾏数据输⼊(SDI)。SPI总线可以实现多个SPI设备互相连接。提供SPI串⾏时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从
机或从设备(Slave)。主从设备间可以实现全双⼯通信,当有多个从设备时,还可以增加
⼀条从设备选择线
I2C总线是双向、两线(SCL、SDA)
具有总线仲裁机制,⾮常适合在器件之间进⾏近距离、⾮经常性的数据通信。在
它的协议体系中,传输数据时都会带上⽬的设备的设备地址
UART总线是异步串⼝,因此⼀般⽐前两种同步串⼝的结构要复杂很多,⼀般由波
特率产⽣器(产⽣的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,⼀根⽤于发送,⼀根⽤于接收
43、输⼊⼦系统分为哪⼏层?如何编写设备驱动?
分为三层:硬件驱动层、⼦系统核⼼层、事件处理层
编写事件处理层
44、TCP和udp的区别?
tcp:是基于连接的,可靠的⼀种通信⽅式,⽽udp是不需要连接的,直接发送报
45、⽤变量a给出下⾯的定义
a) ⼀个整型数(An integer)
b)⼀个指向整型数的指针( A pointer to an integer)
c)⼀个指向指针的的指针,它指向的指针是指向⼀个整型数( A pointer to a
pointer to an intege)r
d)⼀个有10个整型数的数组( An array of 10 integers)
e) ⼀个有10个指针的数组,该指针是指向⼀个整型数的。(An array of 10
pointers to integers)
f) ⼀个指向有10个整型数数组的指针( A pointer to an array of 10
integers)
g) ⼀个指向函数的指针,该函数有⼀个整型参数并返回⼀个整型数(A pointer
to a function that takes an integer as an argument and returns an integer)
h)⼀个有10个指针的数组,该指针指向⼀个函数,该函数有⼀个整型参数并返回
⼀个整型数( An array of ten pointers tofunctions that take an integer
argument and return an integer )
46、中断是嵌⼊式系统中重要的组成部分,这导致了很多编译开发商提供⼀种扩展—让标
准C⽀持中断。具代表事实是,产⽣了⼀个新的关键字__interrupt。下⾯的代码就使⽤了
__interrupt关键字去定义了⼀个中断服务⼦程序(ISR),请评论⼀下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
中断不能有返回值,不能使⽤printf函数,不能传递参数不能进⾏浮点数计算
⽂中答案为本⼈整理⽽得到,不能保证百分之百正确,如有误,请联系作者本⼈修改