操作系统双重模式和中断机制和定时器概念

一、陷阱中断

还是想记录下这方面的知识吧,所以想来也写写。

现代的操作系统其实都是由中断驱动的,中断其实本质上就是一种电信号,当有某些事件发生之后就会去产生中断,然后中断控制器进行接收,它可以接收多个外部中断源的中断请求,并进行优先级判断,选中当前优先级最高的中断请求,并将此请求送到CPU的INTR端。当CPU响应中断并进入中断服务程序的处理过程后,中断控制器仍负责对外部中断请求的管理。

在我们的计算机中,如果没有进程要执行的话,没有I/O设备要进行服务,以及没有用户请求要去请求切换到内核模式执行系统调用的话等等事情,那么操作系统就会去等待某个事件的发生。

而这个事件又往往是由中断或者陷阱引起的。而中断又可以分为硬中断软中断,硬中断是由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包就会发生中断,所以我们在收到网络数据的时候大多数框架都会提供一个回调机制,其实也就是基于此进行操作的。

陷阱通常是一种软件中断也就是说用户应用程序可以调用相应的函数所产生,就比如说在Mach操作系统中可以这么做通过调用mach_msg_trap() 时会触发陷阱机制,切换到内核态。



还和RunLoop有关,里面调用的是CFRunLoopServiceMachPort方法,关于这个方法,RunLoop休眠时,调用的就是下面这个函数,这个函数等待接收mach_port消息,而mach_msg()的本质是一个调用mach_msg_trap(),这相当于一个系统调用,会触发内核状态切换。

当程序静止时,RunLoop停留在static Boolean __CFRunLoopServiceMachPort(mach_port_name_t port, mach_msg_header_t **buffer, size_t buffer_size, mach_port_t *livePort, mach_msg_timeout_t timeout, voucher_mach_msg_state_t *voucherState, voucher_t *voucherCopy)

而这个函数内部就是调用了mach_msg让程序处于休眠状态。。


这种软件中断可能是源于程序出错,也可能是源于用户程序的一个特别的请求比如说请求去调用操作系统服务。对于每一种不同类型的中断操作系统中不同的代码段决定了将要采取的动作,操作系统中的中断服务程序就是用来去处理中断的。

二、双重模式

由于操作系统和用户共享了计算机系统的硬件和软件,必须要去保证用户程序中的一个出错仅仅去影响的是正在运行的程序,因为如果采用了共享计算机资源的话,如果不区分操作系统代码和用户定义代码的执行的话,很有可能会发生许多进程可能会受到一个程序中的一个bug的影响,就比如说一个进程陷入了死循环中,那么有可能这个死循环就会去阻止很多其他进程的正确操作。而且也很有可能出现的问题就是这个一个错误的程序可能去修改另一个程序的数据,甚至是操作系统本身。

所以现在的操作系统大多都是采用两种独立的操作模式,一种就是用户模式,另外一种就是内核模式,在计算机硬件中会增加一个称为模式位的位去表示当前模式比如说0表示内核模式,1表示用户模式,有了这个模式位,就可以区分出操作系统所执行的任何和用户所执行的任务。

当计算机系统表示用户应用程序正在执行,系统处于用户模式。在当用户应用程序需要操作系统的服务的时候,它就必须从用户模式转换过来去执行请求。下面就是用户模式到内核模式的转换

也就是说如果出现了陷阱或者终端,硬件就会将用户模式切换到内核模式,其实也就是把模式位设置为0,因此,只要操作系统获得了对计算机的控制,它就处于内核模式。系统把控制交还给用户程序的时候就会切换回用户模型,也就是把模式位设置为1。

双重模式的实现方法其实就是将能引起损害的机器指令作为特权指令,如果再用户模式下试图执行特权指令,那么硬件是不会执行该指令,并且认为这个指令是非法的,会以陷阱的形式去通知操作系统。

其实上述操作可以总结为,最初的时候控制权在操作系统中,之后如果当控制权转到一个用户应用程序之后,模式变为用户模式,最后会通过中断、陷阱或者系统调用将控制权返回给操作系统。

系统调用为用户程序请求操作系统代表用户程序完成预留给操作系统的任务提供了方法。

三、定时器

为了确保操作系统能够对CPU的控制,也为了防止用户程序陷入到死循环中或者不去调用系统服务,并且不将控制权返回到操作系统,可以使用定时器,并且将定时器设置为在给定的时间后去中断计算机。时间段可以是固定的也可以是可变的。

操作系统在将控制权给用户之前,应该去确保设置好了定时器以方便的去产生中断。如果定时器产生中断,那么控制权就会自动交给控制系统,操作系统会针对不同的中断,做出不同的事情,比如说可以将中断作为致命的错误来处理,当然也可以给予用户程序更多的时间。



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中断概念和作用: 中断是一种机制,用于在微处理器执行程序的过程中,暂停当前正在执行的任务,转而执行一个特定的代码块,然后再返回到原来的任务。中断可以用于响应外部事件(如按键、传感器信号等)或内部事件(如定时器溢出、串口接收等),实现实时响应和异步处理。 中断的作用: 1. 实时响应:中断可以立即响应外部或内部事件,使得系统能够及时处理紧急或重要的任务。 2. 异步处理:中断允许系统在执行主任务的同时,处理其他事件,提高系统的效率和灵活性。 3. 时间控制:通过定时器中断,可以实现精确的时间控制,例如定时触发任务、生成精确的时间延迟等。 4. 多任务管理:中断允许系统在多个任务之间进行切换,实现多任务管理和调度。 使用定时器进行延时操作: 定时器可以用来生成精确的时间延迟,以下是使用定时器进行延时操作的一般步骤: 1. 配置定时器:使用STM32CubeMX或编写代码配置定时器的计数模式、预分频系数和重载值等参数。 2. 启动定时器:使用HAL库提供的函数启动定时器,开始计数。 3. 等待定时器溢出:使用HAL库提供的函数或轮询定时器状态的方式,等待定时器溢出。 4. 定时器中断处理函数:在定时器溢出时,中断服务程序(ISR)会被执行,可以在ISR中进行延时结束后的处理。 以下是一个基于定时器的延时操作的示例代码: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim2; void SysTick_Handler(void) { HAL_IncTick(); } void TIM2_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM2) { // 定时器溢出后的处理 } } void delay_ms(uint32_t ms) { HAL_Delay(ms); } int main(void) { HAL_Init(); SystemClock_Config(); // 初始化定时器 __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = 1000 - 1; // 设置预分频系数 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 10000 - 1; // 设置重载值 HAL_TIM_Base_Init(&htim2); // 启动定时器 HAL_TIM_Base_Start_IT(&htim2); while (1) { // 延时1秒 delay_ms(1000); // 延时结束后的处理 } } ``` 以上代码使用定时器TIM2生成1秒的延时,定时器溢出后会调用`HAL_TIM_PeriodElapsedCallback()`函数进行延时结束后的处理。在主循环中,使用`delay_ms()`函数实现1秒的延时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值