0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述操作系统的保护机制

jf_78858299 来源:码农的荒岛求生 作者:陆小风 2023-02-15 14:48 次阅读

在回答这个问题之前,你可能会首先想:为什么操作系统需要保护自己呢?

操作系统其实就是一个大管家,负责给应用程序搭建舞台,好让程序们过好自己的一生,但偏偏有不听话的程序可能想抢操作系统的戏,显然这会影响所有其它正在程序,因此操作系统必须要有能力保护自己。

我们从历史的角度了解了x86最开始是没有任何保护机制的,应用程序竟然可以与操作系统平起平坐,操作系统能读写的内存区域应用程序也一样可以读写,操作系统可以控制的硬件应用程序一样不在话下。

应用程序和操作系统这么平等还何谈保护?其实从某种程度讲, 保护自己就是限制别人 ,那么操作系统该怎样限制应用程序呢?

程序也是分三六九等的

核心就在一点: 权限

这一点相信对于打工人都深有体会,在公司里有的文档你无权查看,有的数据库你无权读取,有的门禁你的卡刷不开等等。

这里也是一样的道理,但是操作系统和普通的应用程序都是软件,从本质上讲没有任何区别,在CPU眼里都是机器指令,显然从软件这一层面上看操作系统没有很好的办法能控制应用程序,这就不得不借助硬件的帮忙了,借助谁的帮忙呢?显然是CPU。

我们刚才提到过,不管是操作系统还是应用程序在CPU眼里都是机器指令,CPU闭着眼执行就完事儿,从时间角度上看CPU就是一条又一条的在执行指令:

图片

然而,CPU也不能对此一点都不关心,CPU必须能区分出哪些指令属于操作系统,哪些指令属于普通的应用程序!

该怎么区分呢?很简单,其中一种方法是这样的,我们添加一些特殊的机器指令,假设是指令A和B,CPU执行到该指令A时就知道接下来要执行的指令属于操作系统,当执行完指令B时就知道接下来要执行的属于普通应用程序,这两条指令在x86(32位)中就是int与iret指令,这两个指令对应的背后就是所谓的系统调用。

有了这样的指令,CPU可以清楚的执行什么时候在执行普通程序,什么是在运行操作系统(程序),CPU能区分清楚那么就能给它们赋予不同的权限, 这就是所谓用户态与内核态的由来 ,用户态对应的是普通程序,内核态对应的是操作系统,它们的权限是不一样的。

图片

x86 CPU支持四种权限等级,0,1,2,3,一般的操作系统都使用两种特权0和3,0是最高权限,显然这是操作系统也就是内核态所拥有的权限,而3是普通程序运行的权限,相对较低。

同时,一些指令只有在内核态下才可以执行,这些就是所谓特权指令,当CPU在用户态(普通程序)时是没有办法执行特权指令的,这样就从机器指令这个层面确保了普通程序不能执行某些特权操作。

图片

我们知道程序除了机器指令外还有指令依赖的数据,而数据又是保存在内存中,那么接下来的问题是操作系统该怎样保护自己的内存不会普通程序读写呢?

访问内存也需要权限

答案和我们刚才讲解的机器指令的特权划分是一样的。

我们规定操作系统所在的内存区域只有CPU处于内核态时才可以访问,如果位于用户态的程序试图访问内核所在的地址空间那么将立刻被操作系统kill掉。

那么接下来的问题就是我们该怎样给一段内存添加上权限信息呢?

显然我们需要一张“表”,这张表中记录一段内存区域并且记录下访问这块内存所需要的权限信息,类似这样:

序号   起始地址   长度     所需权限0     0x7c00    0x1000  01     0x9a00    0x2000  3...

当CPU试图访问这段内存区域时会根据CPU自身所在的权限(内核态或者用户态)与这段内存需要的权限进行比对,只有当CPU所在权限比访问这段内存所需要的权限高或者相等时才能读写这段内存,否则将触发异常。

假设CPU当前正在执行用户态程序,也就是运行在用户态,因此其权限等级为3,此时如果CPU试图访问第0号内存块时发现读写该内存块所需要的权限为0(内核态),这时CPU本身将产生异常,该异常将被操作系统捕获,此时操作系统会发现应用程序试图读写程序不具备权限的内存,因此操作系统手起刀落将该进程kill掉,这样操作系统就保证了自己的内存区域不会被普通程序所读写。

图片

就这样操作系统成功保护了自己的内存数据以及机器指令。

现在是时候总结一下了。

为了将操作系统和普通程序区别开来,我们需要给机器指令赋予权限等级,该权限信息会保存在CPU中,显然CPU中需要特定寄存器来保存该信息,于此同时我们也为内存区域赋予了权限等级,只有当前CPU的权限大于或者等于该内存区域所需权限时才能读写,这就要求有一张“表”来保存内存起始地址、长度、权限等信息,这张表就是所谓的Global Descriptor Table,GDT,以及Local Descriptor Table,LDT。

内核所在内存区域以及一些共享内存区域信息就保存在GDT中,这就是叫做Global的原因,而进程所在的内存区域(私有)信息则保存在LDT中,这就是为什么叫做Local。

具备这些能力的x86 CPU就被称为保护模式,Inter处理器从80286开始引入保护模式,可以看到与x86早前的实模式相比,保护模式开始有了质的飞跃。

从实模式到保护模式

