操作系统真象还原:一些你可能正感到迷惑的问题

news2024/12/26 23:42:47

第0章-一些你可能正感到迷惑的问题

这是我看操作系统真象还原这本书的一些记录:

4 软件是如何访问硬件的

硬件在输入输出上大体分为串行和并行,相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信,反过来也是, CPU 通过串行接口与串行设备数据传输。并行设备的访问类似,只不过是通过并行接口进行的。

访问外部硬件有两个方式:

  1. 将某个外设的内存映射到一定范围的地址空间中, CPU 通过地址总线访问该内存区域时会落到外设的内存中,这种映射让 CPU 访问外设的内存就如同访问主板上的物理内存一样。例如显存:它被映射到主机物理内存上的低端 1MB 的0xB8000~0xBFFFF。CPU 访问这片内存就是访问显存,住这片内存上写字节便是往屏幕上打印内容。
  2. 外设是通过 IO 接口与 CPU 通信的, CPU 访问外设,就是访问 IO 接口,由 IO 接口将信息传递给另一端的外设,也就是说, CPU 从来不知道有这些设备的存在,它只知道自己操作的 IO 接口。

5 应用程序是什么,和操作系统是如何配到一起工作的

编译器提供了一套库函数,库函数中又有封装的系统调用,这样的代码集合称之为运行库。 C 语言的运行库称为 C 运行库,就是所谓的 CRT。

应用程序加上操作系统提供功能才算是完整的程序

7 内存访问为什么要分段

CPU 采用 “段基址+段内偏移地址”的形式访问内存,就需要专门提供段基址寄存器,这些是 cs 、 ds 、es 等

程序分段又是为了将大内存分成可以访问的小段,通过这样变通的方法便能够访问到所有内存了

8 代码中为什么分为代码段、数据段?

首先,程序不是一定要分段才能运行的,分段只是为了使程序更加优美 。

x86 平台的处理器是必须要用分段机制访问内存的,正因为如此,处理器才提供了段寄存器,用来指定待访问的内存段起始地址。

分段是必然的,只是在平坦模型下,硬件段寄存器中指向的内存段为最大的 4GB ,而在多段模式下编程,硬件段寄存器中指向的内存段大小不一 。

对于在代码中的分段,有的是操作系统做的,有的是程序员自己划分的 。 如果是在多段模型下编程 ,我们必然会在源码中定义多个段,然后需要不断地切换段寄存器所指向的段,这样才能访问到不同段中的数据,所以说,在多段模型下的程序分段是程序员人为划分的。如果是在平坦模型下编程,操作系统将整个 4GB 内存都放在同一个段中,我们就不需要来回切换段寄存器所指向的段 。 对于代码中是否要分段,这取决于操作系统是否在平坦模型下

由于处理器支持了具有分页机制的虚拟内存,操作系统也采用了分页模型,因此编译器会将程序按内 容划分成代码段和数据段,如编译器 gcc会把 C 语言写 出的程序划分成代码段、数据段、栈段、 .bss 段、堆等部分 。 这会由操作系统将编译器编译出来的用户程序中的各个段分配到不同的物理内存上 。 对于目前咱们用高级语言编码来说,我们之所以不用关心如何将程序分段,正是由于编译器按平坦模型编译,而程序所依赖的操作系统又采用了虚拟内存管理,即处理器的分页机制。

这就是 Intel 处理器的程序计数器 es: eip能够自动获得下一条指令的原理,即将当前 eip 中的地址加上当前指令机器码的大小便是内存中下一条指令的起始地址 。 即使指令间有空隙或其他非指令的数据,这也仅仅是在物理上将其断开了,依然可以用 jmp指令将非指令部分跳过以保持指令在逻辑上连续

