赞
踩
嵌入式启动方式:
1、有片内ROM启动
2、片外flash启动(又分为并口/SPI等不同的接口形式)
3、片外EEPROM启动甚至是RAM启动
如AT91RM9200就有片内ROM启动和片外并口flash启动
TI F2812就有并口flash启动和IIC EEPROM启动
TI C6416只有RAM启动,需要主控CPU将程序下载到RAM中,再触发复位
TI C6488启动方式更是多达五六种 每种都有不同的适用场合 可见多么强大
PPC440启动方式更是多达8种
通常都是通过硬件管脚控制的 可以设置跳线选择不同的启动方式
CPU上电时会对这些管脚进行采样 选择相应的启动方式
但是大部分CPU通常都只有一种启动方式 即从并口flash启动
启动地址:
1、ARM系统无论从何种设备启动都是从0地址开始运行的
2、PowerPC通常是0x100或者0xFFF00100,如FreescaleMPC82xx系列
为什么有两种呢?默认是从0xFFF00100启动,但是里面有程序后,可配置为从0x100启动
也有从0xFFFFFFFC启动的,如E500及IBM的PPC405GP和440,只有4个字节,通常这里是一个跳转指令
3、MIPS也有从0x1fc0 0000启动的
4、8086CPU上电复位后,执行的第一条指令的地址是FFFF0H
内核的工作模式:
1、用户模式(user):正常程序执行模式;
2、快速中断模式(FIQ):高优先级的中断产生会进入该种模式,用于高速通道传输;
3、外部中断模式(IRQ):低优先级中断产生会进入该模式,用于普通的中断处理;
4、特权模式(Supervisor):复位和软中断指令会进入该模式;
5、数据访问中止模式(Abort):当存储异常时会进入该模式;
6、未定义指令中止模式(Undefined):执行未定义指令会进入该模式;
7、系统模式(System):用于运行特权级操作系统任务;
8、监控模式(Monitor):可以在安全模式和非安全模式之间切换;
Kernel锁机制
锁是内核中使用最频繁,最基础的设施之一,在内核的各个模块中被大量使用。锁的本质是在并发过程中保证资源的互斥使用。Linux内核提供了多种锁,应用的场合也各不相同,主要包括:原子操作,信号量,读写锁,自旋锁,以及RCU锁机制等。
Linux的内核锁主要是自旋锁和信号量。
自旋锁(spin_lock)
自旋锁是内核中最基础的锁机制。自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元持有,调用者就一直循环在那里看是否该自旋锁的持有者已经释放了锁,"自旋"一词就是因此而得名。自旋锁适用于锁使用者保持锁时间比较短的情况
信号量(semaphore/mutex)
信号量semaphore是一种睡眠锁,实现对多个同类资源的互斥访问,如果资源个数降为1个,就是互斥锁mutex。信号量实现原理如下:初始有n个同类资源,当某个线程获取(down操作)资源时,资源个数-1。当所有资源被分配完,此时当前线程被挂起在等待队列上,直到某个线程释放了(up操作)资源后,唤醒在等待队列上的线程重新获取资源。
中断
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
硬件中断(Hardware Interrupt)
可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。
处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。
伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。
软件中断(Software Interrupt) :
软件中断。是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。
IRQ中断过程
CPSR:当前程序状态寄存器
SPSR:程序状态备份寄存器
R13:栈指针寄存器
R14:连接寄存器
R15:程序计数器
标准中断步骤(IRQ):
1. AIC已经正确编程,AIC_SVR也已经写入正确的中断服务程序的入口地址。且中断已经使能
2. 地址0x18(IRQ的中断向量地址)的指令为
LDR PC,[PC,#&F20]
当NIRQ到来,且CPSR的I位为0时,步骤如下:
① CPSR被拷贝到SPSR_irq,当前程序计数器PC的值被保存到IRQ连接寄存器(R14_irq),同时PC(R15)自身也被赋予了新值0x18。在接下来的时钟里(处理器向0x1C取指令),ARM核使R14_ irq减4
②ARM内核进入IRQ模式
③当指令LDR PC,[PC,#&F20]得到执行(ARM为流水线结构,当前PC之前还有两条指令)后,PC被赋予了AIC_IVR的内容。读取AIC_IVR具有如下作用:
·将当前中断设置为被挂起的最高优先级中断,并把它作为最高优先级的中断;当前中断级别则设置为此中断的优先级。
·将NIRQ的信号撤消(即使系统没有用到向量功能,也必须去读AIC_IVR,以便将NIRQ撤消)。
·如果中断为边沿触发,则读取AIC_IVR会自动将中断清除
·将当前的中断的优先级推入堆栈
·返回当前中断的AIC_SVR的值。
④上述步骤将程序跳到了对应的中断服务程序。接下来的第一步是保存链接寄存器LR(R14_irq)和SPSR(SPSR_irq)。如果需要在中断返回时,把LR的值直接赋给程序计数器,则LR首先要减去4 才能保存。否则在中断返回时,LR要首先减去4之后才能拷贝给PC。
⑤清零CPSR的位I就可以使其他中断不被屏蔽,再施加的NIRQ可以被内核接受。只要发生的中断的优先级高于当前中断的优先级,嵌套中断就会发生。
⑥接着中断例程可以保存相应的寄存器以保护现场。如果此时有高优先级中断发生,则处理器将重复执行从步骤①开始的动作。要注意的是,如果中断是电平敏感的,那么在中断结束前要清除中断源。
⑦在退出中断前要首先置位CPSR的位I,以便屏蔽其他中断,保证多个中断有序地完成。
⑧在结束中断之前还必须执行一次对AIC_EOICR的写操作,向AIC表明中断已经完成。存放于堆栈的前一个当前中断优先级将被弹出并作为当前中断优先级。如果此时系统又有一个挂起的中断,其优先级比刚才结束的中断的优先级低(或相等)、但又高于从堆栈弹出来的中断的优先级,则将重新施加NIRQ;但是,中断步骤不会立即开始,因为此时CPSR的I位是置位的。
⑨SPSR(SPSR_irq)被恢复。最后是链接寄存器LR恢复到PC。程序返回到中断发生前之处。 SPSR也恢复为CPSR,中断屏蔽状态恢复为SPSR所指明的状态。
注:SPSR的位I是很重要的。如果在SPSR恢复之后为置位状态,则表明ARM核正要屏蔽中断,在执行屏蔽指令时被中断。因此,SPSR恢复后,屏蔽指令得以完成,亦即I被置位,
因而IRQ 被屏蔽。
MMU && DDR && Cache
内存又可以叫做主存。是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是访问数据的速率快。
当CPU采用高速缓存时,它的写内存操作有两种模式:
一种称为“穿透”(Write-Through) 模式,在这种模式中高速缓存对于写操作就好像不存在一样,系统的写磁盘操作并不利用阵列卡的Cache,而是直接与磁盘进行数据的交互。每次写时都直接写到内存中,所以实际上只是对读操作使用高速缓存,因而效率相对较低。
另一种称为“回写”(Write-Back) 模式,写的时候先写入高速缓存Cache,然后由高速缓存的硬件在周转使用缓冲线时自动写入内存,或者由软件主动地“冲刷”有关的缓冲线。
优点:write-back:磁盘写性能高
缺点:wirite-back:系统崩溃或突然断电时,cache中的数据会丢失。
MMU(Memory Management Unit)内存管理单元
它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
原理:虚拟地址根据页表基地址寄存器找到页表,通过虚拟地址对应的部分找到条目。根据本身的不同设置决定是否需要寻找第二页表或者直接得出物理地址。
功能:对于程序而言,为了将程序分割成一张张的卡片(页面),然后再运行的时候将需要的部分嵌入到物理内存的卡槽(页框)里面。MMU就是为了完成操作系统的这个功能而设计的。MMU可以在被初始化后,形成的一个个虚拟地址对应到物理地址,将一张张的卡片分别映射到相应的物理内存中。举个例子:在linux中的每个进程都维护着自己的页表,在切换进程上下文的时候须要将页表首地址也记录下来( 即记录页表基地址寄存器的值,再将要被切换到的进程的页表基地址还原到这个寄存器中 )。这个时候不同进程的同一个虚拟地址都会对应着不同的页表项,从而对应着不同的物理地址了。
DDR
双倍速率同步动态随机存储器,是内存的其中一种。
SDRAM(同步动态随机存储器)在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;
而DDR内存则是一个时钟周期内传输两次数据,它能够在时钟的上升期和下降期各传输一次数据,因此称为双倍速率同步动态随机存储器。
DRAM,SDRAM和SRAM
SRAM不需要刷新电路即能保存它内部存储的数据。
而DRAM(Dynamic Random Access Memory)每隔一段时间,要刷新充电一次,否则内部的数据即会消失。
相同容量的DRAM内存可以设计为较小的体积,但是SRAM却需要很大的体积。
ARM WFI和WFE指令
WFI(Wait for interrupt)和WFE(Wait for event)是两个让ARM核进入low-power standby(低能耗支持)模式的指令,
不同点
ARM 使用什么技术来支持内存越界访问检测
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
Linux C编程内存泄漏检测工具:mtrace, dmalloc , memwatch
内存颗粒
很多时候,常听人们说到“内存颗粒”,其实这是港台地区对内存芯片的一种称呼(仅对内存),其他的芯片,港台则称为“晶片”,
在 芯片的内部,内存的数据是以位(bit)为单位写入一张大的矩阵中,每个单元我们称为CELL,只要指定一个行(Row),再指定一个列 (Column),就可以准确地定位到某个CELL,这就是内存芯片寻址的基本原理。这个阵列我们就称为内存芯片的BANK,也称之为逻辑 BANK(Logical BANK)。
内存芯片的容量是一般以bit为单位的。
总线,设备和驱动
总线:一个总线是处理器和一个或多个设备之间的通道. 为设备模型的目的, 所有的设备都通过一个总线连接, 甚至当它是一个内部的虚拟的,"平台"总线。
设备:设备就是连接在总线上的物理实体。设备是有功能之分的。具有相同功能的设备被归到一个类(CLASS)中.在Linux 系统中,每个设备由一个 struct device 代表。
驱动:驱动程序是在CPU运行时,提供操作的软件接口.设备模型跟踪所有对系统已知的驱动. 这个跟踪的主要原因是使驱动核心能匹配驱动和新设备
总的来说其三者间的关系为bus有两条链表,分别用于挂接设备和驱动,指定了其自身bus的device或者driver最后都会分别连接到对应bus的这两条链表上。
总线、设备、驱动结构中,总线的match函数负责匹配驱动与设备;然后匹配成功后会调用驱动中的probe函数,卸载驱动或设备的时候后调用release函数
GCC编译环境
少优化->多优化:
O0 -->> O1 -->> O2 -->> O3
-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-O1:优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。
-O2:会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存和编译时间。
-O3: 在O2的基础上进行更多的优化。
-Os:相当于-O2.5。是使用了所有-O2的优化选项,但又不缩减代码尺寸的方法。
-c 只编译并生成目标文件。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
磁盘分区表
GPT:GUID磁盘分区表(GUID[globally unique identifier] Partition Table,缩写:GPT)。其含义为“全局唯一标识磁盘分区表”,是一个实体硬盘的分区表的结构布局的标准。使用GUID分区表的磁盘称为GPT磁盘
MBR:Master Boot Record,即硬盘主引导记录分区表,只支持容量在 2.1TB 以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只支持4个主分区或三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。
参考链接:https://blog.csdn.net/weixin_42881419/article/details/104377941
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。