我们在之前的文章中说过,x86是一个有着顽强生命力的物种,其它大部分类型的CPU在计算机不长的历史中逐渐消失了,而x86则历久弥新,也因此x86历史包袱十分沉重,即使是最新款的intel x86处理器也可以运行上世纪编写的古老程序,为做到向后兼容,intel x86程序必须既能运行在实模式下也能运行在保护模式下。

因此x86处理器在加电会首先进入实模式然后切换到保护模式,现代操作系统都运行在保护模式下,正是利用了处理器的一系列特性操作系统才得以保护自己。

我们看到的x86内存管理都是基于段式机制,Segmentation来管理内存的,实际上x86处理器在引入保护模式的同时也开始支持页式内存管理(paging),因此现代x86处理器即支持段式内存管理也支持页式内存管理,只不过对于现代操作系统像Linux等实际上几乎不再使用处理器提供的段式内存管理机制而是基于页式内存管理机制。

从这里我们也能看出来,内存管理机制其实是处理器这种硬件提供的,操作系统(软件)只不过这种机制的使用者而已。

好啦,这篇文章就先到这里,实际上这里还有很多内容没有讲解完,GDT、LDT长什么样子?怎么使用?具体该怎样从实模式切换到保护模式等等,这些内容将在后续章节中介绍。

希望这篇文章对大家理解操作系统的保护机制有所帮助。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6412

    浏览量

    122333
  • 程序
    +关注

    关注

    114

    文章

    3673

    浏览量

    79874
收藏 人收藏

    评论

    相关推荐

    自己动手做操作系统(附光盘)

    额外说明1213.5 保护模式下的I/O1223.5.1 IOPL1223.5.2 I/O许可位图(I/O Permission Bitmap)1233.6 保护模式小结123第4章 让操作系统走进
    发表于 10-17 09:55

    计算机操作系统的运行机制和体系结构

    计算机操作系统-运行机制、体系结构
    发表于 07-09 16:52

    μC/OSII操作系统的中断机制和中断应满足的条件是什么

    本文以开源的嵌入式操作系统μC/OSII为例,分析了操作系统的中断机制和中断应满足的条件。介绍了μC/OSII系统时钟节拍,探讨了时钟中断函数中存在的不足,并且给出了解决方案,从而有效
    发表于 04-27 06:33

    操作系统知识点

    操作系统内存管理简述进程线程切换的流程如果想要从A进程切换到B进程,必定要先从用户态切换到内核态,因为这个切换工作是由操作系统完成的,操作系统需要先挂起正在占用CPU的A进程,才能切换
    发表于 07-01 10:32

    嵌入式技术简述

    1.嵌入式技术简述(1)概念: 在已有的硬件上移植操作系统,在操作系统上做层应用开发以及在操作系统之下做底层开发;(2)操作系统:管理资源(
    发表于 10-27 06:49

    STM32CubeProgrammer解除读保护的方法简述

    操作系统,图形用户界面或命令行界面,支持多种连接选择(JTAG、SWD、USB、UART),采用手动操作或通过脚本自动操作。很多情况下,我们为了程序安全,都会在烧录时,使能读保护功能,
    发表于 02-14 06:29

    一文读懂RT-Thread操作系统的邮箱机制

    RT-Thread操作系统的邮箱有何作用?RT-Thread操作系统的邮箱机制管理数据结构是怎样的?
    发表于 02-28 08:10

    一种嵌入式实时操作系统—OSEK/VDx OS

    OSEK/VDX操作系统是一种嵌入式实时操作系统(RTOS),具有可裁剪性。本文着重描述了操作系统的内核,包括任务管理机制、一致类、事件机制
    发表于 04-20 08:38 25次下载

    基于OSEK/DX操作系统的任务管理机制设计

    基于OSEK/VDX操作系统的任务管理机制设计:在汽车电子仿真控制平台开发领域,通常需要遵循OSEKIVDX规范集,而该规范集的核心之一便是OSEK/VDX操作系统规范。要设计一个符合该规
    发表于 04-21 22:02 19次下载

    linux操作系统的安全性

    linux操作系统的安全性 计算机系统安全性的内涵 操作系统的安全性功能 操作系统的安全机制 安全
    发表于 04-28 15:05 0次下载

    Linux操作系统简述

    Linux操作系统简述一、计算机软件与操作系统  功能强大的计算机自从走进了人类的生活就发挥着越来越重要的作用,随着时代的发展,计算机已
    发表于 01-18 12:43 1186次阅读

    Linux操作系统信号量机制的实时化改造

    为了提高Linux操作系统的实时性,研究了Linux操作系统System V信号量机制在内核中的实现,发现其在实时应用中存在的不足,提出并实现了一种对其进行改进的方法。经测试表明,采用该
    发表于 06-25 16:41 18次下载

    RTOS操作系统

    RTOS操作系统RTOS操作系统RTOS操作系统RTOS操作系统RTOS操作系统
    发表于 12-28 15:30 0次下载

    操作系统内核中高效保护应用程序的方法

    在现代操作系统中,内核运行在最高特权层,管理底层硬件并向上层应用程序提供系统服务,因而安全敏感的应用程序很容易受到来自底层不可信内核的攻击,提出了一种在不可信操作系统内核中保护应用程序
    发表于 01-15 16:45 0次下载
    <b class='flag-5'>操作系统</b>内核中高效<b class='flag-5'>保护</b>应用程序的方法

    解析操作系统的概念、结构和机制

    全面。解析操作系统的概念、结构和机制
    发表于 03-26 14:19 8次下载