为了学习操作系统原理我自己写了一个简单的操作系统,取名叫GrapeOS。 GrapeOS是一个x86多任务桌面操作系统,但非常简单,代码只有4千行。 下面我来简单介绍一下GrapeOS。 一、功能介绍 1.桌面 在桌面上可以通过鼠标双击“MyCompuer”来打开资源管理器。 2.资源管理器 资源管理器中显示的是磁盘根目录中的文件列表,可以通过鼠标右键菜单新建文件、重命名文件、删除文件、刷新文件列表。因为文件系统采用FAT16格式,所以文件名都是大写的。 3.打开应用程序 目前只写了“记事本”这一个应用程序,可以直接双击“NOTEPAD.EXE”这个文件打开记事本,也可以双击后缀名是“T...

  GIaGjV6rIOhF   2023年11月01日   66   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 1.开发环境简介 为了减少开发过程中不必要的麻烦,希望大家的开发环境尽量与我的保持一致。我的开发环境如下:Windows10电脑一台VisualStudioCode(最好是最新版)VirtualBox6.0.24CentOS7.9.2009QEMU7.1.0 各软件的作用如下:VisualStudioCode用来编写GrapeOS代码。VirtualBox用来运行CentOS和GrapeOS。CentOS用来编译GrapeOS代码,并使用其它Linux下的工具协助开发。QEMU用来运行和调试GrapeOS。 2.开发环境安装 2.1安...

  GIaGjV6rIOhF   2023年11月01日   52   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在上一讲中我们已经安装配置了开发环境,在本讲中我们来测试一下开发环境是否正常。我们的测试流程如下:1.在VisualStudioCode中编写GrapeOS代码;2.在CentOS中编译GrapeOS代码;3.在QEMU中运行GrapeOS。注意:在本讲中涉及到的代码或操作如有不懂的地方暂时不用管,后面会讲。本讲只是为了测试开发环境是否正常,只要你能跟着做下来就行。下面我们来依次测试这3步流程。 1.在VisualStudioCode中编写GrapeOS代码 1.1在我们上讲中建立的共享文件夹中新建一个名为“grapeos-cou...

  GIaGjV6rIOhF   2023年11月01日   58   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 按一下电脑上的电源按钮,电脑就启动了,不一会儿电脑屏幕上就出现了登录界面或直接进入了桌面。这是一个很日常的场景,但有时候会有个疑问:电脑内部是如何启动的?本讲我们就简单的介绍一下。因为本教程属于入门型,不考虑UEFI等比较新的技术,但不影响对操作系统基本原理的学习。电脑的启动过程在细节上是比较复杂的,但在大的过程上分为以下几个: 上电->BIOS->MBR(boot)->loader->kernel->交互界面(图形/命令行) 上面是一个比较经典的电脑启动过程,可以看到电脑启动过程类似接力赛,下面介绍...

  GIaGjV6rIOhF   2023年11月01日   105   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在大学计算机课程中会学到一个叫冯·诺依曼结构的东西,很多同学当时学的也不是很清楚,也就是记住冯·诺依曼结构中五个部分的名称,能应付考试。主要原因还是当时大家的计算机知识比较少,的确不好深入理解。计算机组成与运行原理和冯·诺依曼结构密切相关,今天我们就来回顾一下冯·诺依曼结构,也许能温故知新。1946年冯·诺依曼提出了计算机的三个基本原则: 计算机硬件由五个部分组成:运算器、控制器、存储器、输入设备和输出设备。 计算机采用二进制。 计算机采用“存储程序”模式。 以上三个基本原则虽然是七十多年前提出的,但现在的计算机仍然沿用这些原则...

  GIaGjV6rIOhF   2023年11月01日   49   0   0 其他技术区

