嵌入式知识点

嵌入式知识点

这是楼主在准备嵌入式软件开发岗的时候整理的部分自己总结的嵌入式知识点,希望能够帮到大家;
部分内容可能和后面的C++大杂烩知识点有重复 0.0
附几个楼主在B站学的相关知识网站,大家自取所需哈~

C++学习
Linux系统编程
Linux网络编程
git版本控制器
QT入门教程
AD软件教程

带参宏和函数的区别

带参宏在编译预处理只是简单的字符替换,而函数在运行时进行调用和返回
带参宏不占运行时间,函数占时间
带参宏不分配内存,不存在类型问题;函数分配内存,需要实参和形参类型一致

内联函数的优缺点和适用场景

优点:和宏一样在原地展开,省去函数调用开销,又能做类型检查
缺点:增大代码量,消耗内存
适用函数体内没有循环且代码简短的

关键字

volatile关键字的作用及实例

作用:告诉编译器不要去优化这个变量的值,因为这个变量会被意想不到的改变,即每次都是重新读取而不是使用寄存器中的备份
例子:状态寄存器、中断服务子程序访问的非自动变量、多个线程共享的变量

关键字static的作用

修饰局部变量时:存储在静态区+改变生命周期为整个源程序+自动初始化为0
修饰全局变量:改变作用域,只能在同一文件内使用
修饰全局函数:改变作用域,只能在同一文件中被其他函数调用

关键字const作用

修饰常量:定义时后不能更改
修饰形参:该形参在函数里不能改变
修饰类成员函数:该函数堆成员变量只能进行读操作,不能修改成员变量的值

sizeof和strlen作用

sizeof:计算变量、数据类型占用的字节数,+数组名得到数组所占字节数,+字符串指针名得指针所占字节数
strlen:测试字符串所占字节数,不包括结束符'\0'

关键字extern作用

作用:跨文件引用全局变量,在本文件中引用一个在其他文件定义的全局变量

extern "c"作用

只能在c++中使用
在c++中调用c:extern "c"{c函数库文件/函数声明}
在c中调用c++:在c++头文件中加extern "c"{c函数库文件/函数声明}

关键字register作用

作用:将修饰的变量尽可能放在cpu的寄存器中,加快存取得的速度
注意:变量可能不存放在内存中,不能用&获取该变量的地址

变量定义

指向有10个整型数数组的指针(数组指针):int(a)[10]
指向函数的指针:int (
a)(int)
指针数组,指向函数:int (*a[10])(int)

杂项

当表达式存在有符号数+无符号数时,有符号数自动转成无符号数
float变量的比较if语句不能用==或!=,要转成>或<
‘0’的ascii码是48,‘A’的ascii码是65,‘a’的ascii码是97
数据结构:数组、链表、堆、栈、树、图、队列

内存对齐原因

平台不同,不是都可以访问任意地址上的任意数据
影响性能,即变量的访问次数减少

数组首元素地址和数组地址

不同:概念不同,数组首元素地址+1(a+1)表示下一个元素地址,而数组地址+1(&a+1)表示下一数组地址
相同:数组首元素地址和数组地址的值是相等的

malloc底层是如何实现的

系统有可用内存连接成的空链表,调用的时候寻找足够大的内存,一部分和申请的一样返回给用户,另一部分返回给链表
若内存块太散无法满足要求则合并相邻的内存块

溢出

内存泄漏和内存溢出

内存泄漏
指已经动态分配的堆内存没有释放或无法释放造成内存空间浪费
分类:常发性、偶发性、一次性和隐式
内存溢出
系统无法回收的内存或程序运行所需内存大于系统所能提供的
原因:内存泄漏堆积、保存多个消耗内存过大的对象

内存越界

向系统申请内存,使用时超出申请的范围

堆栈溢出

堆内存溢出
堆的尺寸设置太小、动态申请的内存没有释放
栈内存溢出
栈的尺寸设置太小、递归层次太深、分配过大局部变量

链接和编译

编译(汇编)生成的是.o目标文件,对外部符号如跨文件的全局变量不做处理
链接生成的是可执行程序,链接将会解释外部符号

函数参数的传递方式

值传递
指针传递

new和malloc区别

