跳至主要內容
老李教你写操作系统 0x03 - 显卡驱动

今天的目标:写个“显卡驱动”,实际上就是实现一个printf函数。在平时的开发中,我们可以使用标准库给我们提供的printf进行打印输出,不得不说,这个函数应该是最简洁有力的调试工具。但是我们现在要开发操作系统,完全从零开始,这就意味着,我们必须自己实现一个printf函数,方便我们查看各种信息和状态。

在上一篇文章中我们已经抽取出了一个cprintf函数用于打印输出,但这还是太简陋了,今天我们给它加点功能,以满足我们的需求。

要实现的功能有两点:


未央大约 8 分钟操作系统操作系统显卡驱动
老李教你写操作系统 0x02 - Hello World v2

目标

今天的目标:规范化开发流程。

上一篇文章中,出于简洁的考虑只使用了一个.c文件来做说明。后续的开发中代码会越来越多,一个文件肯定是不够的,今天我们将代码做一下简单的拆分,以便更好的扩展。

代码拆分

先把之前的源文件kernel.c贴出来:


未央大约 2 分钟操作系统操作系统QEMUGRUBmultiboot
调试引导扇区

调试是软件开发过程中重要的一个环节。通常我们开发的软件是运行在操作系统之上的,调试器也运行在操作系统之上,加之大多数集成开发环境对调试器的集成非常完美,所以我们调试软件的时候非常轻松。但是如果是开发操作系统呢?操作系统该如何调试?今天老李结合代码教大家操作系统启动过程中的第一个步骤 -- 引导扇区的调试。

开发环境如下:

  • 系统:Ubuntu 18.04.4 LTS
  • 汇编器:GNU as (GNU Binutils for Ubuntu) 2.30
  • 调试器:GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
  • 虚拟机:QEMU emulator version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.21)
  • 引导扇区代码:boot.s

未央大约 5 分钟汇编语言操作系统引导扇区调试Boot SectorsDebugGDB
老李教你写操作系统 0x01 - Hello World

前言

这还得从一只蝙蝠说起。

讲道理这篇文章的题目很不合理。作为一个计算机人,第一篇文章起码应该是0x00吧?这是对计算机最起码的尊重。原本打算在这篇文章之前写一篇关于汇编和硬件基础知识的介绍(以后补上)。虽然汇编和硬件很简单,但是一上来就讲这些简单的知识难免会让人觉得枯燥,因而影响学习的积极性是得不偿失的。索性先写个操作系统找找感觉,以此建立学习的兴趣,未尝不是一件好事。

搞计算机这一行,万事离不了个Hello World。现在开始就带领大家实现一个操作系统版的Hello World


未央大约 7 分钟操作系统操作系统QEMUGRUBmultiboot
老李教你写操作系统 0x00 - bootloader

今天开始,我们来学习操作系统的开发。

前置知识

你需要一点汇编语言的知识,老李为此专门写了一个系列文章,算是要用到的基础知识。按逻辑上来讲,本文是接着汇编语言系列的最后一篇文章来写的,那篇文章已经实现了一个操作系统的bootloader,本文只是对其做了规范化


未央大约 10 分钟操作系统操作系统QEMUGRUBmultiboot