前语

本系列博文首要用于第二阶段深入了解的408专业内容考研运用。也便是说在开启本系列之前,最好已经对408有根本的了解。重复的根底概念将不再重复,此外,本系列博文,将一起尽管本系列位操作体系学习系列,可是一起会完结C言语程序设计与数据结构的温习运用。

本系列将结合王道考研为大纲导航,结合《30天克己操作体系》等优秀图书,一步一步将书中的内容进行稳固并运用汇编和C言语完结简略的操作体系设计。在本系列傍边,博主自己也就在不断记录学习进程傍边的内容,因而在系列结束之前,可能还会有许多不精确的部分,请见谅!

此外,本文也是需求根据Intel CPU完结操作,AMD 在这儿 no.

操作体系根本概述

那么在开端之前,咱们先介绍了一下根本的操作体系的概念。首先的话,咱们需求清晰操作体系为咱们供给了什么东西。

首先操作体系为咱们供给了几个根本的办理:

  1. 内存办理
  2. 设备办理
  3. 文件办理
  4. 处理机办理

一起咱们知道,操作体系有几个根本的特性:

  1. 并发
  2. 异步
  3. 虚拟
  4. 共享

假如,没记错的,这个应该便是王道考研里边榜首章节的内容。这儿我就不多说了,书上比我讲得愈加详细。 那么在这儿我更多的是想要做弥补。

中止

操作体系为我供给了程序接口,这个程序接口是由一系列的体系调用构成的,一起关于体系调用,例如读写文件,这个时分,还会触发中止,进行IO操作。这个都是榜首章节的内容,咱们都知道,为什么会触发中止,是由于,这个IO操作是进行了体系等级的,内核等级的调用。那么实际上的话,流程是正确的,可是这个部分的完结其实是非常重要的一个根底。在后面进行实际完结操作体系的细节的时分,咱们将常常说到实模式和保护模型。可是这儿关于中止的话,咱们先不论不论那么多,我仅仅想阐明,这个中止是非常重要的一个机制之一。

此外,值得一提的是,中止是在硬件层次上也是支持的。关于Ring0,1,3 傍边这个其实在CPU傍边是支持的。在咱们的这个保护模式下面,咱们经过DRT将完结对这部分的处理。

与硬件的根本交互

还是那句话,在阅览本文之前,咱们期望你已经对操作体系有了大致了解,在这儿也确实引荐王道考研的操作体系,尽管倾向刷题,可是有些概念解释的还是很不错的,至于其他的是这个系列的博文要描绘的,这儿再次声明。

操作系统学习系列(1.启航)-操作系统基本概念

经过计算机组成原理咱们知道,关于CPU而言,他里边有ALU,CU,运算和逻辑操控单元。一起内部还有许多的寄存器。例如常见的八个寄存器:

AX: 累加寄存器 BX: 基地寄存器 CX:计数寄存器 DX:数据寄存器 SP: 栈针寄存器 BP: 基栈寄存器 SI: 源地址寄存器 DI: 方针地址寄存器 CS: 状态寄存器

(注意,这儿的几个寄存器是2个字节的,一起这个是在实模式下面运用的。实模式下面是16位的,在保护模式下面是32位的)

当然在CPU傍边还有许多寄存器。一起,在这儿有一个非常重要的概念,咱们需求粗犷的知道。在计算机组成原理里边咱们知道,关于不同的设备咱们都是有编址的。咱们对不同设备的操作,其实是经过改变这些地址里边的值来完结的,也便是说,咱们经过寄存器,来访问地址,操作地址的值,咱们就能够完结对根本设备的操控。

当然这儿咱们需求清晰的一点便是。咱们在这儿面大部分的编程工作是经过操控CPU来完结的。当咱们需求操控,例如键盘,屏幕的时分,是经过寄存器,修改里边的数据来操控的。所以说,当咱们在初期完结的时分,需求和汇编进行一定的交互,已完结对硬件的根本操控。当然这儿值得幸亏的是,硬件厂商供给了良好的接口,或许说是Intel和硬件厂商有良好的约定。

根本地址

前面咱们刚刚说到,那便是,咱们经过CPU完结根本的程序操控,一起,咱们经过找到设备地址,然后经过寄存器操作里边对应的值来完结对设备的操控(接下来咱们举一个输出Hello World的比如)

所以,在这儿,咱们清晰一个概念,那便是,计算机的本质其实便是对不同方位的数据进行不同的操作罢了。仅仅咱们经过不同的规定,让计算机呈现出缤纷多彩的世界。比如,一个exe文件是一串二进制代码,一个jpg图片也是,可是他们的作用彻底不同。

因而,咱们清晰了地址的重要性,一起,关于设备也是相似的,设备也有地址,如前面说到,咱们要操控他们就需求经过寄存器操作,而寄存器里边有那个地址,或许数据。因而,为了能正常调用设备,咱们还需求约定一些地址。 比如这个:

操作系统学习系列(1.启航)-操作系统基本概念

地址概念

之后是地址的概念,其实在咱们的操作体系傍边,所运用的都是逻辑地址,一个程序的履行,咱们从物理地址,拉取到数据,然后放在内存傍边,在操作体系傍边有很重要的一点,那便是,咱们需求让应用程序,以为他是在是独占CPU的,从逻辑地址0到逻辑地址100,假设有一个程序是这样写的,那么实际上在物理上他可能是从0x6000 – 0x6545 等等。所以的话,许多考题有一个地址换算的标题。 一起咱们还要知道,cpu在运算的时分呢,咱们是运用二进制的,可是在操作体系表明的时分呢,咱们运用的是16进制。16进制有个好处,榜首它能够很简略表明十进制里边很大的数,一起不会糟蹋太多的空间,之后,16进制转换2进制非常方便。