new是c++操作符,允许重载;malloc是c/c++库函数,不允许重载
new可以自动计算内存大小,malloc需指定内存大小
new返回的是对象类型的指针,malloc返回的是void*类型,需要强制转换
new从自由存储区上动态分配内存,malloc从堆上分配
new失败返回bac_alloc异常,malloc失败返回null
new会调用对象的构造/析构函数,malloc不会

指针和引用区别

指针是变量,保存的是地址;引用是原变量的别名
指针有const,引用没有
指针可以为null,引用不行
非const指针可以改变,引用初始化后不能改变
指针有多级,引用只有一级
指针++表示地址增加,引用++表示变量增加
sizeof+指针表示指针本身大小,sizeof+引用表示原变量大小

快慢指针

判断链表是否有环

一个走一步,一个走两步,如果走的快在链表末尾之前的追上了慢的则有环,否则没有

找出链表的中间节点

一个走一步,一个走两步,当走两步的走到了最后一个节点时,另一个就刚好到链表中间节点

删除链表倒数第n个节点

两个指针指向第一个节点,一个先走n步,然后同时走,当快的指针走到结尾时,慢的哪个就是倒数第n个

删除排序链表中的重复项

一个从第一个节点出发,一个从第二个节点出发,同时走动,如果所指元素相同则释放快指针节点,然后快指针指向下一个节点

数组和链表

数组个数定义时必须确定,且元素类型一致;链表个数自由,元素类型可以不一样
数组元素在内存中按顺序存储;链表随机存储
数组访问速度快,链表插入删除速度快

二叉树

满二叉树

树的每一层节点个数达到最大

完全二叉树

树除了最后一层外其他层的节点数都达到最大,且最后一层节点都靠左排列
这是堆排序所使用到的树

平衡二叉树

树的两个子树高度差不超过1时

二叉树遍历

左序遍历:根左右
考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树

中序遍历:左根右
考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树

右序遍历:左右根
考察到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值

c++类型转换

static_cast:静态转换,在编译处理期间,基本类型转换,运行时没有类型的检测
const_cast:去常转换,编译时执行,不是运行执行,const_case:加上const属性
reinterpret_case:重解释类型转换,可转换任意内置数据类型为其他的类型
dynamic_cast:将指向基类的指针转换成指向派生类的指针,失败返回空指针

多态的类

虚继承:虚继承的类会多创建一个4字节的虚表指针
多重继承:以虚继承实现多重继承,同时虚继承的时候记得减去基类的副本
继承的多个子类中有同一个基类的,继承后的内存中基类的只保留一份内存,所以要将原先多个子类中的基类剪掉只剩下一个基类的内存
普通继承:含空类,虚函数
空类占1个字节
类中有一个虚函数的,占4字节虚函数指针表,后面再继承的时候就不会加了,即使派生类还有虚函数也公用一个指针表

实现多态条件

要有继承
要有虚函数重写
要有父类指针(父类引用)指向子类对象

拷贝构造函数

浅层拷贝:拷贝的时候只增加了一个指针指向原来已经存在的内存,当对象释放所指空间的时候,其他对象如果也释放则会造成同个内存释放两次
深层拷贝:拷贝的时候不仅增加指针,还另外开辟内存让这个指针指向,这样就不会造成同一个内存释放多次的情况

什么时候需要使用

默认的拷贝构造函数是浅拷贝,要在拷贝构造函数里面修改
凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数

什么时候调用

一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另一个对象进行初始化

构造/析构

析构函数不能抛出异常

对象析构发生异常的时候对象已经不存在了,如果抛出异常则后面的无法执行,某些内存释放就没有执行可能造成内存泄漏
通常异常的时候c++会调用已经构造对象的析构函数来释放资源,如果析构抛出异常则陷入重复异常,会使程序崩溃

构造函数不能是虚函数

虚函数的使用依赖于指向虚函数表的指针,而在对象创建的时候还没有实例化,也就不存在该指针
虚函数是通过父类的指针去调用子类的函数,而子类的构造函数都是在创建的时候自己调用的,不可能通过父类来实现
构造对象不是动态的行为,只有一次

构造函数:名字和类名一样,没有返回值,可以重载

