从零实现一个操作系统(一)

操作系统实战笔记(一)

操作系统是计算机的核心软件

  • 操作系统是所有软件的基础,所有上层软件都要依赖于操作系统提供的各种机制,才能运行。
    • 后端工程师在做高性能服务端编程的时候,内存、进程、线程、I/O 相关的知识会经常用到。还有,在做一些前端层面的性能调优时,操作系统相关的一些知识更是必不可少。
    • 除了 Web 开发,做高性能计算超级计算机的时候,操作系统内核相关的开发能力也至关重要。其实,即使单纯的操作系统内核相关的开发能力,对于工程师来说也是绕不过的基本功。
  • 除了工作,操作系统离我们的生活也并不遥远,甚至可以说是息息相关。要知道,操作系统其实不仅仅局限于手机和电脑,你的智能手表、机顶盒、路由器,甚至各种家电中都运行着各种各样的操作系统。

程序的运行过程:从代码到机器运行

第一版 Hello World

#include "stdio.h"
int main(int argc, char const *argv[])
{
  printf("Hello World!\n");
  return 0;
}
  • 计算机硬件是无法直接运行这个 C 语言文本程序代码的,需要 C 语言编译器,把这个代码编译成具体硬件平台的二进制代码。
  • 再由具体操作系统建立进程,把这个二进制文件装进其进程的内存空间中,才能运行。

程序编译过程

  • 使用命令:gcc HelloWorld.c -o HelloWorld 或者 gcc ./HelloWorld.c -o ./HelloWorld,就可以编译这段代码。
  • GCC 只是完成编译工作的驱动程序,它会根据编译流程分别调用预处理程序编译程序汇编程序链接程序来完成具体工作。
    • HelloWorld 编译流程如下:
      从零实现一个操作系统(一)_第1张图片
    • HelloWorld 研究中间过程
      • 预处理
        • 加入头文件,替换宏。
        • gcc HelloWorld.c -E -o HelloWorld.i
      • 编译
        • 包含预处理,将 C 程序转换成汇编程序。
        • gcc HelloWorld.c -S -c -o HelloWorld.s
      • 汇编
        • 包含预处理和编译,将汇编程序转换成可链接的二进制程序。
        • gcc HelloWorld.c -c -o HelloWorld.o
      • 链接
        • 包含以上所有操作,将可链接的二进制程序和其它别的库链接在一起,形成可执行的程序文件。
        • gcc HelloWorld.c -o HelloWorld

程序装载执行

  • 冯诺依曼体系结构:
    • 根据冯诺依曼体系结构构成的计算机,必须具有如下功能:
      • 把程序和数据装入到计算机中;
      • 必须具有长期记住程序、数据的中间结果及最终运算结果;
      • 完成各种算术、逻辑运算和数据传送等数据加工处理;
      • 根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;
      • 能够按照要求将处理的数据结果显示给用户。
    • 为了完成上述的功能,计算机必须具备五大基本组成部件:
      • 装载数据和程序的输入设备
      • 记住程序和数据的存储器
      • 完成数据加工处理的运算器
      • 控制程序执行的控制器
      • 显示处理结果的输出设备

实现一个最简单的内核(理论篇)

PC 机的引导流程

  • 我们学习操作系统的时候,不妨撇开其它现有的操作系统,基于硬件,写一个最小的操作系统——Hello OS,直观感受一下。
  • 写操作系统要用汇编和 C 语言,尽管这个 Hello OS 很小,但也要用到两种编程语言。
  • 为了大大降低我们开始的难度,也不至于打消热情,我们不打算从 PC 的引导程序开始写起,而是先借用一下 GRUB 引导程序,只要我们的 PC 机上安装了 Ubuntu Linux 操作系统,GRUB 就已经存在了。
  • Hello OS 的引导流程如下:
    从零实现一个操作系统(一)_第2张图片
    • PC 机 BIOS 固件是固化在 PC 机主板上的 ROM 芯片中的,掉电也能保存。
    • PC 机上电后的第一条指令就是 BIOS 固件中的,它负责检测和初始化 CPU内存主板平台,然后加载引导设备(大概率是硬盘)中的第一个扇区数据到 0x7c00 地址开始的内存空间,再接着跳转到 0x7c00 处执行指令。
    • 这就是 GRUB 引导程序。

Hello OS 引导汇编代码

  • C 作为通用的高级语言,不能直接操作特定的硬件,而且 C 语言的函数调用、函数传参,都需要用栈。
  • 栈就是数据满足后进先出特性的一块内存空间,它由 CPU 特定的栈寄存器指向,所以我们要先用汇编代码处理好 C 语言的工作环境。

你可能感兴趣的:(操作系统,c语言,linux)