1 、如何自动建立设备文件?
class_create device_createlinux
二、led驱动编写有几种方式?
输入子系统 字符设备驱动 总线platform led子系统数组
三、如何实现http服务器?
tcp服务器:socket缓存
四、如何编写守护进程,简述syslog的做用?
第一步:建立进程、杀死父进程
第二步:建立新的会话
第三步:改变工做路径路径
第四步:修改文件掩码权限
第五步:关闭文件描述符服务器
五、bootloader和uboot的区别?
bootloader是启动装载。这是一段很小的程序,用于在系统上电启动初期运行,
初始化关键接口,如内存,串口,关闭中断,关闭看门狗,引导系统进入内核
的一段初始化的程序。它主要任务就是将内核映像从硬盘读到RAM中,而后跳转
到内核的入口点去运行内核,从而创建系统运行的必要环境。
uboot:是bootloader的一种网络
六、如何移植uboot?
一、下载源码
二、解压uboot源码并进入目录
三、指定交叉编译工具链
四、指定产品BOARD 底板
五、编译u-boot多线程
七、传感器驱动如何编写?架构
八、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 执行命令以及加载引导内核
九、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。框架
十、arm中icache的做用
由于CPU的运行速度很快,而内存的速度比CPU的速度慢不少,由于icache是高速
缓存寄存器,将内存中的数据读取到cache中,因此这样会提升CPU的运行效率。 异步
十一、uboot启动流程?
一、初始化异常向量表
二、关中断,关看门狗,关MMU,关闭DCACHE,使能ICACHE
三、初始化时钟
四、初始化DRAM
五、初始化串口
六、设置栈
七、清BSS段
八、重定位
九、进一步初始化硬件
十、启动内核
一、初始化硬件
二、传递参数
三、启动内核 socket
十二、标准IO和文件IO的区别?
标准io是带缓存的,文件io不带缓存
标准io是属于库,文件io属于系统调用
标准io是流,文件io是文件描述符
标准io是一种特殊的文件io
1三、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内部定义的等待队列)。这也能节省很多的开销
1四、sysfs主要的做用?
sysfs文件系统不只能够把设备(devices)和驱动程序(drivers) 的信息从内核
输出到 用户空间,也能够用来对设备和驱动程序作设置,
sysfs 的目的是把一些本来在 procfs 中的,关于设备的部份,独立出来,以‘
设备层次结构架构’(device tree)的形式呈现
1五、内核为何要引入平台总线?
是为了使得驱动程序中的硬件信息和软件分开
1六、字符设备驱动实现流程?
申请设备号
注册设备号
调用file_operations函数
1七、内核中select和异步通知的区别?
1八、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和指针所指向的内容都是只读,不可修改
1九、inline的做用?
内联函数,在程序设计的过程当中,为了避免让调用函数,使得程序跳来跳去,提供
程序的执行效率,用空间换取效率的一种手段
20、volatile 的做用?
防止编译器的过分优化
1.中断子服务的非自动变量
2.多线程中的被多个线程共享的变量
3.并行设备的硬件寄存器
21 、#ifndef define #end 的做用
防止在头文件中重复定义
2二、设备树中
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做用?
一、修饰全局变量,限制全局变量在该目录下使用,不能被其余文件使用
二、修饰函数,限制函数在该目录下使用,不能被其余文件使用
三、修饰局部变量,使得该局部变量生命周期变长,改变了存储方式
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的频率比较低,则用中断效率要高一些。主要是看请求频率。
4二、IIC,SPI,串口的区别?
SPI总线由三条信号线组成
串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线能够实现多个SPI设
备互相链接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其余设备为SPI从
机或从设备(Slave)。主从设备间能够实现全双工通讯,当有多个从设备时,还能够增长
一条从设备选择线
I2C总线是双向、两线(SCL、SDA)
具备总线仲裁机制,很是适合在器件之间进行近距离、非常常性的数据通讯。在
它的协议体系中,传输数据时都会带上目的设备的设备地址
UART总线是异步串口,所以通常比前两种同步串口的结构要复杂不少,通常由波
特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件
上由两根线,一根用于发送,一根用于接收
4三、输入子系统分为哪几层?如何编写设备驱动?
分为三层:硬件驱动层、子系统核心层、事件处理层
编写事件处理层
4四、TCP和udp的区别?
tcp:是基于链接的,可靠的一种通讯方式,而udp是不须要链接的,直接发送报
文
4五、用变量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 )
4六、中断是嵌入式系统中重要的组成部分,这致使了不少编译开发商提供一种扩展—让标
准C支持中断。具表明事实是,产生了一个新的关键字__interrupt。下面的代码就使用了
__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
中断不能有返回值,不能使用printf函数,不能传递参数 不能进行浮点数计算
文中答案为本人整理而获得,不能保证百分之百正确,若有误,请联系做者本人修改