默认构造函数:Student(int num=10,int age=10)、Student()
初始化构造函数:Student(int num,int age);//有参数
复制(拷贝)构造函数:Student(const Student&);//形参是本类对象的引用
转换构造函数(将一个其他类型的数据转换为一个类的对象):Student(int r){int num=1004;int arg=r};//形参是其他类型变量,且只有一个形参

重载、重写(覆盖)、隐藏

重载:在同一个类中,同名函数,根据参数的类型、个数和顺序的不同来区别使用,静态绑定
重写(覆盖):在不同类中,派生类中重新定义基类中的同名函数,定义和基类一样,函数体不一样,重写的基类中被重写的函数必须有virtual修饰(多态),动态绑定
隐藏:派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏,调用的是派生类的函数,指定作用域可调用父类的

纯虚函数(抽象类):

只有函数的名字而不具备函数的功能,不能被调用。
纯虚函数的作用是在基类中为其派生类保留一个函数的名字,以便派生类根据需要对他进行定义
带const的成员变量不能在构造函数中初始化,要使用构造函数初始化表语法进行初始化
在C++中, 如果类的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,即满足隐式类型转换。explicit 关键字只对有一个参数的类构造函数有效

STL库各种容器

顺序性容器:各元素组成有顺序关系的线性表,元素追加位置与追加顺序一样

vector(向量)

可看成动态数组,可以直接访问任何元素
只能在后端进行追加和删除操作,不能进行插入和删除
当添加元素时空间不够,会以原大小的两倍另外配置较大的空间,将原先空间内存拷贝过来并在末尾添加元素和释放原空间

list(双链表)

线性链表结构,支持插入和删除操作,不支持[]和.at
存储在非连续空间中

deque(双端队列)

可对序列两端进行添加和删除操作,较快速随机访问
采用多个连续存储块保存对象,类似于vector和list结合体
支持随机访问[]和.at,以及内部随机删除插入
关联式容器:链式存储,红黑树结构,以键值方式保存数据,将关键字和值关联保存

set

快速查找,不允许重复值
按一定顺序排列,集合中的每个元素被称作集合中的实例
内部通过链表的方式组织,因此插入的时候比vector快,但在查找和末尾追加比vector慢

map

提供一种“键-值”关系的一对一的数据存储能力。键按一定顺序排列且不可重复(set也可以看成没有键只有值的特殊map形式)
链表方式存储,继承了链表的优缺点,一对多映射,基于关键字快速查找

multistet、multimap

去掉了元素唯一的要求,其他都一样

容器适配器:采用已经存在的容器来实现其他功能的机制

stack:栈,先进后出,默认基于deque容器实现,任意一种容器都可以
queue:队列,先进先出,默认基于deque容器实现,vector不适用
priority_queue:优先级队列,最高优先级元素总是第一个处理,需要提供随机访问功能,默认基于vector容器,list不适用
迭代器:为了表示容器中某个元素位置这个概念而产生的,是一种检查容器内元素并遍历元素的数据类型

cpu内部结构

控制单元:指令寄存器、指令译码器
运算单元:算数逻辑单元
存储单元:专用寄存器和通用寄存器
时钟单元

嵌入式微处理器和DSP(数字信号处理)

微处理器偏向控制,DSP偏向运算
微处理器外围接口丰富,DSP对系统结构和指令做了优化,适合大量数据的快速计算

ARM

ARM处理器工作状态

ARM状态
工作在32位指令状态,指令为32位
Thumb状态
工作在16位指令状态,指令为16位
Thumb-2状态
兼有16和32位指令
调试状态

ARM寄存器

R15:程序计数器PC
R14:程序链接寄存器LR
R13:堆栈指针寄存器SP
ARM在不同工作模式下使用寄存器的共同点
R0~R7为公用的通用寄存器
CPSR为公用到的当前程序状态寄存器
R15为公用的程序计数器PC

不可重入函数特征(一个函数同时多次调用)

使用了静态数据结构
调用了malloc/free
调用标准I/O库函数
进行浮点运算

中断相关

中断处理的过程

中断请求+中断响应+保护现场+中断服务+恢复现场+中断返回
中断服务程序能不能有参数和返回值
在单片机裸机中,既不能有参数也不能有返回值
在带操作系统的嵌入式系统中可以有

中断向量

指中断服务子程序的入口地址
复位中断和其他中断
复位中断:中断发生后立即中断当前指令的执行,且无需返回
其他中断:中断发生后,当处理完当前指令后再去响应中断