此外这儿再次强调了,咱们需求先阅览王道考研的操作体系书本,对它有个根本了解,由于,咱们这边其实是和王道考研里边的内容不相同的。实际上,咱们需求先从磁盘开端,从磁盘拉取到咱们的程序,然后加载,等等,直到咱们的操作体系傍边需求处理程序的时分,咱们需求考虑到,多道程序的设计,并发,共享。常常考的pv操作,置换算法,轮换算法等等。

发动流程

这个应该便是在王道考研傍边,榜首章的内容。接下来咱们先简略介绍一下。

首先,在发动的时分,咱们会发动Bios,在bios里边咱们会找到操作体系Boot下面的mbr,然后经过mbr,去加载到咱们的loader程序,之后经过loader去加载到体系内核。那么mbr便是咱们的一个引导。经过,引导,咱们将完结后续的操作。那么问题来了,为什么咱们要先mbr->loader->keneral 原因很简略,在bios里边,给咱们的空间只要512byte,这显然不行一个体系的发动,内核的发动。

所以咱们需求经过这个流程完结发动操作。

他们的大约流程其实便是这样的:

操作系统学习系列(1.启航)-操作系统基本概念

这个进程傍边,咱们将cpu的履行转移到了操作体系

应用程序与操作体系的联系

很好,终于到了这一个我需求弥补的概念了。

咱们直到,一个程序,例如这段程序。

#include<stdio.h>
int main(){
	printf("Hello world");
	return 0;
}

咱们能够将,这段代码编程可履行文件.exe在底层的时分是翻译为bin二进制文件进行履行的。.exe文件将能够在windows体系傍边履行。

那么实际上,咱们知道,操作体系其实本质上便是一个特别的软件,那么假如咱们写的软件,也能够放在BIOS发动的时分,cpu的履行转移到咱们的程序上,那么是不是也意味着,咱们的软件也能够和操作体系相同。实际上,这个叫特别的”操作体系“也是能够的。可是,实际上的情况是,咱们发动软件,还是经过操作体系完结的,而不是刚刚说到,假如是刚刚说的那个样子的话,那么操作体系似乎也没啥作用了。

那么实际上一个程序完整的程序(win)是这样的:

操作系统学习系列(1.启航)-操作系统基本概念
所以说,咱们假如想要完结一下咱们的操作体系的话,咱们必须要供给对应的程序依靠接口,是的,咱们还需求界说咱们的操作体系的可履行文件。这个其实和浏览器很想,咱们的一个个程序,其实相当于一个个网页,网页里边的程序需求依靠浏览器展现作用,经过v8引擎完结解析。同样的咱们的操作体系也是相同的。

那么回到咱们刚刚的程序。 咱们经过C言语完结输出”Hello Word“ 是如此简略。 实际上,咱们是调用了 stdio.h 相当于python的包是吧,它里边供给了输出的函数,而输入输出,咱们知道这个是需求体系调用的,因而,咱们操作体系层面是需求完结的。由于,应用程序,是没有这个权限的,只要咱们操作体系有。

那么假如咱们要从屏幕上输出一句话,咱们在底层完结是很费事的,一起,在完结的时分,咱们不能调用任何体系完结,也便是printf() 这种函数,而是需求经过汇编完结相似这一的代码:

(是的这个便是咱们前面说的输出内容,咱们找到了xb800,这个是平面显现器的地址)

mov ax,0xb800               ;在bios傍边将指针指向文本显现地方
mov es,ax
mov byte [es:0x00],'L'      ;找到的文本显现的地址,然后写入内容
mov byte [es:0x01], 0x07    ;设置颜色
mov byte [es:0x02],'Y'
mov byte [es:0x03], 0x06
time 510 - ($-$$) db 0      ;填充剩余的空间,引导区是512
dw 0xaa55                   ;以这个结束才会别biso辨认

Hello World发动

很好,咱们弥补完了和王道不太相同的内容。当然这儿惋惜的是受限于篇幅,这儿对应汇编部分的代码不进行解说。可是《30天克己操作体系》这本书上对应汇编的解释我觉得非常棒,尽管那本书上运用的是ask汇编,其实那也是nasm自界说版本,大体上是共同的和汇编。

那么现在,咱们开端榜首个hello word ,这儿的话,咱们就不按照书上的来了,而是运用相似计划 。

首先,咱们开端编写榜首个发动程序,这个便是咱们的mbr .

org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DD
jmp $
DD:
	mov ax,BOOTMSG
	mov bp,ax
	mov cx,16
	mov ax,01301h
	mov bx,000ch
	mov dl,0
	int 10h
	ret
BOOTMSG:	db "hello, OS World!"
times 510-($-$$)	db 0
dw 0xaa55

然后,此刻咱们需求将这段代码进行编译。

再次之前你需求自己准备好nasm

操作系统学习系列(1.启航)-操作系统基本概念
此刻咱们完结了编译。之后咱们还需求创立一个虚拟硬盘,接下来咱们将在虚拟机上发动。
操作系统学习系列(1.启航)-操作系统基本概念

之后的话,咱们将”榜首个操作体系“写入到磁盘傍边。

操作系统学习系列(1.启航)-操作系统基本概念

之后咱们创立虚拟机即可,我这儿运用的是virtual Box

之后点击发动,即可完结榜首个Hello OS World

总结

本文仅仅作为,一个博主的随笔,后期才会进行完整的弥补,当然,实际上,对应考研党而言,刷题愈加重要,这个作为实操加分项。此外,博主默许,读者与博主水平相似。