操作系统的设计指导思想——主奴机制

2023-05-16

        在学习操作系统的过程中我们会发现一个问题:应用程序是应用程序,操作系统也是程序,操作系统程序凭什么能对应用程序进行组织、管理和协调而不受应用程序损害呢?我们认为凭的是特权机制。要想让操作系统做到能够对应用程序进行组织、管理和协调,同时又不受到损害,最有效的方法就是使操作系统与应用程序之间,应用程序与应用程序之间进行有效的分离,同时要做到操作系统能随意访问应用程序,而应用程序不能访问操作系统,应用程序之间也不能相互访问。

        这一意味着,操作系统必须能过做到,如果它要让应用程序在内存的什么位置运行,该应用程序就必须老老实实的在那里运行;操作系统应该在内存中为应用程序划出清晰的边界,应用程序不能越雷池半步。操作系统允许应用程序占用CPU运行多长时间,应用程序就运行多长时间,运行玩这些时间后,还要讲CPU的使用权交还给操作系统,没有权利自动扣留CPU的使用权。如果某个应用程序想要使用外设,不能和直接想外设伸手,而是要像操作系统申请,如果操作系统认为可以让这个应用程序使用外设,就让它使用,如果操作系统认为不可以使用外设,则该应用程序就不能使用.....

在这样的特权机制下,操作系统和应用程序的关系变成了主子和奴才的关系,我们把这种特权机制叫做主奴机制。

主奴机制中的进程及进城创建的机制

1、进程边界与进程

为了实现主奴机制,首先要在操作系统内核程序与应用程序之间,应用程序与应用程序之间建立有效的边界。

程序代码在计算机中的情况与气体液体的情况类似,也没有天然、确定的边界,这就需要操作系统人为确定边界,起到类似于容器的分离和承载的作用。为此,现代操作系统提出了进程的概念,用task_struct结构来实现明确的划分边界的作用。Task_struct是进程的主要标志,从操作系统的角度看,进程是运行中的接收操作系统组织、管理和协调的程序。

2、进程的创建

从技术上讲,进程的创建方法不止一种,Linux操作系统的进程创建采用的是对象创建模式。对象创建的就是用已有的对象创建对象,用已有的进程创建进程,也就是所谓的父子进程创建机制。从本质上讲,创建进程最主要的就创建task_struct。父子进程创建的主要机制就是从父进程的task_struct复制一份作为子进程的task_struct

从逻辑上很容易推出,父子进程创建机制意味着最初的父进程必须独立存在,这就是进程0。进程0不能由父子进程创建机制创建,所以只能由操作系统设计者手工编写进程0tak_struct。有了进程0,父子进程创建机制就可以用进程0作为父进程创建子进程。有了进程。就有了主奴机制的组织、管理和协调对象。

操作系统的设计如何体现主奴机制?

1、操作系统在进程调度中体现咱主奴机制

2、操作系统在内存管理中体现的主奴机制

3、操作系统在文件系统中体现的主奴机制

实现主奴机制的三种关键技术

1、保护和分页

2、特权及

3、中断