存储设备

nand flash和nor flash

nand flash
单位:字节
容量小,成本高,不耐操,可直接运行程序
nor flash
单位:页
容量较大,成本低,耐操,不能直接运行代码

SRAM,DRAM,SDRAM

SRAM
静态随机存储器,上电不需刷新,cpu缓存类型
DRAM
动态随机存储器,上电了也要刷新,如系统内存
SDRAM
同步动态随机存储器,即数据读取需要时钟来同步,也可做内存

RAM,ROM

RAM:随机存储器,速度快,断电丢失,做内存
ROM:只读存储器,速度慢,不与cpu交互,断电不丢失

大小端

大端

高对低、低对高
优点:符号位在低地址的第一个字节,便于快速判断数据的正负和大小

小端

低对低,高对高
优点:取值的时候依次从内存低位到高位取,效率高,强制转换不需要调整字节内容

缓冲技术作用

改善cpu与io设备间速度不匹配问题
提高cpu与 io设备之间的并行性,提高系统吞吐量和设备利用率
减少cpu对中断的频率

GPIO口

包含的寄存器:控制寄存器、数据寄存器、上拉寄存器
模式
输入:浮空输入、上拉输入、下拉输入、模拟输入
输出:开漏输出、推挽输出、开漏复用输出、推挽复用输出(I2C)

总线接口

UART

串行+异步+全双工+RX,TX,GND+小端模式+数据5/6/7/8位

USB

串行+同步+半双工+VBUS,GND,D+,D-+小端模式

I2C

串行+同步+半双工+SDA,SCL+大端模式+数据8位
从机地址(R/W)+应答+从机寄存器地址+应答+数据+应答

SPI

串行+同步+全双工+MISO,MOSI,CS,SCLK+大端模式+数据8/16位
根据时钟极性CPOL和时钟相位CPHA可构成四种组合
CPOL=0,CPHA=0:空闲时SCLK为低电平,在第一个边沿开始采样
CPOL=0,CPHA=1:空闲时SCLK为低电平,在第二个边沿开始采样
CPOL=1,CPHA=0:空闲时SCLK为高电平,在第一个边沿开始采样
CPOL=1,CPHA=1:空闲时SCLK为高电平,在第二个边沿开始采样

同步串行和异步串行

同步串行:以字符为单位传送信息+字符内部各位同步+字符间异步
异步串行:以数据块为单位传送信息+字符间无间隔+字符内部各位和字符间都同步
串行速度慢但占用资源少,干扰小;并行速度快但占用资源多,干扰大

UART和RS232,RS485,TTL

UART:一种具有协议特征的总线,它规定了数据要按照什么格式和顺序来传输
RS232,RS485和TTL:是三种不同的电气协议,用于数据传输通路,不对数据进行处理
TTL:+5v=1,-5v=0
RS232:负逻辑传输 -5v-15v=1,+5v+15v=0,只允许一对一通信
RS485:差分传输A+ - B->200mv=1,A+ - B-<200mv=0,允许连接多达128个收发器

CAN和RS232,RS485

CAN相对于RS232来说采用的是差分传输,内置CRC校验,抗干扰强
CAN相对于RS485来说能构成多主系统,可在同一时刻有两个或以上设备处于发送状态

其他

MSB:二进制中最高有效位;LSB:二进制中最低有效位
冯诺依曼结构:数据和指令一起;哈佛结构:数据和指令分开
DSP 为了提高数据吞吐的速度,基本上都是指令、数据空间独立的哈佛结构
单片机为了存储器管理的方便(便于支持操作系统),一般采用指令、数据空间统一编码的冯·诺依曼结构

波特率

在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率
双方波特率要相同:串行通信的要求是同步传输,不同步收发消息会乱了
高低波特率有什么区别:波特率越高,传输速度越快,距离越短

I2C 总线仲裁

SCL线的同步:由于总线具有线“与”的逻辑功能,即只要有一个节点发送低电平时 ,总线上就表现为低电平。当所有的节点都发送高电平时,总线才能表现为高电平
SDA线的仲裁:建立在总线具有线“与”逻辑功能的原理上的。节点在发送1位数据后,比较总线上所呈现的数据与自己发送的是否一致。是,继续发送;否则,退出竞争

