zoukankan      html  css  js  c++  java
  • [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 -- 返回读出数据长度 

     

  • 相关阅读:
    Git 常用命令大全-转载
    Powershell重命名文件夹
    C#使用qq邮箱发送邮件
    iOS开发-YUV颜色格式
    iOS开发小记(十一)
    iOS开发-AFNetworking
    iOS开发-NSURLSession
    iOS开发-类的加载load函数和initialize函数
    iOS开发-调试(debug)
    iOS开发-graphics
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12416894.html
Copyright © 2011-2022 走看看