RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 580262
Accepted
selya
selya
Asked:2020-10-20 00:55:40 +0000 UTC2020-10-20 00:55:40 +0000 UTC 2020-10-20 00:55:40 +0000 UTC

硬件和操作系统功能

  • 772

请澄清一些我将在下面描述的事情。我读了很多关于系统如何启动、硬件执行什么功能、系统做什么的信息,但到目前为止我还不能把全貌加起来。

所以。据我了解,当系统启动时,bios 首先被唤醒。他检查所有硬件,进行诊断。当他确定一切正常时,他从磁盘读取前 512 个(不确定)字节,检查 2 个“魔法”字节,如果他们说这个磁盘是可引导的,那么 bios 开始执行引导加载程序代码,即 . 那510个字节。同时,它并不是立即开始执行,而是将它们写入到RAM中的某个地址后才开始执行。一切似乎都清楚了。以及处理器如何寻址内存——逐页——似乎也很清楚。

现在我不清楚的是:假设我启动了 linux。磁盘加载程序拾取 grub,grub 加载内核,内核开始执行。好的。但是内核如何寻址内存呢?结果直接物理?好吧,即 没有虚拟。然后是另一个问题。事实证明,所有寻址虚拟内存的用户空间代码都在内核的某个“沙箱”中执行,这允许您将虚拟地址转换为物理地址?还是有某种处理器机制?uefi 是如何工作的?

总的来说,我感兴趣的是处理器提供了哪些功能,实际上是一般的硬件,以及在系统级实现了什么,如果可能的话,它为什么这样工作。

是的,处理器如何与视频卡等各种硬件通信,以及它提供哪些接口以编程方式控制该硬件也很有趣。

linux
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Firepro
    2020-10-20T06:40:05Z2020-10-20T06:40:05Z

    下载看似简单,其实是一个非常复杂的多步骤过程,我会尽力向您描述。虽然它看起来像一本小书,但我希望很多人会对它感兴趣。

    你按下了电源按钮

    PS_ON 线接地,所有硬件供电!它活了!. 包括电源。开始测试电源是否符合所有电压要求。如果此操作成功完成,0.1-0.5s 后,会产生 Power Good 信号,表示计算机可以进一步加载。硬盘磁头从停车区出来,其余设备启动…… LETS GO!

    在此处输入图像描述

    电源已经检查过了,下一步是什么?

    此外,复位信号(Reset)被施加到中央处理器的特殊输入端。处理器重置其内存的内容并开始工作。

    处理器的开头是什么?

    系统内存的设计使得处理器在重置后读取的第一个命令位于 BIOS 中。这些是执行自检的说明。POST 程序测试处理器、RAM、芯片组、视频系统、驱动器、电源管理系统、键盘、LPT 和 COM 端口(以及连接到它们的设备)和其他计算机组件。

    POST完成,接下来系统应该做什么?

    POST 程序成功完成后,调用 BIOS INT 19h 软件中断并启动引导扇区搜索程序,其搜索顺序直接在 BIOS 中设置。

    现在让我们寻找引导记录?

    是的,但首先,一些术语,没有它就没有什么可做的:

    扇区——硬盘上存储信息的最小区域,等于512字节; MBR(Master Boot Record) ——主引导记录,它位于磁盘的零扇区,本质上是硬盘的引导扇区;

    进一步地,BIOS从指定的硬盘读取主引导记录MBR并将进一步加载的控制权转移给它。接下来,位于 MBR 中的固件扫描分区表以查找活动的引导分区,找到系统分区后,MBR 将其零扇区加载到计算机内存中并执行其中的代码。分区的引导扇区包含要加载的操作系统的代码。如果硬盘上没有系统分区,BIOS 将显示错误信息。如果找到系统分区,下载将继续。以上所有内容都适用于任何操作系统的启动。

    我要启动 Windows!

    现在,如果您启动 WINDOWS,在完成上述所有操作后,位于系统分区中的 ntldr 引导加载程序会从 boot.ini 引导文件中读取有关操作系统数量及其位置的信息,并提示用户从列表中选择一个操作系统。

    系统选择!

    OK,我们将内核加载到内存中,系统就可以运行了,但是内核是如何管理内存分配的呢?

    什么是内存?

    从逻辑上讲,RAM 是有序的(一维)元素数组。对元素(最小可寻址单元MAE)进行编号,每个MAE的数量是固定的,由存储器件的电路实现决定。系统中实际存在的存储设备的元素编号,称为该元素的地址。每个这样的单元格可以存储一个固定长度的二进制字

    分配内存

    因此,处理器的地址总线正在工作......不,它太长了。在此范围内的字节数。

    如果您为程序生成地址,因为它们位于物理形式中,没有虚拟地址,那么由于一个程序的数据与另一个程序的数据重叠,两个程序的同时执行是根本不可能的。例如,编译器为给定范围的虚拟地址空间生成地址,称为内存管理器的内存管理器将编译器生成的虚拟地址转换为物理内存中位置的地址。编译器不需要知道内核随后将加载可执行程序的内存位置。

    当然,虚拟内存本身并不存储任何东西。 虚拟地址空间只是一种抽象,只是通过某种方式映射到物理内存。虚拟内存到物理内存的映射是通过硬件实现的页表来进行的。硬件部分 直接进行映射,内核管理表及其配置、替换算法等。

    记忆

    内存管理器不是进程!这个设备和它可以在处理器芯片上,也可以在处理器旁边的单独芯片上。

    您转向某个 32 位地址,然后模块将其分为 20 位页面地址和页面内的 12 位偏移量。当程序员甚至不怀疑内存分页组织的存在时,所有这一切都被称为内存透明工作。虽然,有一个带有分段过程的内存分页,在这个过程中程序员需要知道段的存在。

    UEFI

    UEFI 固件代码是用 C 编写的,在现代 64 位模式下运行。事实上,这是一个功能完备的操作系统,可以无限访问“ring 0”资源。PEI 阶段正在进行,DXE 加载前。我认为没有理由在这里描述这一切,这里有一张图片给你:

    UEFI

    资料来源: IBM.com、Habrahabr.ru、Overclockers.ru、Tanenbaum E。“计算机体系结构”

    为了更清楚的了解计算机的运行和你的问题的解决,我加入@AlexanderBlinov的回答,阅读Computer Architecture,一本很有用的书。

    • 9
  2. Alexandr Blinov
    2020-10-20T05:12:49Z2020-10-20T05:12:49Z

    在 StackOverflow 的框架内不可能详细回答你的问题,尽管它很有趣。

    要得到答案,我建议你阅读E. Tanenbaum, T. Austin 的《计算机体系结构》一书。在本书中,您将找到这些问题的答案。

    非常有趣和有用的文学作品。原则上网上有这本书的pdf,不难找到。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5