2018-03-21 17:19:37 qq_33414271 阅读数 1359

操作系统运行环境与运行机制

操作系统的主要工作包括程序的执行、完成与体系结构相关的工作、完成应用程序所需的共性任务。

操作系统的运行环境 1.CPU状态2.中断/异常机制
操作系统运行机制: 系统调用

1.操作系统运行环境

1.1 处理器状态(模式)

常见的控制、状态寄存器:

1)程序计数器(PC:Program Counter),记录将要取出的指令的地址

2)指令寄存器(IR:Instruction Register),记录最近取出的指令

3)程序状态字(PSW:Program Status Word),记录处理器的运行状态,如,条件码、模式、控制位等信息。

处理器状态分类:

现代处理器通常将CPU状态设计划分为两种、三种或四种。在程序状态字寄存器PSW中专门设置一位(或两位),根据运行程序对资源和指令的使用权限而设置不同的CPU状态。

操作系统需要两种CPU状态:内核态(Kernel Mode)用户态(User Mode),内核态用于运行操作系统程序,用户态用于运行用户程序。

CPU的两个状态可以执行不同的指令集合,所以可以指令集合划分为两类:特权(privilege)指令和非特权指令,特权指令是指只能有操作系统程序使用,用户程序不能使用的指令,非特权指令是指操作系统程序和用户程序都可以使用的指令。

1.2 处理器状态切换

  • 用户态–>内核态 唯一途径:中断/异常/陷入机制

  • 内核态–>用户态
    1)设置程序状态字PSW
    2)一条特殊的指令:陷入指令(又称访管指令,它不是特权指令),提供给用户程序的接口,用于调用操作系统的功能(服务)。例如:int,trap,syscall,systenter/sysexit

下图为用户态调用内核态中open函数
这里写图片描述

1.3 中断/异常机制——操作系统是中断驱动的

中断/异常机制是现代计算机系统的核心机制之一,主要是硬件和软件互相配合完成的。在这个机制工作过程中,硬件用来捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交个特定的处理程序,这个过程叫做中断/异常响应。软件用于识别中断/异常类型并完成相应的处理,这个过程叫做中断/异常处理程序。

中断/异常的概念:CPU对系统发生的某个事件做出的一种反应

事件的发生改变了处理器控制流

中断(外中断如I/O中断,时钟中断,硬件故障),如为了支持CPU和设备之间的并行操作;

异常(内中断如系统调用,页故障,保护性异常,断点指令,其他程序异常)表示CPU执行指令本身出现的问题。

特点:随机发生的,自动处理的,可恢复的

中断/异常机制工作原理

硬件:(发现中断、接受中断)捕获中断源发出的中断/异常请求,以一定的方式响应,将处理器控制权交给特定的处理程序

软件:(中断异常处理程序)识别中断/异常类型并完成相应的处理

中断响应过程:

设备发中断信号,硬件保存现场,根据中断码查表,把中断处理程序入口地址等推送到相应的寄存器,执行中断程序

中断处理程序:

设计操作系统时,为每一类中断/异常事件编好相应的处理程序,并设置好中断向量表

系统运行时若响应中断,中断硬件部件将CPU控制权转给中断处理程序:

保存相关寄存器信息,分析中断/异常的具体原因,执行对应的处理功能,恢复现场,返回被事件大段的程序

2.操作系统运行机制

操作系统运行机制: 系统调用(操作系统功能调用)

定义:用户在编程时可以调用的操作系统功能

作用:是操作系统提供给编程人员的唯一接口;使CPU状态从用户态陷入内核态

系统调用机制的设计:

中断/异常机制:支持系统调用服务的实现

选择一条特殊指令:陷入指令(访管指令):引发异常,完成用户态到内核态的切换

系统调用号和参数:每个系统调用都事先给定一个编号(功能号)

系统调用表:存放系统调用服务例程的入口地址

用户程序的参数传递给内核:

方法1:由陷入指令自带参数:陷入指令的长度有限,且还要携带系统调用功能号,只能自带有限参数

方法2:通过通用寄存器传递参数:这些寄存器是操作系统和用户程序都能访问的,但寄存器的个数会限制传递参数的数量