为了让程序内指令接连不断地执行,要把指令全部排在一起,形成一片连续的指令区域,这就是代码段 。 把数据连续地并排在一起存储形成的段落,就称为数据段。

  1. 编译器负责挑选出数据具备的属性,从而根据属性将程序片段分类,比如,划分出了只读属性的代码段和可写属性的数据段。
  2. 操作系统通过设置 GOT 全局描述符表来构建段描述符,在段描述符中指定段的位置、大小及属性(包括 S字段和 TYPE 字段)。也就是说,操作系统认为代码应该是只读的,所以给用来指向代码段的那个段描述符设置了只读的属性,这才是真正给段添加属性的地方。
  3. CPU中的段寄存器提前被操作系统赋予相应的选择子从而确定了指向的段。在执行指令时,会根据该段的属性来判断指令的行为,若有返回则发出异常。

9 物理地址、逻辑地址、有效地址、线性地址、虚拟地址

物理地址就是物理内存真正的地址,相当于内存中每个存储单元的门牌号,具有唯一性。在实模式下,“段基址+段内偏移地址”经过段部件的处理,直接输出的就是物理地址, CPU可以直接用此地址访问内存 。

而在保护模式下,"段基址+段内偏移地址”称为线性地址,不过,此时的段基址已经不再是真正的地址了,而是一个称为选择子的东西 。它本质是个索引,类似于数组下标,通过这个索引便能在 GDT中找到相应的段描述符,在该描述符中记录了该段的起始、大小等信息,这样便得到了段基址。若没有开启地址分页功能, 此线性地址就被当作物理地址来用,可直接访问内存。 若开启了分页功能,此线性地址又多了一个名字,就是虚拟地址

无论在实模式或是保护模式下,段内偏移地址又称为有效地址,也称为逻辑地址,这是程序员可见的地址 。

在这里插入图片描述

11 什么是平坦模式

平坦模型是相对于多段模型来说的,所以说平坦模型指的就是一个段 。

12 寄存器

  1. CS一代码段寄存器( Code Segment Register),其值为代码段的段基值
  2. DS一数据段寄存器( Data Segment Register),其值为数据段的段基值。
  3. ES一附加段寄存器( Extra Segment Register),其值为附加数据段的段基值,称为“附加”是因为此段寄存器用途不像其他 sreg 那样固定,可以额外做他用。
  4. FS一附加段寄存器( Extra Segment Register ),其值为附加数据段的段基值,同上,用途不固定,使用上灵活机动。
  5. GS一附加段寄存器( Extra Segment Register),其值为附加数据段的段基值。
  6. SS一堆枝段寄存器( Stack Segment Register),其值为堆栈段的段值。

在实模式下, CS 、 DS 、 ES 、 SS 中的值为段基址,是具体的物理地址,内存单元的逻辑地址仍为“段基值:段内偏移量”的形式。在保护模式下,装入段寄存器的不再是段地址,而是“段选择子” ( Selector),当然,选择子也是数值,其依然为 16 位宽度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1715351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

antd table列选中效果实现

前言 开发中有一个需要呈现不同时间点各个气象要素的值需求,我觉得一个table可以实现这类数据的展示,只是因为时间点时关注的重点,所以需要列选中效果,清晰的展示时间点下的要素数据。我选择的是antd的table组件,这个…

每日复盘-20240529

20240529 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------301361--------- 众智科技 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------300637--------- 扬帆新材 二日涨幅最大: ------1--------30…

【busybox记录】【shell指令】rmdir

目录 内容来源: 【GUN】【rmdir】指令介绍 【busybox】【rmdir】指令介绍 【linux】【rmdir】指令介绍 使用示例: 删除空目录 - 默认 删除dirname下的所有空目录,包括因删除其他目录而变为空的目录 常用组合指令: 指令不…

数据结构(七)查找

2024年5月26日一稿(王道P291) 7.1 查找的基本概念 7.2 顺序查找和折半查找 7.2.1 顺序查找 7.2.2 折半查找 7.2.3 分块查找 7.3 树形查找 7.3.1 二叉排序树(BST) 7.3.2 平衡二叉树 7.4 B树和B树 7.4.1 B树及其基本操作 7.4.2 B树的基本概念 7.5 散列&…

UVa11604 General Sultan

UVa11604 General Sultan 题目链接题意分析AC 代码 题目链接 UVA - 11604 General Sultan 题意 给出一些0和1组成的模式串,问是否存在一个串使得有多种方案将这个串分解成模式串。    给一个包含n(n≤100)个符号的二进制编码方式&#xff…