应用编程

同步IO和异步IO

同步IO:当一个IO操作执行时,应用程序必须等待直到此IO执行完成
异步IO:在后台运行,IO操作和应用程序可以同时运行
同步是一个过程,阻塞是线程的一种状态,同步不一定阻塞,阻塞一定同步

进程间通信

管道

匿名管道:单向流动,有亲缘关系进程之间使用
有名管道:单向流动,允许无亲缘关系的进程之间的通信

信号量

是一个计数器,作为同步机制用于进程和线程之间的同步

消息队列

消息链表,克服了信号传递讯息少、缓冲区大小受限等问题

共享内存

一段可被多个进程共同访问的内存,通信效率最快

套接字

不同主机之间的进程通信

信号

通知接收进程某个事件已经发生

进程的五种状态

就绪态:所有条件就绪,等待cpu
运行态:获得cpu运行
僵尸态:执行结束后父进程没来得及回收
等待态/睡眠态/挂起:由于某些资源暂时得不到而挂起,等待唤醒
暂停态/阻塞:等待某个事件而暂停运行

父子进程

子进程继承父进程的有:堆栈、内存、用户好和组号、打开的文件描述符、当前工作目录和根目录
子进程独有的:进程号、不同的父进程号、自己的文件描述符,独立的地址空间

上下文

进程上下文

进程上文:指用户态切换到内核态时需要保存的用户态的进程状态的内容
进程下文:指切换到内核态后执行的程序,即进程运行在内核空间的部分

中断上下文

中断上文:硬件通过中断传递给内核的参数和需要保存的中断环境
中断下文:指执行在内核空间的中断服务程序
/proc目录下,以数字命名的目录表示当前一个运行的进程,目录名为PID

进程和线程

区别

进程是系统程序运行和资源分配的基本单位;线程是cpu调度的基本单位
一个进程拥有多个线程,线程可访问所属进程资源
同一个进程下的多个线程共享一个地址空间,线程间通信简单,切换、创建开销小
进程通信麻烦,切换、创建开销较大

使用场景

进程:程序安全性、稳定性要求
线程:需要频繁通信/切换程序/创建或销毁程序的时候

进程分类

僵尸进程:子进程退出后父进程未来得及回收
孤儿进程:子进程还没结束,父进程先结束,最后被init进程所收养

守护进程:在后台运行不受终端控制
创建守护进程步骤:
创建父子进程,父进程退出
子进程创建会话
更改当前目录为根目录
重设文件权限掩码
线程同步

互斥锁和信号量区别

信号量用于线程同步,互斥锁用于线程互斥
信号量可实现多个线程同步,互斥锁只能用于一个资源的互斥访问
信号量可由不同线程进行操作,互斥锁只能由同一个线程进行操作
信号量:当信号量不为0时访问共享资源,为0时阻塞等待直到信号量不为0
条件变量:一个线程等待某个条件为真而将自己挂起,另一个线程使条件成立,并通知等待的线程继续

各种锁

互斥锁:加锁失败后,线程会释放cpu给其他线程,阻塞等待,醒来需要切换上下文,开销大
自旋锁:加锁失败后,线程会忙等待直到拿到锁
读写锁:读锁共享,写锁独占

网络编程

OSI协议七层模型

应用层+表示层+会话层+传输层+网络层+数据链路层+物理层
应用层:实现多个进程之间的通信,同时完成各种服务如文件传输,电子邮件等
传输层:为通信双方提供传输服务,如可靠连接TCP,不可靠连接UDP
网络层:连接不同局域网

TCP/IP协议

应用层:远程登陆telent,文件传输ftp、动态域名dns等
传输层:TCP,UDP两种方式

网络层

IP:为主机提供一种无连接,不可靠的数据服务
IGMP:主机与路由器之间进行组播成员信息交互
ICMP:主机与路由器之间传递控制信息
ping发出的是ICMP请求报文

网络接口层

ARP:IP地址-》MAC地址 地址解析协议
RARP:MAC地址-》IP地址 反地址解析协议
端口是软件结构,被用户进程或服务进程用来发送和接收信息
IP地址:网络号+主机号
分类:A~E类,A政府机构,B中等规模企业,C任何人,D多播,E实验

IP和MAC

相同

都是唯一的