方法3:在内存中开辟专用堆栈区来传递参数

系统调用的执行过程:

当CPU执行到特殊的陷入指令时:

中断/异常机制:硬件保护现场;通过中断向量表把控制权转给系统调用总入口程序

系统调用总入口程序:保存现场;将参数保存在堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数

执行系统调用例程

恢复现场,返回用户程序

参考:
http://blog.csdn.net/wyi06/article/details/54808145
https://www.cnblogs.com/zengyiwen/p/4967297.html
http://blog.csdn.net/xw_classmate/article/details/50446331

2017-12-05 23:33:29 u012418428 阅读数 443

CPU:运算器,控制器,寄存器,高速缓存

两类寄存器:

控制和状态寄存器(重要):

程序寄存器PC----记录将要取出指令的地址

指令寄存器IR-----记录最近取出的指令

程序状态字PSW----记录处理器的运行状态


需求

保护:并发,共享

两种cpu状态:

内核态:运行操作系统程序

用户态:运行用户程序


特权指令:只能由操作系统使用,用户不能用

非特权指令:用户可用

特权:

启动I/O,内存清零,修改程序状态字,设置时钟,允许/禁止中断停机

非特权:

控制转移,算数运算,访管指令,取数指令


X86支持的4个处理器特权级别

特权环---R0,R1,R2,R3

R0--内核态

R3--用户态

R1-R1---两者之间


CPU状态之间转换:

用户态-->内核态

唯一途径:中断/异常/陷入机制(访管指令:提供给用户程序接口,用于调用操作系统的功能--- 一条特殊指令)

内核态--->用户态

设置状态字PSW


中断/异常机制:

操作系统是由中断驱动或事件驱动的

中断的引入:为了支持CPU和设备之间的并行操作

异常的引入:表示CPU执行指令时自身出现的问题




中断与异常小结



硬件做什么事:中断/异常响应

捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序

软件做什么事: 中断/异常处理程序

识别中断/异常类型并完成相应的处理


中断响应过程示意



中断向量表:

中断向量---1个内存单元,存放中断处理程序入口地址和程序运行时所需的处理机状态字





中断处理程序:

系统运行时若响应中断,中断硬件部件将CPU控制权转给中端处理程序:

1,保存相关寄存器信息

2,分析中断/异常的具体原因

3,执行对应的处理功能

4,恢复现场,返回被事件打断的程序


X86对中断的支持:

中断控制权(PIC或APIC)

负责将硬件的中断信号转换为中断向量,并引发cpu中断


实模式:中断向量表

存放中断服务程序的入口地址



保护模式:中断描述符表

采用门(gate)描述符数据结构表示中断向量







系统调用机制的设计

1,中断/异常机制---支持系统调用服务的实现

2,选择一条特殊指令:陷入指令(访管指令)---引发异常,从用户态到内核态

3,系统调用号和参数---每个系统调用都是先给定一个编号

4,系统调用表--存放系统调用服务例程的入口地址



注释:第二种


系统调用的执行过程:

当CPU执行到特殊的陷入指令时:


1,中断/异常机制:硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序

2,系统调用总入口程序:保存现场;将参数保存在内核堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数

3,执行系统调用例程

4,恢复现场,返回用户程序


中断发生后os底层工作步骤:

1,硬件压栈:程序计数器等

2,硬件从中断向量表装入新的程序计数器等 //硬件

3,汇编语言过程保存寄存器值

4,汇编语言过程设置新的堆栈

5,C语言中断服务程序运行 //软件

6,进程调度程序决定下一个将运行的进程

7,C语言过程返回至汇编代码

8,汇编语言过程开始运行新的当前进程


2016-09-09 17:36:53 zscfa 阅读数 742

3.1任务的基本概念

一、任务及内核结构

在设计一个较为复杂的应用程序时,通常把任务分成若干个小问题,这样使系统并发运行多个任务,提高处理器的利用率,加快程序的执行速度,所以现代操作系统都是多任务操作系统。UCOSII就是一个多任务的操作系统。

UCOSII的任务由任务程序代码(函数)、任务堆栈、任务控制块这三个部分组成。