建立主奴机制的决定性因素——先机

         到此为止,主奴机制已经大概表述完了,如果大家还相对各个部分的细节知识进行了解,可以参考《Linux内核设计艺术》来加深理解。现在只有一个问题无法解释:用户程序是程序,操作系统也是程序,用的是同一个CPU、同一套指令集,为什么操作系统内核程序能用的指令,用户程序就不能用呢?答案似乎是内核的特权及比用户程序的特权级高。进一步问:为什么内核程序能获得高的特权级,而用户程序就不能?

        我们认为,关键的就是先机。

        计算机开机启动的时候是实模式,实模式没有特权级的概念。这是操作系统内核开始加载。正常情况下,此时不应该有BIOS、操作系统以外的任何程序。当操作系统的启动程序打开PE的时候,特权级状态必须是最高特权级,否则有一部分指令将永远也无法执行。这是个关键的时刻,操作系统设计者就是利用这个最有利的时间,以时间换特权,先霸占所有特权,并充分利用这些特权,创建这些进程。因为所有的进程都是操作系统直接或者是间接创建的,所以,操作系统有充分的条件和机会把进城的特权级降低。一旦进程的特权级被降低,就再也无法翻身,除非操作系统代码设计错误,误把进城的特权级提上来。显然操作系统设计者会认真审查这种错误,消灭这类错误。假设操作系统的代码没有错误,进程一旦被创建,就再也无法获得内核特权级,只能终身为奴。由此可见,掌握先机对操作系统主奴即使的形成有着决定性的作用。

        一些恶意程序进入计算机的时机虽然晚于操作系统,但是它们会想法设法利用操作系统设计上的一切可以利用的漏洞,变被动为主动,抢占先机。一旦掌握先机,马上获得最高特权级,就可以为所欲为......有一类病毒,就通过利用这一点,利用操作系统的漏洞,想办法驻留到硬盘的系统引导区,甚至是BIOSBIOS和硬盘的引导程序是先于操作系统进入内存的。这类病毒自然就先于从做系统进入内存,一旦他们抢占先机,获得最高特权级,操作系统就非常麻烦了!有上述可见操作系统的主奴机制在整个操作系统的运行中起着主导地位,就是这个机制是我们可以将应用程序顺畅的运行在操作系统上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统的设计指导思想——主奴机制 的相关文章

  • GPS坐标与UTM坐标的转换

    1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common GPSStatus 在大多数情况下 xff0c 这些消息应同时发布 xf
  • NVIDIA Jetson TX2使用笔记(一):开机设置

    0 写在前面 由于项目需要 xff0c 使用 NVIDIA Jetson TX2作为硬件开发平台 xff0c 在此记录使用方法和遇到的问题 NVIDIA Jetson TX2是英伟达的嵌入式开发套件 xff0c 可以进行视觉计算 xff0c
  • ORB-SLAM2的安装与运行

    0 背景简介 ORB SLAM是西班牙Zaragoza大学的Raul Mur Artal编写的视觉SLAM系统 他的论文 ORB SLAM a versatile andaccurate monocular SLAM system 34 发
  • Ubuntu14.04升级cmake版本的方法

    在Ubuntu14 04用以下命令默认安装的cmake版本为2 8 x xff0c 有时我们需要更高版本的cmake xff0c 所以需要升级 span class hljs built in sudo span apt get insta
  • 在TX2上配置ORB-SLAM2错误总结

    Pangolin 错误描述 usr lib gcc aarch64 linux gnu 5 aarch64 linux gnu libGL so undefined reference to 96 drmFreeDevice 解决方法 cd
  • docker镜像迁移/移植

    docker镜像迁移 移植 或者docker save 镜像名 版本号 o 路径 保存的包名 tar 通过这两个命令保存保存镜像 xff0c 下载到本地再上传到其他服务器 然后通过docker load lt 保存的包名 tar 完成镜像移
  • 安装并运行VINS-Mono

    0 A Robust and Versatile Monocular Visual Inertial State Estimator VINS Mono是单目视觉惯性系统的实时SLAM框架 它使用基于优化的滑动窗口配方来提供高精度的视觉惯性
  • 使用小觅双目-惯性相机运行VINS-Mono

    步骤 1 下载相机驱动MYNT EYE SDK 2 xff0c 然后make ros xff08 注意 xff1a 前面的Ubuntu安装也要操作 xff09 xff1b 2 安装VINS Mono xff1b 3 在MYNT EYE VI
  • 在TX2上安装VIINS-Mono——问题总结

    1 ceres solver 我们一般通过以下命令安装Eigen xff1a sudo apt get install libeigen3 dev 默认安装在 usr include eigen3 在CMakeList txt中一般用以下语
  • LeGO-LOAM初探:原理,安装和测试

    前言 最近要搞3D激光SLAM xff0c 先后测试了Autoware xff0c cartographer xff0c loam和LeGO LOAM 今天就带来LeGO LOAM的使用体验 Github xff1a https githu
  • IMU噪声标定——加速度计和陀螺仪的白噪声和零偏不稳定性

    前言 imu utils是一个用于分析IMU性能的ROS工具包 参考资料 Allan Variance Noise Analysis for Gyroscopesvectornav gyroscopeAn introduction to i
  • TF坐标变换

    文章目录 TF坐标变换TF功能包TF工具乌龟例程中的TF创建TF广播器创建TF监听器实现乌龟跟随运动 存在的问题总结参考 TF坐标变换 坐标变换是机器人学中一个非常基础 xff0c 同时也是非常重要的概念 机器人本体和机器人的工作环境中往往
  • Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解

    From http blog chinaunix net uid 27213819 id 3810699 html 注 xff1a 为什么要说 目录文件 xff1f 其实在linux中 目录也是一种 文件 xff0c 只是它的内容是上级的
  • 堆栈的工作原理

    声明 xff1a 以下均为个人收集的一些资料 xff0c 非原创 每一个使用c语言的都应该知道栈的重要性 xff0c 我们能够使用C C 43 43 语言写出诸多复杂的程序 xff0c 很大功劳一部分有归于栈的实现 xff0c 因为它可以帮
  • RTK+GPS提高定位精度原理解析(一个小白写给另一个小白系列)

    RTK 43 GPS提高定位精度原理解析 xff08 一个小白写给另一个小白系列 xff09 GPS定位原理回顾RTK基本概念RTK组成RTK传输差分示意RTK数据链接坐标转换RTK应用后记 我们在上一篇文章导航定位系统的原理解析 xff0
  • Python 嵌套函数中内部函数引用外部函数循环变量情况

    Python 嵌套函数中内部函数引用外部函数循环变量情况 Python中的嵌套函数也称为闭包 xff08 Closure xff09 有一个特点就是内部函数可以引用外部函数内的变量并且在外部函数返回后保存该引用变量的值 xff1b 但是如果
  • Git查看版本改动—— git diff

    HEAD 表示当前版本 xff0c 也就是最新的提交 上一个版本就是 HEAD xff0c 上上一个版本就是 HEAD xff0c 往上100个版本写100个 比较容易数不过来 xff0c 所以写成 HEAD 100 HEAD 2 相当于
  • PyQt5编程-鼠标事件

    处理鼠标事件的频率不低于键盘事件 包括按下 松开鼠标按键 xff1b 移动鼠标到特定区域或离开特定区域 xff1b 更改鼠标指针的形状 xff0c 等等 1 按下 松开鼠标按键 按下并释放鼠标按钮时 xff0c 将调用以下方法 xff1a