不同

IP根据网络拓扑设计,可以改动,MAC基于制造商,不能动
IP长32位,MAC长48位
IP属于网络层,可使数据从一个网络到另一个网络;MAC在数据链路层,可使数据从一个节点传递到相同链路的另一个节点

socket

服务器端

socket() 创建套接字
bind():绑定本地IP地址和端口号
listen():设置监听队列长度
accept():等待连接
read():接收消息
close():关闭套接字

客户端

socket():创建套接字
connect():发送连接请求
write():发送信息
close():关闭套接字

明确标识一条连接

五元组:客户端端口+IP,服务端端口+IP,传输协议

epoll

是网络编程中用于处理大批量文件描述符,对select/poll的改进
select监听的fd有上限,select/poll每次调用会遍历所有fd,效率低,epoll不会

TCP/UDP

区别

TCP面向字节流、面向连接,UDP基于数据报、面向无连接
TCP结构复杂,占用资源多,提供可靠服务,UDP不提供,结构简单且占用资源少
TCP有拥塞控制,UDP没有
TCP只支持一对一,UDP支持一对一,一对多,多对一等

适用场景

TCP:对数据传输质量要求高,对实时性要求不高的时候(有拥塞控制,堵塞时会放慢传输速度),如文件传输协议
UDP:对数据传输的实时性要求高,对质量要求不高的时候,如在线视频、网络电话等
TCP可靠连接
TCP传输数据满足四大条件:不出错、不丢失、不重复、不乱序,拥有窗口机制、拥塞机制等

如何保证?

校验和+序列号
确认应答+超时重传
拥塞控制机制
窗口机制:双方协调发送的数据包大小

第三次握手可以去掉吗?

不行,第三次是为了防止已经失效的连接请求报文突然传输到服务器,从而建立错误连接
其次,若第二次握手客户端没有收到,则服务器再发送数据包后收不到回应会以为丢包了而不断重发,造成死锁

四次挥手中,客户端为什么最后还要等待2*msl?

保证客户端发送的最后一个ACK报文能够到达服务器,这样当报文丢失了,服务端可以在2*msl内重发给客户端确认释放报文
使得本连接持续的时间内所产生的所有报文都从网络消失

连接三次?挥手四次?

建立连接时,服务器处于listen状态,不需要等待,可把ACK和SYN放在一个报文发给客户端
关闭连接时,服务器只接收客户端的FIN,只表示对方不再发送数据,对方可能还能接收数据或自己数据还没发完,所以ACK和FIN,ACK是分开发送的

server第二次握手将ACK置一,且进行资源分配;client第三次握手将ACK置一,且进行资源分配

TCP粘包

就是发送方发送的若干数据包到达接收方时粘成了一个包,在缓冲区中两个数据连在一起
原因:发送方使用Nagle算法,接收方的应用层从缓冲区读取数据包的速度小于TCP将数据包保存到接收缓冲区

路由器、交换机、集线器

路由器:网络层,根据IP选择路由
交换机:数据链路层,通过MAC地址选择端口
集线器:物理层,只对进行整形后放大重发

Linux系统组成

Linux内核
Linux shell
Linux文件系统
Linux应用程序

Linux内核组成

内存管理子系统
进程管理子系统
文件管理子系统
I/O管理子系统

内存管理单元MMU作用

地址映射
内存分配和回收
内存保护和扩充

虚拟内存

内存管理的一种技术,使应用程序认为自己有连续的内存空间,而实际对应的物理内存不连续,可能有部分在外部磁盘

进程调度策略

短进程优先:从就绪队列中选择运行时间最短的
高响应比优先:优先级随等待时间的增加而增加
多级反馈队列
最高优先权优先
linux内核调度策略
时间片轮转:循环执行
先来先服务:从就绪队列中选择最先进入的进程

I/O子系统层次结构

用户层I/O软件
设备独立性软件
设备驱动程序
中断处理程序

各种地址

逻辑地址:与内存段相关的偏移地址部分,如变量的地址
线性地址:逻辑地址+基地址
物理地址:线性地址转换后的地址
总线地址:X86下的I/O地址,ARM下的物理地址
虚拟地址:mmu虚拟出来的地址

内存分配方式

