文章目录
POSIX
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX)是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼(RMS)应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承
动态库和静态库
在Windows下静态库的后缀为:.lib、动态库后缀为:.dll;而在Linux下静态库的后缀为:.a、动态库的后缀为:.so。
那么什么是静态库呢?
首先我们来看看程序编译的大体流程:预处理——编译——汇编——链接
在我们的项目开发中,有些代码会被反复使用,那么这时我们便可将这些代码编译成库的形式来调用,像静态库就是在可执行文件中包含库代码的一份完整拷贝,但这种方式有个很严重的缺点就是会造成多份冗余拷贝。静态库会在程序的链接阶段被复制到程序中,所以程序在运行后是不会调用静态库的。
那动态库又是什么呢?
动态库不像静态库那样,在链接阶段并没有被复制到程序中,反而是程序运行的时候由系统动态的加载到内存中供程序调用,所以这里解决了静态库早晨多份冗余拷贝的缺点,系统只需要载入一次动态库,不同的程序可以得到内存中相同的动态库副本,因此可以节省大量的内存
————————————————
版权声明:本文为CSDN博主「Mr.Zhang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34199383/java/article/details/80308782
ioctl
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:
int ioctl(int fd, ind cmd, …);
其中fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。
例如:看门狗操作
MCU
架构
RISC与CISC
-
CISC(Complex Instruction SetComputer,复杂指令集计算机)
复杂指令集(CISC,Complex Instruction Set Computer)是一种微处理器指令集架构(ISA),每个指令可执行若干低阶操作,诸如从内存读取、储存、和计算操作,全部集于单一指令之中。
CISC特点:
1.指令系统庞大,指令功能复杂,指令格式、寻址方式多;
2.绝大多数指令需多个机器周期完成;
3.各种指令都可访问存储器;
4.采用微程序控制;
5.有专用寄存器,少量;
6.难以用优化编译技术生成高效的目标代码程序;
在CISC指令集的各种指令中,大约有20%的指令会被反复使用,占整个程序代码的80%。而余下的80%的指令却不经常使用,在程序设计中只占20% -
RISC(reduced instruction setcomputer,精简指令集计算机)
精简指令集这种设计思路对指令数目和寻址方式都做了精简,使其实现更容易,指令并行执行程度更好,编译器的效率更高。它能够以更快的速度执行操作。
RISC特点:
1.统一指令编码(例如,所有指令中的op-code永远位于同样的位元位置、等长指令),可快速解译;
2.泛用的暂存器,所有暂存器可用于所有内容,以及编译器设计的单纯化(不过暂存器中区分了整数和浮点数);
3.单纯的寻址模式(复杂寻址模式以简单计算指令序列取代);
4.硬件中支援少数资料型别(例如,一些CISC电脑中存有处理字节字串的指令。这在RISC电脑中不太可能出现)。
x86、ARM、MIPS架构
- X86
PC主架构,64位为x86-64或x64 - ARM
手机主架构 - MIPS
英语:MIPSarchitecture,为无内部互锁流水级的微处理器
U-boot
Bootloader 两种模式
- Boot loading 模式
用于产品发布,无用户介入,将操作系统从 flash 加载到 RAM - Downloading 模式
把代码下到 flash 中
主机和板子的传输方式
- 有线:串口协议
- 无线:tftp、nfs
- USB
启动顺序
- 固件的Boot(可能)和bootloader
- 内核
- 文件系统
- 用户程序
bootloader两个阶段
- 第一阶段:汇编
- 硬件初始化:关闭看门狗、关中断、设置cpu速度、时钟频率、RAM初始化等等
- 为第二阶段代码准备RAM
- 复制第二段代码
- 设置栈
- 跳转
- 第二阶段:C
- 初始化内存设备
- 检测 menory map
- 复制内核和根文件系统到RAM
- 为内核设置启动参数:将参数放到指定位置,等待内核启动后去指定位置调用
- 调用内核
U-Boot 移植
- 修改 SDRAM 配置
- 增加 SOC 支持
- 选择 NOR Flash 型号
- 支持串口协议
- 支持网卡芯片
- 支持 NAND Flash
- 支持烧写 yaffs 文件系统映像
- 修改默认配置参数
分区
Linux swap分区及作用详解
我们在安装系统的时候已经建立了 swap 分区。swap 分区通常被称为交换分区,这是一块特殊的硬盘空间,即当实际内存不够用的时候,操作系统会从内存中取出一部分暂时不用的数据,放在交换分区中,从而为当前运行的程序腾出足够的内存空间。
也就是说,当内存不够用时,我们使用 swap 分区来临时顶替。这种“拆东墙,补西墙”的方式应用于几乎所有的操作系统中。
使用 swap 交换分区,显著的优点是,通过操作系统的调度,应用程序实际可以使用的内存空间将远远超过系统的物理内存。由于硬盘空间的价格远比 RAM 要低,因此这种方式无疑是经济实惠的。当然,频繁地读写硬盘,会显著降低操作系统的运行速率,这也是使用 swap 交换分区最大的限制。
语法
缺页异常
给定一个线性地址,MMU 通过页目录表、页表的转换,找到对应的物理地址。在这个过程中,如果因某种原因导致无法访问到最终的物理内存单元,CPU 会产生一次缺页异常,从而进入缺页异常处理程序。
总结一下,缺页异常的原因有以下几种:
1、导致缺页异常的线性地址根本不在进程的“虚存区间”中,段错误。(栈扩展是一种例外情况)
2、地址在“虚存区间”中,但“虚存区间”的访问权限不够;例如“区间”是只读的,而你想写,段错误
3、权限也够了,但是映射关系没建立;先建立映射关系再说
4、映射关系也建立了,但是页面不在内存中。肯定是换出到交换分区中了,换进来再说
5、页面也在内存中。但页面的访问权限不够。例如页面是只读的,而你想写。这通常就是 “写时拷贝COW” 的情况。
6、缺页异常发生在“内核动态映射空间”。这是由于进程进入内核后,访问一个通过 vmalloc() 获得线性地址而引起的异常。对这种情况,需要将内核页目录表、页表中对应的映射关系拷贝到进程的页目录表和页表中。
段错误
段错误表示,该程序(方法、函数)访问的内存超出了系统给这个程序所设定的内存空间。
原因:
- 访问不存在的内存地址
- 访问系统保护的内存地址
- 访问只读的内存地址
- 栈溢出
定位
epc :exception program counter 异常程序计数器
ra : return address 返回地址
文件
权限
压缩
SquashFS是一套基于Linux内核使用的压缩只读文件系统。该文件系统能够压缩系统内的文档,inode以及目录,文件最大支持2^64字节。