随机推荐

  • latex 正文设置为双栏,图片如何占两栏

    xff08 1 xff09 插入一栏图片时 xff0c 使用的是 xff1a begin figure end figure 96 xff08 2 xff09 插入双栏图片时 xff0c 需在figure的上标中加入星号 begin fig
  • VIO松耦合和紧耦合对比

    松耦合 xff08 结果级融合 xff09 xff1a 两个独立的运动估计过程中分别处理视觉和惯性测量的信息 xff0c 最终将他们的输出 xff08 位置和姿态 xff09 融合作为结果 紧耦合 xff08 特征级融合 xff09 xff
  • zed2相机运行VINS-mono

    zed2相机标定请参考专栏前面博文 xff01 一 zed2相机运行VINS mono 1 下载VINS mono mkdir p vins ws src cd vins ws src git clone https github com
  • C语言指针笔试题

    1 我们先来看第一段代码和它的输出 span class token keyword int span span class token function main span span class token punctuation spa
  • Gazebo 官网教程学习笔记--Model Editor

    终端打开Gazebo Gui 界面 然后快捷键CTRL 43 M 打开 Model Editor xff0c 或者在edit 下选择model editor 界面如下 1 工具栏 包含用于编辑模型的工具 2 调色板 也称为左面板 有两个选项
  • 《大厂算法面试》小书

    算法面试是大多数小伙伴的弱势 xff0c 但是大厂几乎都会考算法 xff0c 如果在面试过程中不刻意准备一下算法 xff0c 很大概率被挂 其实对于前端和移动端来说 xff0c 算法要求的并不是很高 xff0c 只要把一些常见的算法题刷完
  • ROS通信架构上——Topic和Msg

    Topic 异步通信方式 Node间通过publish subscribe机制通信 相关的命令 xff1a rostopic rostopic list 列出当前所有topicrostopic info topic name 显示某个top
  • Type-C显示器是什么,Type-C显示器的5大优势

    在显示器领域内 xff0c USB Type C接口还处于发展阶段 xff0c 目前已经在新推出的一些高端显示器和旗舰显示器中有配置 USB Type C接口的出现 xff0c 将会形成以显示器为核心的桌面解决方案 xff0c 用户可以把任
  • SLAM综述

    SLAM综述 前言一 概述二 Lidar SLAM激光雷达传感器激光雷达SLAM系统 xff08 Lidar SLAM System xff09 2D SLAM3D SLAM深度学习与激光雷达Feature amp Detection xf
  • VisionPro使用 C# 开发

    VisionPro 常用控件的说明 工具设置窗体 CogPMAlignEditV2 模版匹配设置窗体控件 CogPMAlignEditV2 Subject 工具关联对象 如 xff1a CogPMAlignEditV2 Subject 61
  • rosdep update 失败及解决办法

    一 问题 reading in sources list data from etc ros rosdep sources list d Hit https raw githubusercontent com ros rosdistro m
  • 在STM32上运行ROS节点——rosserial&stm32开发及调试方法

    近期接手了一些ROS机器人项目 xff0c 这里将开发中遇到的问题和解决方法记录下来 stm32强大的外设资源为机器人底层设备控制带来了极大的便利 xff0c 本文简述借助rosserial项目在stm32中运行ROS节点的方法 基本原理
  • 动态存储区、静态存储区、堆和栈的区别

    C c 43 43 程序经过编译连接后形成的二进制映像文件 xff0c 这文件包含 xff1a 栈 xff0c 堆 xff0c 数据段 xff08 只读数据段 xff0c 已经初始化读写数据段 xff0c 未初始化数据段即BBS xff09
  • kubemini-基础使用

    起始 minikube 是一个本地的 k8s 专注于为 k8s 创建一个简单的学习和开发环境 你只需要一个 Docker 或者类似兼容的 容器 xff0c 或者一个虚拟机环境 xff0c k8s 只需要一个单独的命令 xff1a minik
  • 详解信号量和互斥锁之间的区别和联系

    一 xff1a 信号量与互斥锁之间的区别 xff1a 1 xff1a 互斥量用于线程的互斥 xff0c 信号线用于线程的同步 这是互斥量和信号量的根本区别 xff0c 也就是互斥和同步之间的区别 2 xff1a 互斥量值只能为0 1 xff
  • python基础学习(十二)——python中代码的执行顺序以及if __name__ ==‘__main__‘作用和原理

    xff08 1 xff09 代码执行顺序 python程序是顺序执行的 xff0c Python中首先执行最先出现的非函数定义和非类定义的没有缩进的代码 python程序执行时 按照自上而下的顺序 xff1a 首先执行没有缩进的代码 xff
  • c学习--不同c文件中的同名全局变量及同名函数53

    如果在不同的c文件中定义了同名的全局变量 xff0c 则它们会占用相同的内存空间 xff0c 而且编译链接时不会报错 xff01 这可以参考全局变量的内存初始化顺序 对于局部变量而言 xff0c 内存分配的顺序和代码的顺序是一样的 全局变量
  • 基于STM32的FreeRTOS学习之任务基础知识(六)

    记录一下 xff0c 方便以后翻阅 RTOS系统的核心是任务管理 xff0c 初学RTOS系统必须先掌握任务的创建 删除 挂起和恢复等操作 1 什么是多任务系统 玩裸机一般都是在main函数里用while 1 做一个死循环完成所有处理 xf
  • git 推送出现 “fatal: The remote end hung up unexpectedly“ 解决方案

    https blog csdn net qq 41241767 article details 98181952 git 推送出现 34 fatal The remote end hung up unexpectedly 34 解决方案 h
  • 操作系统的设计指导思想——主奴机制

    在学习操作系统的过程中我们会发现一个问题 xff1a 应用程序是应用程序 xff0c 操作系统也是程序 xff0c 操作系统程序凭什么能对应用程序进行组织 管理和协调而不受应用程序损害呢 xff1f 我们认为凭的是特权机制 要想让操作系统做