管道、消息队列、信号量、信号、共享内存、套接字
临界区、互斥量、信号量、事件
嵌入式系统的程序存放在ROM/Flash中,这样,系统断电后,程序能够得到保存。但是,ROM/Flash与SDRAM相比,速度通常要慢很多,而且嵌入式系统中通常把异常中断向量表存放在RAM中。
页表是实现上述这些功能的重要手段,它是一个位于内存中的表。表的每一行对应于虚拟存储空间的一个页,该行包含了该虚拟内存页(称为虚页)对应的物理内存页(称为实页)的地址、该页的访问权限和该页的缓冲特性等。
从虚拟地址到物理地址的变换过程其实就是查询页表的过程,由于页表存放在内存中,这个查询过程通常代价很大。而程序在执行过程中具有局部性,因此,对页表中各存储器的访问并不是完全随机的。也就是说,在一段时间内,对页表的访问只是局限在少数几个单元中。根据这一特点,采用一个容量更小(通常为8~16个字)、访问速度和CPU中通用寄存器相当的存储器来存放当前访问需要的地址变换条目。这个小容量的页表称为快表。
当CPU需要访问内存时,先在TLB中查找需要的地址变换条目。如果该条目不存在,CPU从位于内存中的页表中查询,并把相应的结果添加到TLB中。这样,当CPU下一次又需要该地址变换条目时,就可以从TLB中直接得到了,从而使地址变换的速度大大加快。
高速缓冲存储器是全部用硬件来实现的,因此,它不仅对应用程序员是透明的,而且对系统程序员也是透明的。Cache与主存储器之间以块(Cache Line)为单位进行数据交换。当CPU读取数据或者指令时,它同时将读取到的数据或者指令保存到一个Cache块中。这样,当CPU第二次需要读取相同的数据时,它可以从相应的Cache块中得到相应的数据。因为Cache的速度远远大于主存储器的速度,系统的整体性能就得到很大的提高。实际上,在程序中,通常相邻的一段时间内CPU访问相同数据的概率是很大的,这种规律称为时间局部性。
不同系统中,Cache的块大小也是不同的。通常Cache的块大小为几个字。这样,当CPU从主存储器中读取一个字的数据时,它将会把主存储器中与Cache块同样带线啊哦的数据读取到Cache的一个块中。比如,如果Cache的块大小为4个字,当CPU从主存储器中读取地址为n的字数据时,它同时将地址为n、n+1、n+2、n+3的4个字的数据读取到Cache中的一个块中。这样,当CPU需要读取地址为n+1、n+2或者n+3的数据时,它就可以从Cache中得到该数据,系统的性能将得到很大的提高。实际上,在程序中,CPU访问相邻的存储空间的数据的概率是很大的,这种规律称为空间局部性。
写缓冲区是由一些高速的存储器构成的。它主要用来优化向主存储器中的写入操作。当CPU进行向主存储器中的写入操作时,它先将数据写入到写缓冲区中,由于写缓冲区的访问速度很高,这种写入操作的速度将很高。然后CPU就可以进行下面的操作。写缓冲区在适当的时候以较低的速度将数据写入到主存储器中相应的位置。
快速上下文切换技术(FCSE)的引入避免了这种开销。它位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间,则对CPU而言,两个进程使用了同样的虚拟地址空间;快速上下文切换机构对各进程的虚拟地址进行变换,这样,系统中除了CPU之外的部分看到的是经过快速上下文切换机制变换的虚拟地址。快速上下文切换机制将各进程的虑拟空间变换成不同的虚拟空间。
从异常中断处理程序中返回包括下面两个基本操作:
SWI和未定义指令异常中断是由当前执行的指令自身产生的,当SWI和未定义指令异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当SWI和未定义指令异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_ mode中。这时(PC-4)即指向当前指令的下一条指令。
mov PC, LR
该指令将寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。
该指令将寄存器LR中的值复制到程序计数器PC中,实现程序返回,同时将
通常,处理器执行完当前指令后,查询IRQ中断引脚及FIQ中断引脚,并且查看系统是否允许IRQ中断及FIQ中断。如果有中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ异常中断或FIQ异常中断。当IRQ和FIQ异常中断产生时,程序计数器PC的值已经更新,它指向当前指令后面第3条指令(对于ARM指令来说,它指向当前指令地址加12个字节的位置;对于Thumb指令来说,它指向当前指令地址加6个字节的位置)。当IRQ和FIQ异常中断发生时,处理器将值(PC-4)保存到异常模式下的寄存器lr_ mode中。这时(PC-4)即指向当前指令后的第2条指令。因此返回操作可以通过下面的指令来实现:
SUBS PC, LR, #4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。
(对于Linux系统来说,中断是不能嵌套的。也就是说,当ARM系统进入中断时,同时ARM处理器的CPSR寄存器的中断位会被硬件设置为屏蔽IRQ)
当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是像前面两种情况下返回到发生中断的指令的下一条指令。
指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC的值还未更新,它指向当前指令后面的第2条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当指令预取中止异常中断发生时,处理器将值(PC 4)保存到异常模式下的寄存器Ir_ mode中。这时(PC-4)即指向当前指令的下一-条指令。因此返回操作可以通过下面的指令来实现:
SUBS PC, LR, #4
该指令将寄存器LR中的值减4后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。
数据访问中止异常中断是由数据访问指令产生的,当数据访问中止异常中断产生时,程序计数器PC的值已经更新,它指向当前指令后面的第二条指令(对于ARM指令来说,它指向当前指令地址加8个字节的位置;对于Thumb指令来说,它指向当前指令地址加4个字节的位置)。当数据访问中止异常中断发生时,处理器将值(PC- 4)保存到异常模式下的寄存器Ir_ mode中。这时(PC-4)即指向当前指令后的第二条指令。因此返回操作可以通过“下面的指令来实现:
SUBS PC, LR, #8
该指令将寄存器LR中的值减8后,复制到程序计数器PC中,实现程序返回,同时将SPSR_mode寄存器的内容复制到当前程序状态寄存器CPSR中。
在SWI指令中包括-一个24位的立即数,该立即数指示了用户请求的特定的SWI功能。在SWI异常中断处理程序中要读取该24位的立即数,涉及SWI异常模式下对寄存器LR的读取,并且要从存储器读取该SWI指令。这样需要使用汇编程序来实现。通常SWI .异常中断处理程序分为两级:第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;第2级SWI异常中断处理程序具体实现SWI的各个功能,它可以是汇编程序,也可以是C程序。
Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断的低级处理中,还是需要使用ARM指令。这种限制决定了Thumb指令需要与ARM指令配合使用。对于支持Thumb指令的ARM体系版本,使用字符T来表示。
ARM处理器共有7种运行模式。
用户模式、快中断模式、中断模式、管理模式、数据访问中止模式、未定义指令中止模式、系统模式
管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。说明:系统复位或开机、软中断时进入到SVC模式。
除了用户模式之外的其他6种处理器模式称为特权模式。在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中,除系统模式外,其他5种特权模式又称为异常模式。
系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所用的系统资源,也可以直接进行处理器模式切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
用户模式与系统模式使用的是同一组寄存器。
B 指令用于执行跳转操作;BL 指令在执行跳转操作的同时,保存子程序的返回地址;BX 指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;BLX 指令执行3个操作,跳转到目标地址处执行,保存子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb状态。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
从异常中断处理程序中返回包括下面两个基本操作:
复位异常中断处理程序不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。