分页存储管理:不需要连续的内存空间,利用率高,不利于实现内存共享
分段存储管理:易于实现段内存共享和保护,需要连续的内存空间,利用率低
段页式存储管理:不需要连续的内存空间,利用率高,易于实现段内存共享,复杂

用户空间与内核空间通信方式

系统调用
信号:内核发生异常时会发送信号给用户空间
proc文件系统:大量内核的信息和可调用参数都被作为常规文件映射到这个目录,用户可通过echo等进行修改和查询
共享内存:mmap
netlink:类似socket,可读写大量数据

用户调用read()/write()后内核干嘛了?

进入内核空间-》调用内核sys_read/sys_write()-》内核函数进一步调用fop.read()/fop.write()指向的函数即为驱动中的具体的读写函数

bootloader、linux内核、根文件系统关系?

系统上电后,bootloader就初始化处理器和外设
启动流程第一阶段为汇编,完成cpu的初始化
启动流程第二阶段为c语言,进一步完成硬件初始u啊,建立内存映射,并将内核映像和根文件系统读取到内存中,然后调用内核

uboot关闭cache:cache主要加快cpu读取内存指令速度,但在刚开始cpu初始化时内存为准备好
接着将linux内核、根文件系统从存储器读取到内存中并执行linux内核
linux内核完成初始化之后就挂载某个文件系统为根文件系统

编译的四个阶段

预处理:引入头文件、进行宏替换、处理条件编译指令、去注释加行号
编译:进行语法分析,生成汇编.s文件
汇编:将汇编代码转成二进制代码.o目标文件
链接:将目标文件连接成可执行代码(静态链接:库文件代码放到可执行文件.a后缀、动态链接:执行时转到库文件代码.so后缀)

死锁

多个进程因资源竞争造成和、的僵局,互相等待,无法推进

四个形成必要条件

互斥条件:一个资源每次只能被一个进程使用
请求与保持条件:进程以获得的资源,再提出请求资源的时候被阻塞时,原先的资源保持不放
不可剥夺条件:进程的资源只能由自己来释放
循环等待条件:若干进程形成首尾相接循环等待资源的关系

预防死锁

静态分配:进程在开始执行时就申请他所需要i的全部资源
动态分配:进程申请资源时本身不占用资源
进程在阻塞等待的时候,所占的资源被隐式释放,只有获得所需的全部资源后才能重新启动
采用资源有序分配,对资源进行编号,只有获得不紧缺资源的进程才可以申请紧缺资源

链接:给已有的某个文件指定一个可用于访问它的名称

硬连接:引用的是文件在文件系统中的物理索引inode,只能引用同一文件系统中的文件,删除原文件链接不变
软链接:新建一个文件来指向源文件,删除源文件则链接不可以,可以跨文件系统使用

内存零头

内零头:进程在向操作系统请求内存分配的时候,系统在满足进程需求的同时额外多给进程的那部分,页式管理会出现
外零头:内存中存在一些空闲内存,但是因为太小满足不了进程申请的大小而无法使用,段式存储管理会出现

中断分类

异步中断:也叫外部中断,由外设产生的电信号,发生时间不可预估
同步中断:内部中断、异常,由cpud内部产生的电信号,是在当前指令执行完才产生中断

挂起、休眠、待机

挂起:cpu、内存工作,外设停止工作
待机:只对内存供电,cpu、外设停止工作
休眠:cpu、内存停止工作,内存的数据保存到硬盘中

linux目录

/usr:操作系统软件资源所放置的目录
/tmp:临时存放文件的地方
/etc:系统主要配置文件

实时系统和非实时系统

实时系统:可抢占式内核:响应外部事件快且响应时间具有确定性,ucos、rthread
非实时系统:非抢占式内核,响应时间没有保证,linux

块和页的关系

块:操作系统读写硬盘的最小单位
页:操作系统读写内存的最小单位
扇:磁盘的最小物理单,磁盘读写以扇区为最小基本单位

ps和top命令

ps:看到命令执行瞬间的进程信息,只查看进程信息
top:实时地监视,不断更新进程状态,还可以监视系统性能和操作进程

全部评论
nadaflash和norflash是不是反了?
点赞 回复 分享
发布于 2022-09-02 16:43 安徽

相关推荐

评论
13
66
分享

创作者周榜

更多
牛客网
牛客企业服务