由于GrapeOS目前只支持x86,所以本讲我们简单的介绍一下x86。 百度百科上是这样介绍的:x86泛指一系列基于Intel8086且向后兼容的中央处理器指令集架构。 中央处理器就是我们平时说的CPU,英文全称是CentralProcessingUnit。 有人可能对指令集不是很清楚。计算机的运行过程主要就是CPU执行各种指令的过程,某种CPU能执行的所有指令的集合就叫该种CPU的指令集。但光这么说感觉有点泛泛而谈。其实指令集就是CPU的语言,就像人类的语言,我们可以从横向和纵向分别对比一下。从横向来说,人类的语言有很多种,不同的人群说着不同的语言,但可以用不同的语言来描述同一件事情。同...

  GIaGjV6rIOhF   2023年11月01日   27   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在GrapeOS中会用到2种CPU模式,一种是实模式(realmode),另一种是保护模式(protectedmode)。在本教程中,保护模式特指32位保护模式。这两种模式最主要的不同点是对内存地址的访问方式不同,此外还有其它的不同点。这两者具体的不同之处我们会逐步介绍,本讲我们先来介绍一下实模式。 实模式也叫8086模式。其实几乎所有的x86汇编教程和书籍都会讲实模式,如果没有说是什么模式,一般都是实模式。在第二讲中已经提到学习本教程的前提条件之一是会x86汇编,所以看到本讲的朋友应该是会x86基本汇编的。也就是说大家应该是懂实模...

  GIaGjV6rIOhF   2023年11月01日   36   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 汇编语法主要有两种:Intel语法和AT&T语法。由于大部分介绍x86汇编的书籍和资料用的都是Intel语法,毕竟x86就是Intel发明的,大家学过的x86汇编大概率也是Intel语法,所以GrapeOS的汇编也用Intel语法。 支持Intel语法的x86汇编器不止一种,常见的有MASM和NASM。MASM来自微软公司,只能在微软的操作系统Windows和MS-DOS上用。NASM是开源软件,支持多平台。GrapeOS选用NASM。 下面介绍一下NASM在Linux上的使用1.首次使用需要先安装 yuminstallna...

  GIaGjV6rIOhF   2023年11月01日   58   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 前面我们介绍过电脑的启动过程: 上电->BIOS->MBR(boot)->loader->kernel->交互界面(图形/命令行) 本讲我们要介绍的是MBR(MasterBootRecord,主引导记录)。在电脑中对磁盘的读写是按扇区为基本单位的,一般每个扇区为512个字节。也就是说每读一次磁盘,读取的字节数是512字节的整数倍。同样每写一次磁盘,写入的字节数也是512字节的整数倍。MBR是磁盘的第一个扇区,又叫做主引导扇区,特点是最后2个字节的内容必须是0x55和0xAA。 下面我们来做几个实验来加...

  GIaGjV6rIOhF   2023年11月01日   50   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 写程序不免需要调试,写不同的程序调试方式也不同。如果做应用软件开发,相应的程序调试方式是建立在有操作系统支持的基础上的。而我们现在是要开发操作系统,如何调试操作系统的程序呢?如果操作系统程序直接跑在真机上或虚拟机上(比如VirtualBox)是很难调试的,所以我们在开发阶段操作系统程序主要在虚拟机QEMU上跑,因为QEMU支持调试。当然很多事情都是有利也有弊的,QEMU虽然支持调试,但它的运行效率比VitrualBox要低,所以我们最终的GrapeOS程序是跑在VirtalBox上的。QEMU需要结合GDB才能实现调试,下面我们一起...

  GIaGjV6rIOhF   2023年11月01日   49   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 前面铺垫了这么久,今天终于开始写程序了。本讲将介绍3个逐步深入但非常简单的程序,一方面是让大家熟悉开发流程,另一方面是顺便解决前面遇到的CPU占用率高的问题。 一、mbr1.asm回顾 mbr1.asm的代码之前我们介绍过,这里我们回顾一下代码和演示步骤。mbr1.asm代码如下: ;生成一个空的MBR times510db0;前510个字节全为0 db0x55,0xaa;最后两个字节是0x55和0xaa。 下面我们来演示: 1.启动并登录CentOS 在VirtualBox中启动CentOS虚拟机,并用PowerShell登录到...

  GIaGjV6rIOhF   2023年11月01日   76   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 一、屏幕显示原理 电脑显示器屏幕是由很多很小的像素组成的。每个像素就像是一个小灯泡,在屏幕上一排一排的整齐排列着。只要能控制每个像素的颜色就能显示出各种各样的图形。如果近距离观察过会场或室外的大屏幕会有更直观的感受,这种大屏幕上每个像素就是一个小灯泡。屏幕显示原理大致可以如下表示: CPU(程序)->显卡(显存)->显示器(屏幕) 在程序的控制下,CPU将要显示的数据发送到显卡上的显存(显卡上的内存),显存中的数据和屏幕上的像素是有对应关系的,显卡会不断的从显存中取出数据发给显示器,显示器就会在屏幕上显示出对应的图形。...

  GIaGjV6rIOhF   2023年11月01日   88   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在上一讲中我们介绍了屏幕显示的原理,本讲我们来实战一下。 一、向屏幕输出一个字符mbr4.asm mbr4.asm中的代码如下: ;将屏幕第一行的第一个字符显示为‘G’。 movah,0x07;黑底白字 moval,'G';G的ASCII码是0x47,此时ax的值为0x0747。 movbx,0xb800 moves,bx mov[es:0],ax;文本模式显存地址从0xb8000开始。 stop:;标号 hlt jmpstop times510-($-$$)db0;将从上条指令结束到最后2个字节前的空余字节全部置为0。 db0...

  GIaGjV6rIOhF   2023年11月01日   80   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在上一讲中我们向屏幕打印字符串“GrapeOS”用了十几行汇编代码,如果要输出的字符比较多,这种方法太繁琐了。本讲我们将打印字符串封装成一个函数,使用时就方便多了。 一、mbr7.asm mbr7.asm代码如下: org0x7c00;如果没有该行将无法正确打印要显示的字符串。 ;初始化段寄存器。 movax,cs movds,ax;ds指向与cs相同的段。 movax,0xb800 moves,ax;本程序中es专用于指向显存段。 ;打印字符串:"GrapeOSbootstart."。 movsi,boot_start_str...

  GIaGjV6rIOhF   2023年11月01日   95   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在QEMU中会默认输出一些字符,有时候会干扰我们自己输出的字符。一个比较好的办法是向将屏幕清空,再输出我们想要输出的字符。下面就来学习如何清空屏幕。 一、清空屏幕 其实清空屏幕的原理很简单,就是将屏幕写满空格就行了。下面来实战。mbr8.asm代码如下: ;定义常量(作用和C语言中的define一样) VIDEO_CHAR_MAX_COUNTequ2000;默认屏幕最多显示字符数。 org0x7c00 ;初始化段寄存器 movax,0xb800 moves,ax;本程序中es专用于指向显存段 ;清屏 callfunc_clea...

  GIaGjV6rIOhF   2023年11月01日   58   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 一、外设和I/O接口 前面我们介绍过冯·诺依曼结构包含5部分,其中输入设备和输出设备统称为外部设备,简称外设。常见的外设有鼠标、键盘、显示器、硬盘等。由于外设种类多、差异大、速度慢等原因,导致CPU无法直接与外设沟通。于是在CPU和外设之间产生了“中间人”,这个“中间人”就是I/O接口。如下图: CPU与外设的信息交流都是通过I/O接口来间接实现的。比如我们前面向屏幕输出字符,并不是CPU直接将数据传递给屏幕,而是先传递给显卡,显卡再去操控屏幕。显卡就是一种I/O接口。后面我们将要学习如何读写硬盘,同样CPU无法直接读写硬盘,而是通...

  GIaGjV6rIOhF   2023年11月01日   37   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 一、硬盘控制器 我们前面已经讲过硬盘控制器是一种I/O接口,CPU通过它就能间接的读写硬盘。硬盘控制器主要有IDE和SATA两种,我们这里只考虑IDE控制器。电脑里硬盘控制器有2个,一个叫主控制器,另一个叫从控制器。而每个硬盘控制器能连接两个硬盘,一个叫主盘,另一个叫从盘。所以一般一台电脑里最多能安装4个硬盘。 二、硬盘控制器端口 硬盘控制器上的端口很多,下表中只列出我们可能用到的。 I/O端口号 端口用途 端口位数 主控制器 从控制器 读取操作 写入操作 0x1f0 0x170 Data Data 16 0x1f...

  GIaGjV6rIOhF   2023年11月01日   40   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 本讲我们设计一个简单的读硬盘实验。通过一定的方法使硬盘第二个扇区的前3个字节依次为1、2、3,最后3个字节依次为3、2、1,中间的506个字节全为0。然后通过读硬盘程序将硬盘第二个扇区的数据读取到内存0x7e00-0x7fff的地方,也就是内存中MBR之后的512个字节。最后通过QEMU+DGB调试的方式来查看内存中0x7e00-0x7fff的数据,是否与硬盘第二个扇区中的数据一致,如果一致说明读硬盘成功。本讲代码文件共2个: data1.asm boot1.asm 下面我们开始实验。 一、设置硬盘第二个扇区中的数据 data1...

  GIaGjV6rIOhF   2023年11月01日   40   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 在上一讲中我们学习了用汇编语言读硬盘,本讲我们来学习用汇编语言写硬盘。同样也是设计一个简单的实验,实验内容为: 在内存中准备一段有特征的512字节数据,地址为0x7e000x7fff,其特征是前3个字节依次为4、5、6,最后3个字节依次为6、5、4。然后将该段内存数据写入到硬盘的第2个扇区,并查看虚拟硬盘第2个扇区的数据是否与内存中0x7e000x7fff的数据一致,如果一致则说明写硬盘成功。 本讲代码文件只有一个boot2.asm。boot2.asm代码如下: ;定义常量 DISK_BUFFERequ0x7e00;临时存放数据用...

  GIaGjV6rIOhF   2023年11月01日   67   0   0 其他技术区

学习操作系统原理最好的方法是自己写一个简单的操作系统。 新买的硬盘和优盘在第一次使用时需要格式化,有时候还需要分区。这是为什么呢?分区和格式化到底是干啥呢?本讲将为大家解开这些疑惑。 一、文件系统 1.分区 首先说一下分区,我们平时看到的C盘、D盘等就是一个个分区。硬盘第一个扇区的一部分固定空间叫做分区表,划分分区就是在这个分区表中记录一下各分区的信息,包括各个分区从哪个扇区开始,到哪个扇区结束等。由于GrapeOS所用虚拟硬盘的空间大小只有4MB,没必要分区,所以我们在MBR中也没有填写分区表。 2.格式化 格式化是在某个分区上做的。如果一个盘没有做分区,那就将整个盘作为一个分区看待,...

  GIaGjV6rIOhF   2023年11月01日   155   0   0 其他技术区
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~