第一章
1.嵌入式系统定义
嵌入式系统是以应用为中心,以计算机技术为基础,采用可剪裁软硬件,适用于对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统。
嵌入式微处理器 外围硬件设备 嵌入式操作系统 应用程序
嵌入式系统体系结构
嵌入式处理器类型
嵌入式微处理器(Embedded Microprocessor Unit,EMPU)
由通用微处理器裁剪后发展而来 386EX,PowerPC,MIPS,ARM
嵌入式微控制器(Microcontroller Unit,MCU)
在一块芯片上集成cpu、存储器及其他部件 单片机
嵌入式DSP处理器(Embedded Digital Signal Processor,EDSP) 嵌入式片上系统(System On Chip)
第二章
ARM主要采用32位指令集, Thumb 16位指令集
ARM9处理器架构
ARM9处理器系列有两个分支
基于v4版本的ARM9,典型的有ARM9TDMI和ARM922T
基于v5TE或v5TEJ架构的ARM9E,典型处理器有ARM9EJ-S和
ARM926EJ-S等
后面关于ARM9的介绍主要也是围绕ARM9E系列
状态寄存器
1个当前程序状态寄存器(CPSR)和5个备份状态寄存器(SPSR)
状态寄存器结构
SPSR在处理器进入异常模式时用来保存CPSR寄存器内容,当从异常退出时,用SPSR恢复CPSR的值
流水线技术和哈佛体系结构
冯·诺依曼体系将数据和指令全部存储在同一个存储器中
哈佛体系中,指令存储和数据存储是分开的,指令的存取和数据的存取通过不同的
数据总线进行
内存管理单元MMU作用
CPU产生的虚拟地址被先送到MMU中,通过一定的映射,转换为物理地
址,然后进行相应的读写操作 有了MMU,才能使用虚拟内存
第三章
1.立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存
储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。 例如指令:
MOV R0, #0xFF000 ;将立即数0xFF000装入R0寄存器 ADD R1, R1,#0x7f ; R1←R1+0x7f
在以上两条指令中,第二个源操作数即为立即数,要求以―#‖为前缀,对于以十六进制表示的立即数,还要求在―#‖后加上―0x‖。
2.寄存器寻址就是利用寄存器中的内容作为操作数,寄存器本身就是操作数地址。这种
寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。 例如指令:
MOV R2, R3 ;R2←R3 R3中的内容赋给R2 ADD R2,R3,R4
;R2←R3+R4 R3和R4中的内容相加,结果赋给R2
3.寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存
储器中。例如指令 : LDR R1,[R2]
;R1←
[R2]
STR R1,[R2] ;[R2]←R1
第一条指令将以R2中的内容为地址,将该地址中的数据传送到R1中。 第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。
4.变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的
地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。 例如指令:
LDR R0,[R1,#8] ;R0←[R1+8]
LDR R0,[R1,#8]! ;R0←[R1+8],R1←R1+8 LDR R0,[R1],#2 ;R0←[R1],R1←R1+2 LDR R0,[R1,R2] ;R0←[R1+R2]
5.寄存器移位寻址是
ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应
移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
6.多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以一次
对多个寄存器寻址,多个寄存器由小到大排列,最多可传送16个寄存器。 例如:
LDMIA R1!,{R2-R4,R5} ;R2←[R1] ;R3←[R1+4] ;R4←[R1+8] ;R5←[R1+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R1按字长度增加,因此, 指令可将连续存储单元的值传送到R2~R5。
7.堆栈寻址:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,
使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack);而当堆栈指针指
向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。
同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈
(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。
ARM微处理器支持这四种类型的堆栈工作方式,即: 满递增方式FA(Full Ascending):堆栈指针指向最后入栈的数据位置,且由低地址
向高地址生成。
满递减方式FD(Full Decending):堆栈指针指向最后入栈的数据位置,且由高地址
向低地址生成。
空递增方式EA(Empty Ascending):堆栈指针指向下一个入栈数据的空位置,且由
低地址向高地址生成。
空递减方式ED(Empty Decending):堆栈指针指向下一个入栈数据的空位置,且由
高地址向低地址生成。
8.相对寻址:与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,
指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。
以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式: BL NEXT;跳转到子程序NEXT处执行 …… NEXT
……
MOV PC,LR;从子程序返回
1.单一数据加载/存储指令 (1)LDR指令
格式为: LDR{条件} 目的寄存器,<存储器地址>
LDR指令是字加载指令,用于从存储器中将一个32位的字数据传送到目的寄存器中。
指令示例:
LDR R3,[R4]
;将存储器地址为R4的字数据读入寄存器R3。 LDR R3,[R1,R2]
;将存储器地址为R1+R2的字数据读入寄存器R3。 LDR R3,[R1,#8]
;将存储器地址为R1+8的字数据读入寄存器R3。 LDR R3,[R1,R2]!
;将存储器地址为R1+R2的字数据读入寄存器R3,并将新地址R1+R2写入R1。 LDR R3,[R1,#8] !
;将存储器地址为R1+8的字数据读入寄存器R3,并将新地址R1+8写入R1。
应用示例: LDR R3, [R4] ;将R4指向地址的字数据存入R3
存储器
LDR R3,[R1],R2
;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2写入R1。 LDR R3,[R1,R2,LSL#3]!
;将存储器地址为R1+R2×8的字数据读入寄存器R3,并将新地址R1+R2×8写入R1。 LDR R3,[R1],R2,LSL#3
;将存储器地址为R1的字数据读入寄存器R3,并将新地址R1+R2×8写入R1。 注:R15不可以作为偏移寄存器使用。 (2)LDRB指令 格式为:
LDR{条件}B 目的寄存器,<存储器地址>
LDRB指令是字节加载指令,用于从存储器中将一个8位的字节数据传送到目的寄存器中,同时将寄存器的高24位清零。 该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。
指令示例:
LDRB R3,[R1]
;将存储器地址为R1的字节数据读入寄存器R0,并 将R3的高24位清零。 LDRB R3,[R1,#8]
;将存储器地址为R1+8的字节数据读入寄存器R3, 并将R3的高24位清零。 (3)LDRH指令 格式为: LDR{条件}H 目的寄存器,<存储器地址> LDRH指令是无符号半字加载指令,用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。 指令示例:
LDRH R3,[R1]
;将存储器地址为R1的半字数据读入寄存器R3,并将R3的高16位清零。 LDRH R3,[R1,#8]
;将存储器地址为R1+8的半字数据读入寄存器R3,并 将R3的高16位清零。 LDRH R3,[R1,R2]
;将存储器地址为R1+R2的半字数据读入寄存器R3, 并将R3的高16位清零。 (4)STR
指令
格式为: STR{条件} 源寄存器,<存储器地址>
STR指令是字存储指令,用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。 指令示例: STR R3,[R1],#8 ;将R3中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。 STR R3,[R1,#8] ;将R3中的字数据写入以R1+8为地址的存储器中。 (5)STRB指令 格式为: STR{条件}B 源寄存器,<存储器地址> STRB指令是无符号字节存储指令,用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。 指令示例: STRB R3,[R1]
;将寄存器R3中的字节数据写入以R1为地址的存储器中。 STRB R3,[R1,#8]
;将寄存器R3中的字节数据写入以R1+8为地址的存储器中。 (6)STRH指令 格式为:
STR{条件}H 源寄存器,<存储器地址> STRH指令是无符号半字存储指令,用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。 指令示例:
STRH R3,[R1]
;将寄存器R3中的半字数据写入以R1为地址的存储器中。 STRH R3,[R1,#8]
;将寄存器R3中的半字数据写入以R1+8为地址的存储器中。 2.批量数据加载/存储指令
ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。
数据处理指令只能对寄存器的内容进行操作,不允许对存储器中的数据进行操作,
也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据。 数据处理指令可分为3大类:
数据传送指令
算术逻辑运算指令 比较指令
数据传送指令用于在寄存器和寄存器之间进行数据的双向传输。
算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在
目的寄存器中,同时更新CPSR中的相应条件标志位。
比较指令是完成对指定的两个寄存器(或1个寄存器,1个立即数)进行比较,不
保存运算结果,只影响CPSR中相应的条件标志位。
1.数据传送指令MOV和MVN
(1)MOV指令 格式为:
MOV{条件}{S} 目的寄存器,源操作数
MOV指令可完成在寄存器之间或寄存器与第2操作数之间进行数据传送。 其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。 指令示例:
MOV R4,R5
;将寄存器R5的内容传送到寄存器R4 MOV PC,R14
;将寄存器R14的内容传送到PC,常用于子程序返回 MOVNE R4,R5,LSL#2
;当Z=0时,将寄存器R5的内容逻辑左移2位后传送到R4
(2)MVN指令 格式为: MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成在寄存器之间或寄存器与第2操作数之间进行数据非传送。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。 其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。 指令示例:
MVN R0,#1
;将立即数1取反传送到寄存器R0中 MVN R1,R2
;将R2取反,结果存到R1
2.算术逻辑运算指令
(1)ADD指令 格式为:
ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD指令是加法指令,用于把两个操作数相加,并将结果存放到目的寄存器中。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数 。 指令示例:
ADDS R0,R3,R4 ; R0 = R3 + R4,设置标志位
ADDS R0,R3,#10 ; R0 = R3 + 10
ADD R0,R2,R3,LSL#2 ; R0 = R2 + R3×4 (2)ADC指令 格式为:
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令是带进位加法指令,用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 以下指令序列实现64位二进制数的加法: R2、R1= R2、R1+ R4、R3 ADDS R1,R1,R3 ;R1= R1+ R3 ADC R2,R2,R4 ;R2= R2+ R4+C (3)SUB指令 格式为:
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB指令是减法指令,用于把操作数1减去操作数2,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 当指令包含后缀‖S‖时,如果减法运算有借位,则C=0,否者C=1。 指令示例:
SUBS R0,R3,R4 ; R0 = R3 – R4,设置标志位
SUB R0,R1,#0x10 ; R0 = R1 - 0x 10
SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 << 1) (4) SBC指令 格式为:
SBC{条件}{S} 目的寄存器,操作数1,操作数2
SBC指令是带借位减法指令,用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标
志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。
指令示例:
SBC R2,R2,R4 ; R2 = R2 – R4-!C (5)RSB指令 格式为:
RSB{条件}{S} 目的寄存器,操作数1,操作数2
RSB指令是反减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
RSB R0,R1,R2 ; R0 = R2 – R1 RSB R0,R1,#0x10 ; R0 = 0x10 – R1 RSB R0,R2,R3,LSL#1 ; R0 =R3×2 - R2 (6)RSC指令 格式为: RSC{条件}{S} 目的寄存器,操作数1,操作数2 RSC指令是带借位反减法指令,用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。该指令可用于有符号数或无符号数的减法运算。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
RSCS R6,R4,R3, LSL #1
; R6 = R3×2 – R4+C -1同时刷新标志位 (7)AND指令 格式为: AND{条件}{S} 目的寄存器,操作数1,操作数2 AND指令是逻辑与指令,用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。该指令常用于屏蔽操作数1的某些位。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
AND R5,R6,R8 ; R5=R6∧R8
AND R2,R2,#3
; 该指令保持R2的0、1位,其余位清零。 (8)ORR指令 格式为:
ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令是逻辑或指令,用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。该指令常用于设置操作数1的某些位。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
ORR R5,R6,R8
; R5=R6∨R8
ORR R2,R2,#3
; 该指令设置R2的0、1位,其余位保持不变。 (9)EOR指令 格式为:
EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR指令是逻辑异或指令,用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。该指令常用于反转操作数1的某些位。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
EOR R5,R6,R8 ; R5=R6+R8
EOR R2,R2,#3
; 该指令反转R2的0、1位,其余位保持不变。 (10)BIC指令 格式为:
BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令是位清除指令,用于清除操作数1的某些位(操作数1与操作数2的反码按位做与运算),并把结果放置到目的寄存器中。
操作数1应是一个寄存器。
操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 指令示例:
BIC R0,R2,#3
;清除 R2 中的位 0、1,其余的位保持不变。 BICS R0,R2,#0x80000000
;清除 R2 中的位 31,其余的位保持不变,刷新标志位。 (11)MUL指令 格式为:
MUL{条件}{S} 目的寄存器,操作数1,操作数2 MUL指令是乘法指令,完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。其中,操作数1和操作数2均为32位的有符号数或无符号数。 指令示例: MUL R0,R4,R5 ;R0 = R4 × R5
MULS R0,R4,R5
;R0 = R4 × R5,同时设置条件标志位 (12)MLA指令 格式为:
MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA指令是乘加指令,完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位(不会影响V)。
其中,操作数1和操作数2均为32位的有符号数或无符号数。 指令示例: MLA R0,R1,R2,R3 ;R0 = R1 × R2 + R3 MLAS R0,R1,R2,R3
;R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位 (13)SMULL指令 格式为:
SMULL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
SMULL指令是带符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。
其中,操作数1和操作数2均为32位的有符号数。 指令示例:
SMULL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位 ;R2 = (R3 × R4)的高32位
(14)SMLAL指令 格式为:
SMLAL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
SMLAL指令是长乘加指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。
对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结
果的低32位。
对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结
果的高32位。
指令示例:
SMLAL R1,R2,R3,R4 ;R1 = (R3 × R4)的低32位 + R1 ;R2 = (R3× R4)的高32位 + R2 (15)UMULL指令 格式为:
UMULL{条件}{S} 目的寄存器Low,目的寄存器High,操作数1,操作数2
UMULL指令是无符号乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。
其中,操作数1和操作数2均为32位的无符号数。 指令示例:
UMULL R1,R2,R3,R4
;R1 = (R3 × R4)的低32位 ;R2 = (R3 × R4)的高32位 (16)UMLAL指令 格式为:
UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
UMLAL指令是无符号长乘法指令,完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。
对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结
果的低32位。
对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结
果的高32位。
指令示例:
UMLAL R1,R2,R3,R4
;R1 = (R3× R4) 的低32位 + R1 ;R2 = (R3× R4) 的高32位 + R2
(1)CMP指令
格式为:
CMP{条件} 操作数1,操作数2
CMP指令是比较指令,该指令是做一次减法运算,但不存储结果,只是刷新条件标志位,根据条件标志位判断操作数的大小。 对条件位的影响是:结果为正数则N=0,结果为负数则N=1;结果为0则Z=1,结果不为0则Z=0;如果产生借位则C=0,没有借位则C=1;结果是符号溢出则V=1,否则V=0。
指令示例:
CMP R1,#0x30 ;比较R1和0x30
ADDCS R5,R5,#0x20 ;如果C=1,则R5=R5+0x20
ADDCC R5,R5,#0x10 ;如果C=0,则R5=R5+0x10 (2)CMN指令 格式为:
CMN{条件} 操作数1,操作数2
CMN指令是比较非指令,也是做一次减法运算,用第1操作数减去第2操作数的非值,结果不保存,只是刷新条件标志位,对条件标志位的影响和比较指令CMP相同。 指令示例:
CMN R1,#0x00 ;比较R1和0xFFFFFFFF ADDCS R5,R5,#0x20 ;如果C=1,则R5=R5+0x20 ADDCC R5,R5,#0x10 ;如果C=0,则R5=R5+0x10 (3)TST指令 格式为:
TST{条件} 操作数1,操作数2 TST指令是位测试指令,用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。 指令示例:
TST R2,#0x01
;将寄存器R1的值与立即数 0x01按位与,并根据结果设置CPSR的标志位,用来判断R2中最低位是否为0。
第四章
uCLinux是专门针对没有MMU的处理器而设计的,即uCLinux无法使用处理器的虚拟内存管理技术。
uCLinux采用实存储器管理策略,通过地址总线对物理内存进行直接访问。
RT-Linux开发者并没有针对实时操作系统的特性而重写Linux的内核,而是通过在Linux内核与硬件中断之间增加一个精巧的可抢先的实时内核,把标准的Linux内核作为实时内核的一个进程与用户进程一起调度。 内存管理和MMU 存储管理包含:
地址映射
内存空间的分配
地址访问的限制(即保护机制) I/O地址的映射
代码段、数据段、堆栈段空间的分配。
MMU,即内存管理单元,其主要作用是两个方面:一是地址映射;二是对地址访问的保护和限制。
进程和进程管理
进程是一个运行程序并为其提供执行环境的实体,它包括一个地址空间和至少一个控制点,进程在这个地址空间上执行单一指令序列。
进程调度主要是协调进程对计算机系统内资源(如CPU 、内存、I/O设备)的争夺使用
抢占式调度 非抢占式调度
RT-Linux有两种中断:硬中断和软中断
Linux进程的调度
分时调度策略(SCHED_OTHER)
先到先服务的实时调度策略(SCHED_FIFO) 时间片轮转的实时调度策略(SCHED_RR)
文件系统定义:包含在磁盘驱动器或者磁盘分区的目录结构,整个磁盘空间可以给一个或者多个文件系统使用。
第五章
Boot Loader基本概念
初始化处理器以及外设的硬件资源,配置SDRAM控制器,为主程序提供运行环境
串口,提供交互终端 网络,传输镜像文件 其他I/O设备
执行系统自检,报告检测结果 引导操作系统
根据系统命令烧写镜像文件 Boot Loader的操作模式 启动加载模式:
也称为―自主‖模式,从目标机上的某个固态存储设备上将操作系统
加载到RAM中运行,整个过程并没有用户的介入 下载模式:
目标机上的Boot Loader将通过串口连接或网络连接等通信手段从
主机下载文件,比如:下载内核映像和根文件系统映像等
Boot Loader与主机之间的通信设备及协议
目标机上的Boot Loader通过串口与主机之间进行文件传输
xmodem ymodem zmodem
以太网连协议
TFTP
Boot Loader的典型结构
Boot Loader 的阶段1通常包括以下步骤: 1. 硬件设备初始化。
2. 为加载Boot Loader的阶段2准备RAM空间。 3. 拷贝Boot Loader的阶段2到RAM空间中。 4. 设置好堆栈。
5. 跳转到阶段2的C入口点。
Boot Loader的阶段2通常包括以下步骤: 1. 初始化本阶段要使用到的硬件设备。 2. 检测系统内存映射(memory map)。
3. 将kernel映像和根文件系统映像从Flash读到RAM空间中。 4. 为内核设置启动参数。 5. 调用内核。
第六章
Linux版本号格式
主版本号.次版本号.修正号
次版本号为偶数时表示是稳定版本,如:2.2.5为奇数时表示测试版本
中断是一个流程,一般来说,它要经过三个环节:
中断响应 中断处理 中断返回
嵌入式操作系统的文件系统的设计目标
(1)使用简单方便 (2)安全可靠 (3)实时响应
(4)接口标注的开放性和可移植性 (5)可伸缩性和可配置性 (6)开放的体系结构 (7)资源有效性 (8)功能完整性 (9)热插拔
(10)支持多种文件类型
大部分操作系统都是由文件管理器来使用设备API,而对上层用户空间的应用程序提供文件API
在特殊的环境下才允许用户通过设备API访问硬件设备 嵌入式Linux中三种常用的块驱动程序
(1)Blkmem层动驱 (2)RamDisk驱动层 (3)MTD驱动层
根文件系统
第八章
Linux驱动程序简介