Linux驱动开发 (面试常见问题整理)

1.Linux设备驱动的分类

-> 字符设备    -> 块设备    -> 网络设备

字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。

块设备可以用任意顺序进行访问,以块为单位进行操作,如硬盘、软驱等。字符设备不

经过系统的快速缓冲,而块设备经过系统的快速缓冲。

但是,字符设备和块设备并没有明显的界限,如对于Flash设备,符合块设备的特点,但是

我们仍然可以把它作为一个字符设备来访问。

网络设备在Linux里做专门的处理。Linux的网络系统主要是基于BSD unix的socket 机制。

2.linux中引入模块机制有什么好处?

该机制有助于缩短模块的开发周期。即:注册和卸载都很灵活方便。

3.什么是交叉编译?为什么需要交叉编译?

我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。

这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,

可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有

有限的存储空间和运算能力,比如常见的 ARM 平台,这种情况下,在ARM平台上进行

本机编译就不太可能了,这是因为一般的编译工具链需要很大的存储空间,并需要很强的

CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们

就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可

执行程序。

4.什么是GPIO

GPIO是相对于芯片本身而言的,如某个管脚是芯片的GPIO脚,则该脚可作为输入或输出高

或低电平使用,当然某个脚具有复用的功能,即可做GPIO也可做其他用途。

5.主设备号和次设备号的用途

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。

主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如

一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么,可以写一个LED

灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号分别为1和2。这里,次设

备号就分别表示两个LED灯。

6.Uart和IIC和SPI的区别

UART:基本都用于调试。主机和从机至少要接三根线,RX、TX和GND。TX用于发送数据,

RX用于接受数据(收发不是一根线,所以是全双工方式)。

SPI:是一种串行同步通讯协议,。SPI 接口由SDI(串行数据输入),SDO(串行数据输出),

SCK(串行移位时钟),CS(从使能信号)四种信号构成,CS 决定了唯一的与主设备通信的

从设备,片选信号低电平有效。如没有CS 信号,则只能存在一个从设备,主设备通过产生移位

时钟来发起通讯。数据在时钟的上升或下降沿由SDO 输出,在紧接着的下降或上升沿由SDI 读

入。

IIC:两根线:一个时钟线SCL和一个数据线SDA。只有一根数据线,所以是半双工通信。

 

7.产生死锁的原因主要是:

-> 因为系统资源不足

-> 进程运行推进的顺序不合适

-> 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则

就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

8.软中断

软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。

很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是

外部设备对CPU的中断","软中断通常是硬中断服务程序对内核的中断","信号则是由内核

(或其他进程)对某个进程的中断"

9.一个程序从开始运行到结束的完整过程

-> 预编译的过程中,主要处理源代码中的预处理指令,引入头文件,去除注释,处理所有的

条件编译指令,宏的替换,添加行号,保留所有的编译器指令。

-> 编译,编译过程所进行的是对预处理后的文件进行语法分析,词法分析,语义分析,符号

汇总,然后生成汇编代码。

-> 汇编过程将汇编代码转成二进制文件,二进制文件就可以让机器来读取。每一条汇编语句都会

产生一句机器语言。

-> 链接,链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符

号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统

装入执行的统一整体。

10.内核的配置原理

menuconfig本身的软件只负责提供menuconfig工作的这一套逻辑,menuconfig的菜单内容来自于

Kconfig文件,配置的关键是得到.config文件,内核在编译过程中会读取.config中的配置项,并且

用这些配置项去指导整个编译链接过程。

配置项被配置成Y、N、M会影响.config文件中的CONFIG_XXX变量的配置值。

.config中的配置值(=y、=m、没有)会影响最终的编译链接过程。如果=y则会被编入

(built-in),如果=m会被单独连接成一个ko模块,如果没有则对应的代码不会被编译。

那么这么是怎么实现的?都是通过makefile实现的。

menuconfig配置内核_学习&笔记的博客-CSDN博客

你可能感兴趣的:(面试,linux,面试)