PC的值总是待要执行指令的地址,根据任务是否具有自己的私有运行空间,分为进程和线程。UCOSII中没有给任何定义私有空间,所以UCOSII中的所有任务就叫做线程。

 

一个任务可以在睡眠状态,就绪状态,运行状态,等待状态,中断服务状态5个状态中发生转换。

二、用户任务代码的一般结构

根据嵌入式系统任务的工作特点,任务的执行代码通常是一个无限循环结构,在这个循环中可以响应中断,这种结构也叫做超循环结构。

从程序设计的角度来说,一个UCOSII的任务代码就是一个C语言函数,为了传递各种不同的类型的数据甚至是函数,所以UCOSII的任务的参数定义成了一个VOID类型的指针。

代码中的OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()UCOSII定义的两个宏,OS_ENTER_CRITICAL()封装了关中断的代码,而OS_EXIT_CRITICAL()封装了开中断的代码,即处于这两个宏之间的代码是不会被中断的,把这种受保护的代码段叫做临界段,所以OS_ENTER_CRITICAL()叫做临界段宏,而OS_EXIT_CRITICAL()叫做推出临界段宏。

从程序代码的形式上来看,用户任务就是一个C语言函数,但这个函数不是主函数调用 的函数,在系统中它与main函数处于平等地位,但是何时被调用以及何时被终止由操作系统决定的。

应用程序结构:


三、系统任务

 操作系统除了管理用户任务之外还要管理系统任务,即系统的内部事务要处理。

 UCOSII预定义了两个系统任务:空闲任务和统计任务,空闲任务的不是必须的,但是统计任务是应用程序根据实际需要来使用。

 前面所说任务分为5个状态,即系统极有可能在某个时间内处于空闲状态。空闲任务是在系统空闲时,有事可做。

 统计任务就是统计cpu在单位时间内被使用的时间,以百分比的形式保存在变量OSCPUsage中。用户根据实际需要来选择是否使用统计任务,若用则把定义在头文件中的OS_CFG.H中的系统配置常数OS_TASK_STAT_EN设置为1,并在程序中调用函数OSStatInit()对统计任务进行初始化。

四、任务优先级权和优先级

UCOSII采用了优先级抢占式规则,即系统中的每个任务都按照其任务的重要性分配有一个惟一的优先级别。任务级别高的先运行,在UCOSII中最多创建64个任务,每个级别都用一个整数数字来表示,即0123……,63。数字越小,优先级别越高

在系统配置文件OS_CFG.H中定义了一个用来表示最先优先级的常数OS_LOWEST_PRIO,用户通过对其赋值来设置所需任务的实际数目。一般最低优先级OS_LOWEST_PRIO设置为空闲任务,若有统计任务,一般设置为OS_LOWEST_PRIO-1;所以还有OS_LOWEST_PRIO-2个优先级可用。

 

3.2任务堆栈的创建

为了定义堆栈方便,在文件OS_CPU.H中专门定义了一个数据类型OS_STK。在定义任务堆栈的栈区时,只要定义一个OS_STK类型相同的数组就可以了。

当调用函数OSTaskCreat()来创建一个任务时,把数组和指针传递给函数OSTaskCreat()中的堆栈栈顶的参数ptos,就可以把该数组与任务关联起来而成为任务的任务堆栈。

堆栈增长的方向是随系统所使用的处理器不同而不同的,有的处理器要求堆栈增长方向是向上的,而有些则是向下的。使用OSTaskCreat()来创建任务时,一定要注意所使用的处理器所支持堆栈的增长方向。

在应用程序创建一个新任务时,必须把系统启动这个任务时所需要的CPU各寄存器的初始数据(任务指针,任务堆栈指针,程序状态字等)事先放在任务堆栈。这样当获得CPU的使用权时,就把堆栈的内容复制到CPU的各个寄存器中。函数的初始化就是完成这项工作。

 

3.3任务控制块及其链表

     任务的控制块是用来记录任务的堆栈指针、任务的当前状态、任务的优先级等与任务相关的属性。系统通过任务控制块来感知和管理任务,没有任务控制块的任务不能被系统承认和管理。UCOSII把系统所有的任务控制块链接为两条链表,并通过他们管理各个任务。