HTTP Digest Access Authentication Schema

HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schema&#xff…

Spring创建对象的多种方式

一、对象分类 简单对象:使用new Obj()方式创建的对象 复杂对象:无法使用new Obj()方式创建的对象。例如: 1. AOP创建代理对象。ProxyFactoryBean; 2. Mybatis中的SqlSessionFactoryBean; 3. Hibernate中的SessionFactoryBean。二、创建对象方…

MFC工控项目实例一主菜单制作

1、本项目用在WIN10下安装的vc6.0兼容版实现。创建项目名为SEAL_PRESSURE的MFC对话框。在项目res文件下添加相关256色ico格式图片。 2、项目名称:密封压力试验机 主菜单名称: 系统参数 SYS_DATA 系统测试 SYS_TEST 选择型号 TYP_CHOICE 开始试验 TES_STA…

内存函数<C语言>

前言 前面两篇文章介绍了字符串函数,不过它们都只能用来处理字符串,C语言中也内置了一些内存函数来对不同类型的数据进行处理,本文将介绍:memcpy()使用以及模拟实现,memmove()使用以及模拟实现,memset()使用…

越来越多的连锁企业选择开源连锁收银系统

连锁企业的收银系统作为其信息化的基础,随着运营的复杂化,越来越多的连锁企业选择开源连锁收银系统来满足其日常经营需要。商淘云为大家分享连锁企业选择开源连锁收银系统的三大原因,大家点赞收藏。 首先是灵活性和定制性强,连锁企…

k210数字识别 笔记2 (串口通信)

这个模型识别的还可以,离近点 识别率高达0.9 资源: 链接:https://pan.baidu.com/s/1D4ubJGMptqop1x_Nf8KqfQ?pwd1234 提取码:1234 一:报错解决 报错的意思应该是模型文件错误 原程序可以在sd卡运行,但…

stm32学习-CubeIDE使用技巧

1.hex文件生成 右键工程 2.仿真调试 3.常用快捷键 作用快捷键代码提示alt/代码注释/反注释ctrl/ 4.项目复制 复制项目,将ioc文件名改为项目名即可图形化编辑

刷爆leetcode第六期

题目一 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。 int pop() 移除…

华为昇腾310 ATC模型转换工具安装

参考: https://bbs.huaweicloud.com/blogs/393282?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0004.html 1、基本工具…

idm软件是做什么的 IDM是啥软件 idm软件怎么下载 idm软件怎么下载

一、IDM是啥软件 IDM 是由美国 Tonec 公司开发的 Windows 软件,该软件最初于 2005 年发布。IDM全称Internet Download Manager,是一款Windows平台老牌而功能强大的下载加速器,专注于互联网数据下载。这款软件是一款不错的轻量级下载工具&…

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接:loading 截稿时间:9月15日 检索:EI检索 一、会议信息 大会官网:www.ciotsc.org 会议地点:湖南株洲 会议时间:2023年11月15日-17日 二、征稿主…

Strust2 远程代码执行漏洞[s2-005]

漏洞复现环境搭建请参考 http://t.csdnimg.cn/rZ34p kali切换jdk版本请参考 Kali安装JAVA8和切换JDK版本的详细过程_kali安装jdk8-CSDN博客 漏洞原理 Strust2会将http的每个参数名解析成为OGNL语句执行,OGNL表达式通过#来访问Struts的对象,并且通过过…

光耦的工作原理

一、光电耦合器简介 光电耦合器主要是一种围绕光作为媒介的光电转换元器件,能够实现光到电、电到光之间的自由转换。我们又可以称之为光电隔离器,之所以这么称呼,主要是因为光电耦合器能够很好的对电路中的电信号起到隔离的作用。有效的保护…

C语言 指针——指针变量做函数参数

目录 指针变量的解引用 为什么要用指针变量做函数参数? 演示Call by value 指针变量的解引用 为什么要用指针变量做函数参数? 演示Call by value

民国漫画杂志《时代漫画》第32期.PDF

时代漫画32.PDF: https://url03.ctfile.com/f/1779803-1248635561-0ae98a?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!