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博客