任务控制块上的所需的两条链表:一条控任务块链表(任务控制块未分配任务)和一条任务链表(任务控制块已分配任务)。

 当应用程序调用函数OSTaskCreat()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。

该函数的主要任务如下:

l 为被创建任务从空任务控制块

 


3.4任务就绪表及任务就绪

多任务操作系统的核心任务就是给处于就绪状态的任务分配CPU。这项工作涉及两项技术:一是判断哪些任务处于就绪状态;二是进行任务调度,即通过一个算法在就绪任务中确定马上要执行的任务。

系统用一张就绪任务登记表,登记了系统中所有处于就绪状态的任务。用一个二进制位表示一个任务,1为对应任务处于就绪状态,0表示对应任务处于非就绪状态。所以一个元素可以表示8个任务状态,常把这8个任务看成一个任务组,如果任务组中有任务就绪,就把任务组置1,否则置为0

对就绪表的三个操作:登记、注销、最高优先级就绪任务的查找(prio

登记:当任务处于就绪状态时,系统将该任务登记在就绪表中,即就绪表中对应位置置1

注销:当某个任务脱离就绪状态时,系统在就绪表中将该任务对应位置置0

最高优先级的就绪任务的查找:

y =  OSUnMapTal[OSRdyGrp];   //获得优先级别的D5,D4,D3

x =  OSUnMapTal[OSRdyTbl[y]];  //获得D2,D1,D0

prio = (y << 3) + x;                //获得就绪任务的优先级别

或者

y =  OSUnMapTal[OSRdyGrp];  

prio = (y << 3) + OSUnMapTal[OSRdyTbl[y]];


任务调度:

CPU中止当前正在执行的任务转而去执行另一个任务叫做任务的调度

每时每刻让优先级最高就绪任务处于运行状态。

具体做法:它在系统或用户任务调用函数及执行中断任务服务程序结束时来调用调度器,以确定应该运行的任务并运行它。

ucosII有两种调度器。一种是任务级的,另一种是中断级的调度器。两者分别与OSSched()OSIntExt()函数来实现。

任务调度器的步骤:第一步是获得运行任务的指针;第二步是进行断点数据的切换。



任务切换宏OS_TASK_SW()

任务切换就是中止正在运行的任务,转而去运行另一个任务的操作。

任务的切换就是断点数据的切换,即cpu堆栈指针的切换。被中止运行任务的任务堆栈指针要保护到该任务的任务控制块中,待运行任务的任务堆栈指针要由该任务控制块转存到CPUSP中。

为了完成操作,OSCtxSw()完成下列7项工作:

(1)把被中止任务的断电指针保存到任务堆栈中

(2)cpu通过寄存器的内容保存到任务堆栈中

(3)把被中止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPtr

(4)获得待运行任务的任务控制块

(5)使cpu通过任务控制块获得待运行的任务堆栈指针

(6)把待运行任务对战中通用寄存器的内容恢复大奥cpu的通用寄存器中

(7)使cpu获得运行任务的断点指针

 ucosII是把当前正在运行任务的任务控制块的指针放到一个指针变量OSTCBCur 中,并且在调度器的前面代码中已经得到了待运行的任务控制块指针OSTCBHighRdy,所以第(2~6)项工作非常容易,其示意性代码如下:

OSTCBCur -> OSTCBStkPtr = sp;          //sp保存在中止任务控制块中

OSTCBCur = OSTCBHighRdy;            //使系统获得运行任务控制块SKSp = OSTCBHighRdy -> OSTCBStkPtr;      //把待运行任务堆栈指针赋给sp

第(1)和(7)项工作通过中断将断电指针推入cpupc寄存器的功能,恢复带运行任务的断点。一般情况下,中断服务函数要用汇编语言编写。用宏OS_TASK_SW()来引发中断,若微处理器有软中断,那么宏里封装一个软中断,若微处理器没有软中断,在宏中封装其他可以使PC等相关的寄存器压栈的指令。

 

3.5 任务创建

UCOSIIOSTaskCreat()OSTaskCreatExt()来创建任务,其中OSTaskCreatExt()OSTaskCreat()扩展,并提供了一些附加功能。

 

OSTaskCreat()创建任务时,函数对待创建任务的优先级进行判断,确认该优先级合法且未被使用之后,就调用函数对任务堆栈和任务控制块初始化。初始化成功之后,把任务计数器加1和判断OSRunning的值是否为1,若为1就进行任务调度。

 

OSTaskCreatExt()创建任务时,更加灵活,但是会增加额外开销。原型如下:


UCOSII有一个规定,必须在调用启动任务函数OSStart()之前,必须已经创建了至少一个任务。所以,一般习惯上在调用函数OSStart()之前先创建一个任务。

 

3.6任务的挂起和恢复

 

任务的挂起就是停止任务的运行。用户任务可以通过调用系统提供OSTaskSuspend()函数来挂起自身或者除空闲任务之外的其他任务,只能在其他任务中通过调用恢复函数OSTaskResume()恢复就绪状态。

 

任务在运行状态、就绪状态和等待状态之间转移关系。


挂起:

函数原型OSTaskSuspend():

INT8U OSTaskSuspend(INT8U prio);

参数prio为优先级别,函数要挂起自身,参数为常数OS_PRIO_SEI,F,在uCOS_H.H中定义为0xFF

流程:

先判断是否调用该函数的任务本身,如果是,则删除任务在就绪表中的就绪标志,做起挂起记录,引发任务调度;如果不是,则删除被挂起任务 的就绪标致,并做挂起记录

 

恢复任务:

原型:INT8U OSTaskResume(INT8U prio);

流程:判断任务是否挂起且不是一个等待任务,就清除挂起记录

 

3.7 其他任务管理函数

修改任务优先级别:

任务可根据需要调用函数OSTaskChangePrio()来改变任务的优先级别。


删除任务:
把要删除的任务的任务控制块从任务控制链表中删除,并归还给空任务控制块链表,在任务就绪表中把该任务的就绪状态位置置为0

可以调用函数OSTaskDel()来删除任务自身或除了空白任务之外的其他任务。如果调用这个函数是为了删除自己,在调用函数时令函数的参数prioOS_PRIO_SELF

若是为了删除一个占用资源的任务,需要调用OSTaskDelReq()

查询任务信息:

OSTaskQuery()来获取选定任务的信息,若查询成功,则返回OS_NO_ERR,并将查询得到的任务信息存放在结构OS_TCB类型变量中。

 

3.8 UCOSII的初始化和任务的启动

初始化:

在使用ucosii所有服务之前,必须调用ucosii的初始化函数OSInit()OSInit()UCOSII的所有全局变量和数据结构进行初始化,同时创建空闲任务OSTaskIdle,并赋之以最低的优先级别和永远就绪状态。

初始化函数OSInit()对数据结构进行初始化时,主要是创建包括空任务控制块链表在内的5个空数据缓冲区。




启动:

任务管理从调用OSStart()开始,前提是至少创建了一个用户任务。



2018-03-11 13:02:37 cph77777 阅读数 765


T2080RDB-PC 运行 VxWorks 6.9 系统

3162412793@qq.com

技术交流QQ群: 691976956

 

硬件平台: T2080RDB-PC

操作系统: VxWorks 6.9.x

硬件配置: 

                  CPU :        T2080

                  DDR:         DDR3 SDRAM 2048 MB

                  NAND:        256 MB

                  SPI FLASH:   32 MB

                  NOR:         64 MB

                  网口:       2 10/100/1000 Mbps,2 SFP+, 2 10G bps

                  串口 :       2

                  USB       2

                  音频:       n/a

                  显示:       n/a

                  SPI       1

                  I2C :        1

                  OTG:         n/a

                  RTC:         1

                  CAN:         n/a

 

启动信息:

VxWorks System Boot

 

Copyright 1984-2018  Wind River Systems, Inc.

 

 

CPU: Freescale QorIQ T2080

Version: VxWorks 6.9

BSP version: 6.9/0

Creation date: Dec  1 2017 10:56:23

 

 

Press any key to stop auto-boot...

 5

 

[VxWorks Boot]: p

boot device            : tffs=0,0

unit number            : 0

processor number       : 0

host name              : host

file name              : /tffs0/vxworks

inet on ethernet (e)   : 192.168.0.200:ffffff00

host inet (h)          : 192.168.0.100

user (u)               : target

ftp password (pw)      : target

flags (f)              : 0x0

other (o)              : memac2

[VxWorks Boot]: @

boot device            : tffs=0,0

unit number            : 0

processor number       : 0

host name              : host

file name              : /tffs0/vxworks

inet on ethernet (e)   : 192.168.0.200:ffffff00

host inet (h)          : 192.168.0.100

user (u)               : target

ftp password (pw)      : target

flags (f)              : 0x0

other (o)              : memac2

Loading /tffs0/vxworks...3465024

Starting at 0x100000...

Target Name: vxTarget

Adding 8549 symbols for standalone.

 

               VxWorks

Copyright 1984-2018  Wind River Systems, Inc.

             CPU: Freescale QorIQ T2080

    Runtime Name: VxWorks

 Runtime Version: 6.9 SMP

     BSP version: 6.9/0

         Created: Dec  12017 11:56:23
ED&R Policy Mode: Deployed
   WDB Comm Type: WDB_COMM_END
             WDB: Ready.

->

-> devs

drv name

  0/null

  1/tyCo/0

  1/tyCo/1

  3/tffs0

  7/eeprom/0

  7/eeprom/1

  9host:

 10/vio

 11/tgtsvr

value = 25 = 0x19

->

-> ifconfig

lo0     Link type:Local loopback  Queue:none

       inet 127.0.0.1 mask 255.255.255.255

       UP RUNNING LOOPBACK MULTICAST NOARP ALLMULTI

       MTU:1500 metric:1 VR:0  ifindex:1

       RX packets:8 mcast:0 errors:0 dropped:0

       TX packets:8 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:344 TX bytes:344

memac2      Linktype:Ethernet HWaddr 00:04:9f:9c:aa:a0 Queue:none

       inet192.168.0.200 mask 255.255.255.0 broadcast 192.168.0.255

       UP SIMPLEX BROADCAST MULTICAST

       MTU:1500 metric:1 VR:0  ifindex:2

       RX packets:0 mcast:0 errors:0 dropped:0

       TX packets:0 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:0 TX bytes:0

value = 0 = 0x0

->

-> ipAttach 3,"memac"

value = 0 = 0x0

->

-> ifconfig

lo0     Link type:Local loopback  Queue:none

       inet 127.0.0.1 mask 255.255.255.255

       UP RUNNING LOOPBACK MULTICAST NOARP ALLMULTI

       MTU:1500 metric:1 VR:0  ifindex:1

       RX packets:8 mcast:0 errors:0 dropped:0

       TX packets:8 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:344 TX bytes:344

memac2  Link type:Ethernet  HWaddr 00:04:9f:9c:aa:a0  Queue:none

       inet192.168.0.200 mask 255.255.255.0 broadcast 192.168.0.255

       UP SIMPLEX BROADCAST MULTICAST

       MTU:1500 metric:1 VR:0  ifindex:2

       RX packets:0 mcast:0 errors:0 dropped:0

       TX packets:0 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:0 TX bytes:0

memac3  Link type:Ethernet  HWaddr 00:04:9f:9b:aa:a0  Queue:none

       SIMPLEX BROADCAST MULTICAST

       MTU:1500 metric:1 VR:0  ifindex:3

       RX packets:0 mcast:0 errors:0 dropped:0

       TX packets:0 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:0 TX bytes:0

value = 0 = 0x0

-> ifconfig "memac3192.168.1.200 up"

value = 0 = 0x0

->

-> ifconfig

lo0     Link type:Local loopback  Queue:none

       inet 127.0.0.1 mask 255.255.255.255

       UP RUNNING LOOPBACK MULTICAST NOARP ALLMULTI

       MTU:1500  metric:1  VR:0  ifindex:1

       RX packets:8 mcast:0 errors:0 dropped:0

       TX packets:8 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:344 TX bytes:344

memac2  Link type:Ethernet  HWaddr 00:04:9f:9c:aa:a0  Queue:none

       inet192.168.0.200 mask 255.255.255.0 broadcast 192.168.0.255

       UP SIMPLEX BROADCAST MULTICAST

       MTU:1500 metric:1 VR:0  ifindex:2

       RX packets:0 mcast:0 errors:0 dropped:0

       TX packets:0 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:368 TX bytes:220

memac3  Link type:Ethernet  HWaddr 00:04:9f:9b:aa:a0  Queue:none

       inet192.168.1.200 mask 255.255.255.0 broadcast 192.168.1.255

       UP SIMPLEX BROADCAST MULTICAST

       MTU:1500 metric:1 VR:0  ifindex:3

       RX packets:0 mcast:0 errors:0 dropped:0

       TX packets:0 mcast:0 errors:0

       collisions:0 unsupported proto:0

       RX bytes:1368 TX bytes:766

value = 0 = 0x0

->

2017-03-09 21:02:16 wunian_930124 阅读数 525

一、中央处理器(CPU)

处理器由运算器、控制器和一系列的寄存器以及高速缓存构成。

两类寄存器:

1、用户可见寄存器:高级语言编译器通过优化算法分配并使用之,以减少程序访问内存次数

2、控制和状态寄存器:用于控制处理器的操作,通常由操作系统代码使用(在某种特权级别下可以访问、修改)

  常见的控制和状态寄存器:

a、程序计数器(PC),记录记录将要取出的指令的地址

b、指令寄存器(IR),记录最近取出的指令

c、程序状态字(PSW),记录处理器的运行状态如条件码、模式、控制位等信息


二、操作系统的状态

  内核态:运行操作系统程序

  用户态:运行用户程序

  特权指令:只能由操作系统使用、用户程序不能使用的指令(启动I/O,内存清零,修改程序状态字、设置时钟、允许/禁止中断、停机等)

  非特权指令:用户程序可以使用的指令


CPU状态之间的转换:

用户态--->内核态:唯一途径,中断/异常/陷入机制 。陷入指令(又称访管指令),提供给用户程序的接口,用于调用操作系统的功能

内核态--->用户态:设置程序状态字PSW


三、中断/异常机制

概念:CPU对系统发生的某个事件作出的一种反应。CPU暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点,继续执行被打断的程序。

特点:

1、是随机发生的

2、是自动处理的

3、是可恢复的

中断/异常机制的主要作用:及时处理设备发来的中断请求;可使操作系统捕获用户程序提出的服务请求;防止用户程序执行过程中的破坏性活动。

中断的引入:为了支持CPU和设备之间的并行操作,外部事件,正在运行的程序所不期望的

异常的引入:表示CPU执行指令时本身出现的问题,由正在执行的指令引发


中断/异常机制的工作原理:中断/异常机制是现代计算机系统的核心机制之一,硬件和软件相互配合使计算机系统得以充分发挥能力。

  1、硬件做什么事? --中断/异常响应

  捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序。

  2、软件做什么事? --中断/异常处理程序

  识别中断/异常类型并完成相应的处理。

  其中,中断向量:是一个内存单元,存放了中断处理程序的入口地址和程序运行时所需的处理机状态字。

  设计操作系统时,为每一类中断/异常事件编好响应的处理程序,并设置好中断向量表。

  系统运行时若响应中断,中断硬件部件将cpu控制权转给中断处理程序。(软件提前设置好,硬件部件来执行)



    

  上图以设备输入输出中断为例,介绍了中断运行机制的具体流程。


四、系统调用机制

  1、什么是系统调用?


  2、系统调用机制的设计


  3、系统调用的执行过程

  当cpu执行到特殊的陷入命令时:

  a、中断/异常机制:硬件保护现场;通过查中断向量表把控制权转给系统调用总入口程序

  b、系统调用总入口程序:保存现场;将参数保存到内核堆栈里;通过查系统调用表把控制权转给相应的系统调用处理例程或内核函数

  c、执行系统调用处理例程

  d、恢复现场,返回用户程序



没有更多推荐了,返回首页