[OS] 操作系统课程(五)
系统启动
- 启动过程
- CPU加电稳定后从0XFFFF0读取第一条指令
- BIOS
- 固化到计算机主板上的程序
- 包括系统设置、自检程序和系统自启动程序
- 系统加电后读BIOS
- 加电自检POST,内存、显卡等关键部件是否在工作
- 更新CMOS中的扩展系统配置数据ESCD
- 按指定启动顺序从软盘、硬盘或光驱启动
- 主引导记录BIOS-MBR
- 全局唯一标识分区表BIOS-GPT(多分区启动)
- 将加载程序从从磁盘的引导扇区加载到内存
- UEFI
- 在所有平台上一致的操作系统启动服务
- 加载程序
- 依据配置加载操作系统内核
- 将操作系统的代码和数据从硬盘加载到内存中
- 跳转到操作系统的起始地址
中断、异常和系统调用
- 为什么需要
- 计算机运行中,内核是被信任的第三方
- 只有内核可以执行特权使用
- 与外设交互
- 处理应用程序意想不到的行为
- 为应用程序提供系统服务
- 内核的进入与退出
- 中断、异常、系统调用
- 应用程序调用函数库,通过系统调用接口进入内核
- 系统调用(system call)
- 源头:应用程序主动向操作系统发出的服务请求
- 响应方式:异步或同步
- 处理机制:等待和持续
- 异常(exception)
- 源头:非法指令或其他原因导致当前指令执行失败(如内存出错)后的处理请求
- 响应方式:同步
- 处理机制:杀死或重新执行意想不到的应用程序指令
- 中断(hardware interrup)
- 源头:来自硬件设备的处理请求
- 响应方式:异步
- 处理机制:持续,对用户应用程序是透明的
- 中断处理机制
- 硬件
- CPU初始化时设置中断使能标志
- 依据内部或外部时间设置中断标志
- 依据中断向量调用相应中断服务例程
- 软件
- 现场保存(编译器)
- 中断服务处理(服务例程)
- 中断向量表接收
- 中断->设备驱动
- 异常->异常服务例程
- 系统调用->系统调用表
- 清除中断标记(服务例程)
- 现场恢复(编译器)
- 硬件
- 中断嵌套
- 硬件中断服务例程可被打断
- 中断源不同的,根据优先级高低处理
- 可在一段时间里禁止其他中断请求
- 中断请求会保持到CPU做出响应
- 异常服务例程可被打断
- 异常执行时可能出现硬件中断
- 异常服务例程可嵌套
- 异常服务例程可能出现缺页
- 硬件中断服务例程可被打断
- 系统调用
- 应用程序调用printf()时,会触发到系统调用write()
- 操作系统服务的编程接口
- 通常由高级语言编写(C或C++)
- 程序通过标准库API接口而不是直接进行系统调用
- 三种最常用应用程序编程接口(API)
- Win32 API 用于Windows
- POSIX API 用于UNIX、Linux、MAC OS X
- Java API 用于JAVA虚拟机(JVM)
- 系统调用实现
- 每个系统调用对应一个系统调用号,系统调用接口根据系统调用号来维持表的素索引
- 系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
- 用户不需要知道系统调用的实现,需要设置调用参数和获取返回结果
- 系统调用和函数调用的不同
- 系统调用使用INT和IRET,执行时有堆栈切换和特权级的转换
- CALL和RET用于常规调用,执行时没有堆栈切换
- Intel 64 and IA-32 指令集
- 中断、异常和系统调用的开销
- 开销超过函数调用
- 引导机制
- 建立内核堆栈
- 验证参数
- 内核态映射到用户态的地址空间,更新页面映射权限
- 内核态独立地址空间,TLB
- 开销超过函数调用
- 文件复制过程中的系统调用序列
- ucore中库函数read()的功能是读文件
- read()的参数和返回值
- int fd -- 文件句柄
- void * buf -- 数据缓冲区指针
- int length -- 数据缓冲区长度
- int return_value -- 返回读出数据长度
- 系统调用实现
[OS] 操作系统课程(五)的更多相关文章
- [OS] 操作系统课程(三)
工具 源码阅读:understand 源码文档自动生成工具:Doxygen 编译环境:gcc 运行环境:x86机器或QEMU 调试工具:QEMU+(GDB or IDE) IDE:Eclipse-CD ...
- solr与.net系列课程(五)solrnet的使用
solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们来学下一下solr的.net客户端solrnet 出处 ...
- Bryce1010的操作系统课程设计
https://download.csdn.net/download/fire_to_cheat_/10221003 上面是课程设计的代码,下载需要一些积分. 1.作业调度 2.磁盘调度 常见的磁盘调 ...
- Oracle 课程五之优化器和执行计划
课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划 ...
- Android灭亡论之Firefox OS操作系统出现
今天是2014年7月1日,过几天就要到深圳实训去了,实训核心内容是Android开发.尽管Android现在很火,但作为程序猿的我们必须时刻保持清醒的头脑.我虽不是什么预言家,但近期接触的Androi ...
- 课程五(Sequence Models),第三周(Sequence models & Attention mechanism) —— 2.Programming assignments:Trigger word detection
Expected OutputTrigger Word Detection Welcome to the final programming assignment of this specializa ...
- 清华大学OS操作系统实验lab1练习知识点汇总
lab1知识点汇总 还是有很多问题,但是我觉得我需要在查看更多资料后回来再理解,学这个也学了一周了,看了大量的资料...还是它们自己的80386手册和lab的指导手册觉得最准确,现在我就把这部分知识做 ...
- [OS] 操作系统常考知识点
转自:http://jennica.space/2017/03/21/os-principle/ 大纲如下: 1.操作系统概述2.操作系统运行环境3.进程线程模型4.处理器调度5.同步机制6.存储模型 ...
- ucore操作系统学习(五) ucore lab5用户进程管理
1. ucore lab5介绍 ucore在lab4中实现了进程/线程机制,能够创建并进行内核线程的调度.通过上下文的切换令线程分时的获得CPU,使得不同线程能够并发的运行. 在lab5中需要更进一步 ...
随机推荐
- Vue3教程:Vue 3 + Element Plus + Vite 2 的后台管理系统开源啦
之前发布过一篇文章<Vue3教程:开发一个 Vue 3 + element-plus 的后台管理系统>,文中提到会开发并开源一个 Vue 3 + Element Plus 的项目供大家练手 ...
- Java利用线程工厂监控线程池
目录 ThreadFactory 监控线程池 扩展线程池 扩展线程池示例 优化线程池大小 线程池死锁 线程池异常信息捕获 ThreadFactory 线程池中的线程从哪里来呢?就是ThreadFoct ...
- 深度学习---1cycle策略:实践中的学习率设定应该是先增再降
深度学习---1cycle策略:实践中的学习率设定应该是先增再降 本文转载自机器之心Pro,以作为该段时间的学习记录 深度模型中的学习率及其相关参数是最重要也是最难控制的超参数,本文将介绍 Lesli ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- 史上最全jdk新特性总结,涵盖jdk8到jdk15!
前言 在本文中,我将描述自第8版以来Java最重要且对开发人员友好的功能.为什么会有这样的主意?在Web上,您可以找到许多文章,其中包含每种Java版本的新功能列表.但是,由于缺少文章,因此无法简要概 ...
- 结对编程_stage1
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目-第一阶段 我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法.敏捷开发方法. ...
- “改造” VS Code 编辑器,一起写个插件吧!
作者:HelloGitHub-小夏(首发于 HelloGitHub 公众号) 作为一个靠代码作为"生计"的开发者,bug 写的好不好,编辑器真的很重要!那么 Visual Stud ...
- C语言-内存函数的实现(一)之memcpy
C语言中的内存函数有如下这些 memcpy memmove memcmp memset 下面看看memcpy函数 memcpy 我们想想,之前有那个字符串拷贝的函数,即strcpy函数.都有拷贝的函数 ...
- 15个问题告诉你如何使用Java泛型
摘要:Java泛型其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java ...
- 数据结构(2):单链表学习使用java实现
单链表是单向链表,它指向一个位置: 单链表常用使用场景:根据序号排序,然后存储起来. 代码Demo: package com.Exercise.DataStructure_Algorithm.Sing ...