1. 进程间通信方式有哪些?
管道、消息队列、信号量、信号、共享内存、套接字
2. 线程间同步方法有哪些?
临界区、互斥量、信号量、事件
3. fork和vfork的区别
- fork( )的子进程拷贝父进程的数据段和代码段; vfork( )的子进程与父进程共享数据段
- fork( )的父子进程的执行次序不确定; vfork( )保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
- vfork( )保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
- 当需要改变共享数据段中变的值,则拷贝父进程。
4. 死锁的四个必要条件是什么?
- 互斥:某种资源一次只允许一个进程访问,即该资源一但分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
- 占用且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
- 可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
- 循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
5. 嵌入式系统程序存放位置。
嵌入式系统的程序存放在ROM/Flash中,这样,系统断电后,程序能够得到保存。但是,ROM/Flash与SDRAM相比,速度通常要慢很多,而且嵌入式系统中通常把异常中断向量表存放在RAM中。
6. ARM系统中,存储器管理单元MMU主要工作
- 虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU就要实现从虚拟地址到物理地址的转换。
- 存储器访问权限的控制。
- 设置虚拟存储空间的缓冲的特性。
页表是实现上述这些功能的重要手段,它是一个位于内存中的表。表的每一行对应于虚拟存储空间的一个页,该行包含了该虚拟内存页(称为虚页)对应的物理内存页(称为实页)的地址、该页的访问权限和该页的缓冲特性等。
从虚拟地址到物理地址的变换过程其实就是查询页表的过程,由于页表存放在内存中,这个查询过程通常代价很大。而程序在执行过程中具有局部性,因此,对页表中各存储器的访问并不是完全随机的。也就是说,在一段时间内,对页表的访问只是局限在少数几个单元中。根据这一特点,采用一个容量更小(通常为8~16个字)、访问速度和CPU中通用寄存器相当的存储器来存放当前访问需要的地址变换条目。这个小容量的页表称为快表。
当CPU需要访问内存时,先在TLB中查找需要的地址变换条目。如果该条目不存在,CPU从位于内存中的页表中查询,并把相应的结果添加到TLB中。这样,当CPU下一次又需要该地址变换条目时,就可以从TLB中直接得到了,从而使地址变换的速度大大加快。
7. 高速缓冲存储器的基本概念
高速缓冲存储器是全部用硬件来实现的,因此,它不仅对应用程序员是透明的,而且对系统程序员也是透明的。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访问相邻的存储空间的数据的概率是很大的,这种规律称为空间局部性。
8. 写缓冲区的基本概念
写缓冲区是由一些高速的存储器构成的。它主要用来优化向主存储器中的写入操作。当CPU进行向主存储器中的写入操作时,它先将数据写入到写缓冲区中,由于写缓冲区的访问速度很高,这种写入操作的速度将很高。然后CPU就可以进行下面的操作。写缓冲区在适当的时候以较低的速度将数据写入到主存储器中相应的位置。
9. 快速上下文切换技术原理
快速上下文切换技术(FCSE)的引入避免了这种开销。它位于CPU和MMU之间,如果两个进程使用了同样的虚拟地址空间,则对CPU而言,两个进程使用了同样的虚拟地址空间;快速上下文切换机构对各进程的虚拟地址进行变换,这样,系统中除了CPU之外的部分看到的是经过快速上下文切换机制变换的虚拟地址。快速上下文切换机制将各进程的虑拟空间变换成不同的虚拟空间。
10. ARM体系中,通常有以下3种方式来控制程序的执行流程
- 在正常程序执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器(PC)的值加两个字节。整个过程是顺序执行的。
- 通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。其中,B指令用于执行跳转操作; BL指令在执行跳转操作的同时,保存子程序的返回地址;BX指令在执行跳转操作的同时,根据目标地址的最低位,可以将程序状态切换到Thumb状态; BLX指令执行3个操作:跳转到目标地址处执行,保存子程序的返回地址,根据目标地址的最低位,可以将程序状态切换到Thumb状态。
- 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
11. ARM处理器对异常中断的响应过程
- 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
- 设置 当前程序状态寄存器CPSR中相应的位。包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ中断,当进入FIQ模式时,禁止FIQ中断。
- 将寄存器lr_mode设置成返回地址。
- 将程序计数器值(PC)设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
12. 异常中断处理程序的返回
从异常中断处理程序中返回包括下面两个基本操作:
- 恢复被中断的程序的处理器状态,即把SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
- 返回到发生异常中断的指令的下一-条指令处执行,即把lr_ mode寄存器的内容复制到程序计数器PC中。
SWI和未定义指令异常中断处理程序的返回
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异常中断。当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中。
13. SWI异常中断处理程序的实现
在SWI指令中包括-一个24位的立即数,该立即数指示了用户请求的特定的SWI功能。在SWI异常中断处理程序中要读取该24位的立即数,涉及SWI异常模式下对寄存器LR的读取,并且要从存储器读取该SWI指令。这样需要使用汇编程序来实现。通常SWI .异常中断处理程序分为两级:第1级SWI异常中断处理程序为汇编程序,用于确定SWI指令中的24位的立即数;第2级SWI异常中断处理程序具体实现SWI的各个功能,它可以是汇编程序,也可以是C程序。
14. Thumb指令集
Thumb指令集没有包含进行异常处理时需要的一些指令,因此在异常中断的低级处理中,还是需要使用ARM指令。这种限制决定了Thumb指令需要与ARM指令配合使用。对于支持Thumb指令的ARM体系版本,使用字符T来表示。
15. ARM处理器的运行模式
ARM处理器共有7种运行模式。
用户模式、快中断模式、中断模式、管理模式、数据访问中止模式、未定义指令中止模式、系统模式
管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。说明:系统复位或开机、软中断时进入到SVC模式。
除了用户模式之外的其他6种处理器模式称为特权模式。在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。其中,除系统模式外,其他5种特权模式又称为异常模式。
系统模式并不是通过异常过程进入的,它和用户模式具有完全一样的寄存器。但是系统模式属于特权模式,可以访问所用的系统资源,也可以直接进行处理器模式切换。它主要供操作系统任务使用。通常操作系统的任务需要访问所有的系统资源,同时该任务仍然使用用户模式的寄存器组,而不是使用异常模式下相应的寄存器组,这样可以保证当异常中断发生时任务状态不被破坏。
用户模式与系统模式使用的是同一组寄存器。
16. ARM体系的异常中断
B 指令用于执行跳转操作;BL 指令在执行跳转操作的同时,保存子程序的返回地址;BX 指令在执行跳转操作的同时,根据目标地址的最低位可以将程序状态切换到Thumb状态;BLX 指令执行3个操作,跳转到目标地址处执行,保存子程序的返回地址,根据目标地址的最低位可以将程序状态切换到Thumb状态。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
17. 内嵌的汇编指令中使用物理寄存器有如下限制
- 不能直接向PC寄存器中赋值,程序的跳转只能通过B指令和BL指令实现。
- 在使用物理寄存器的内嵌汇编指令中,不要使用过于复杂的C/C++表达式, 因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。
- 编译器可能会使用R12寄存器或者R13寄存器存放编译的中间结果,在计算表达式的值时,可能会将寄存器R0到R3、R12以及R14用于子程序调用。因此在内
嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。 - 在内嵌的汇编指令中使用物理寄存器时,如果有C/C++变量使用了该物理寄存器,编译器将在合适的时候保存并恢复该变量的值。需要注意的是,当寄存器
sp、sl、fp以及sb用作特定的用途时,编译器不能恢复这些寄存器的值。 - 通常推荐在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。
18. ARM处理器对异常中断的响应过程
- 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场,在从异常中断处理程序退出时,要恢复被中断的程序的执行现场。
- 设置 当前程序状态寄存器CPSR中相应的位。包括设置CPSR中的位,使处理器进入相应的执行模式;设置CPSR中的位,禁止IRQ中断,当进入FIQ模式时,禁止FIQ中断。
- 将寄存器lr_mode设置成返回地址。
- 将程序计数器值(PC)设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。
19. 异常中断处理程序的返回
从异常中断处理程序中返回包括下面两个基本操作:
- 恢复被中断的程序的处理器状态,即把SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。
- 返回到发生异常中断的指令的下一-条指令处执行,即把lr_ mode寄存器的内容复制到程序计数器PC中。
复位异常中断处理程序不需要返回。整个应用系统是从复位异常中断处理程序开始执行的,因而它不需要返回。