其他
操作系统是如何保护自己的? CPU与保护模式
The following article is from 码农的荒岛求生 Author 陆小风
点击关注公众号,一周多次包邮送书
来源:经授权转自 码农的荒岛求生(ID:escape-it)
作者:陆小风
在回答这个问题之前,你可能会首先想:为什么操作系统需要保护自己呢?
操作系统其实就是一个大管家,负责给应用程序搭建舞台,好让程序们过好自己的一生,但偏偏有不听话的程序可能想抢操作系统的戏,显然这会影响所有其它正在程序,因此操作系统必须要有能力保护自己。
在上一篇文章《彻底理解操作系统:CPU与实模式》中,我们从历史的角度了解了x86最开始是没有任何保护机制的,应用程序竟然可以与操作系统平起平坐,操作系统能读写的内存区域应用程序也一样可以读写,操作系统可以控制的硬件应用程序一样不在话下。
应用程序和操作系统这么平等还何谈保护?其实从某种程度讲,保护自己就是限制别人,那么操作系统该怎样限制应用程序呢?
程序也是分三六九等的
核心就在一点:权限。这一点相信对于打工人都深有体会,在公司里有的文档你无权查看,有的数据库你无权读取,有的门禁你的卡刷不开等等。这里也是一样的道理,但是操作系统和普通的应用程序都是软件,从本质上讲没有任何区别,在CPU眼里都是机器指令,显然从软件这一层面上看操作系统没有很好的办法能控制应用程序,这就不得不借助硬件的帮忙了,借助谁的帮忙呢?显然是CPU。我们刚才提到过,不管是操作系统还是应用程序在CPU眼里都是机器指令,CPU闭着眼执行就完事儿,从时间角度上看CPU就是一条又一条的在执行指令:访问内存也需要权限
答案和我们刚才讲解的机器指令的特权划分是一样的。我们规定操作系统所在的内存区域只有CPU处于内核态时才可以访问,如果位于用户态的程序试图访问内核所在的地址空间那么将立刻被操作系统kill掉。那么接下来的问题就是我们该怎样给一段内存添加上权限信息呢?显然我们需要一张“表”,这张表中记录一段内存区域并且记录下访问这块内存所需要的权限信息,类似这样:序号 起始地址 长度 所需权限
0 0x7c00 0x1000 0
1 0x9a00 0x2000 3
...
从实模式到保护模式
我们在之前的文章中说过,x86是一个有着顽强生命力的物种,其它大部分类型的CPU在计算机不长的历史中逐渐消失了,而x86则历久弥新,也因此x86历史包袱十分沉重,即使是最新款的intel x86处理器也可以运行上世纪编写的古老程序,为做到向后兼容,intel x86程序必须既能运行在实模式下也能运行在保护模式下。推荐阅读
• BigDecimal使用不当,造成P0事故!• 争议很大的问题• 聊聊保证线程安全的10个小技巧• IDEA创建maven 项目一直loading archetype list?• 如何调用一个只支持batch_call的服务?• 阿里二面:RocketMQ 消费失败了,怎么处理?• 搞了几年,基于QUIC的HTTP/3终于官宣了,编号RFC 9114
👇更多内容请点击👇