jjzjj

自己动手从零写桌面操作系统GrapeOS系列教程——11.MBR介绍

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

自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试

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

自己动手从零写桌面操作系统GrapeOS系列教程——12.QEMU+GDB调试

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

自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序

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

自己动手从零写桌面操作系统GrapeOS系列教程——13.向MBR中写入程序

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

自己动手从零写桌面操作系统GrapeOS系列教程——18.外设和IO

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

自己动手从零写桌面操作系统GrapeOS系列教程——18.外设和IO

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

自己动手从零写桌面操作系统GrapeOS系列教程——16.封装打印字符串函数

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

自己动手从零写桌面操作系统GrapeOS系列教程——16.封装打印字符串函数

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

自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕

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