首页 > 其他分享 >一个操作系统的设计与实现——第1章 什么是操作系统

一个操作系统的设计与实现——第1章 什么是操作系统

时间:2023-11-12 09:57:23浏览次数:37  
标签:&& 操作系统 配置文件 实现 make -- bochs 设计

1.1 引言

什么是操作系统呢?

有些读者可能会像曾经的笔者一样,认为操作系统是"一种图形界面";在学习了Linux操作系统后,认为操作系统也可以是"一种命令行"。而不同种类,不同版本的操作系统,则是"不同的图形界面",或是"不同的命令行语法"。

那么,以Linux操作系统为例,读者是否想过这些问题呢?

  • 为什么输入ls命令,屏幕上就显示了文件列表?
  • 什么是"文件"?
  • 为什么在键盘上按一下l键,屏幕上就会显示一个字母l,而不是别的字母,或者没反应?s键也是一样
  • 计算机怎么知道键盘被按下了?又怎么知道按的是什么键?
  • 怎么在屏幕上显示一个字符?

这一系列越来越底层的问题乍一看都问的莫名其妙,尤其是最后一个:学过C语言的读者都知道,用C语言的printf函数,不就行了吗?

那么,printf函数又是怎么实现的呢?

看来,事情并没有这么简单。这些看似莫名其妙的问题,都指向了一个词:操作系统。

上述所有问题的答案,都可以用一句比较笼统的话来回答:由操作系统对这些功能提供支持。而其中原理,正是本系列要向读者讲述的。

欢迎来到操作系统的实现之旅!

1.2 准备工作

想要实现一个操作系统,需要进行一些准备工作。

首先是一台安装有Linux操作系统的物理机或虚拟机,且带有GCC编译器。

然后,需要下载并安装汇编编译器nasm,其官网为https://nasm.us/。使用./configure --prefix=... && make -jN && make install命令即可完成安装。

然后,需要安装bochs虚拟机,其官网为https://bochs.sourceforge.io/。bochs拥有强大的硬件模拟及调试功能,其用于运行我们的操作系统。

bochs的安装比较复杂,首先,需要使用普通的./configure --prefix=... && make -jN && make install命令将其编译一次,此时得到的bochs程序是用于运行的版本,此外,还会得到一个名为bximage的程序,其用于创建虚拟硬盘。然后,需要使用./configure --prefix=xxx --enable-debugger --enable-debugger-gui && make -jN && make install再编译一次(注意两次编译的--prefix应不同,否则就覆盖了),这一次,得到的是bochs的调试器版本,当操作系统出现问题时,就依靠它了。由于这两个版本的bochs名字一样,所以,读者应将第二个bochs更名,笔者使用的名称是bochsdbg

然后,需要构建虚拟硬盘。运行bximage命令,然后输入1,回车;接下来一直回车,直至命令结束。此时,当前目录下出现了名为c.img的文件,其大小接近10M,这个文件就是创建好的虚拟硬盘了。

接下来,需要为两个版本的bochs分别构造一个配置文件。第一个配置文件需要放在~/.bochsrc处,其内容为:

romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
boot: disk
ata0-master: type=disk, path="c.img", mode=flat
megs: 32

此配置文件中,第4行设定的是虚拟硬盘信息;第5行设定的是内存容量,单位是M;其他配置无需关注。

第二个配置文件需要放在~/.bochsdbgrc处,其内容较上一个文件多了最后一行:

romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
boot: disk
ata0-master: type=disk, path="c.img", mode=flat
megs: 32
display_library: x, options="gui_debug"

第6行用于启动bochs调试器的GUI。

最后,需要在~/.bashrc中将两个版本的bochs与其配置文件分别对应起来:

alias bochs="bochs -q"
alias bochsdbg="bochsdbg -q -f ~/.bochsdbgrc"

至此,所有的准备工作就都完成了。

如果现在运行bochs命令,bochs会显示:"No bootable device"(没有可引导的设备),这是正常的,因为现在什么都还没有实现。在下一章中,我们将正式开始实现操作系统。

本系列源码可从https://github.com/yingyulou/Published-Articles/tree/master/code/os获得。

标签:&&,操作系统,配置文件,实现,make,--,bochs,设计
From: https://www.cnblogs.com/yingyulou/p/17825509.html

相关文章

  • 一个操作系统的设计与实现——第5章 加载内核
    一直以来,我们都在使用汇编语言对MBR编程,但对于操作系统这样的复杂程序来说,使用汇编语言是比较困难的。本章将实现操作系统内核的加载与进入。5.1读硬盘的实现原理操作系统存储于硬盘中,现在需要将其读出至内存。想要读硬盘,就需要依次进行以下操作:设定读取的扇区数设定起始扇......
  • 一个操作系统的设计与实现——第9章 硬盘驱动
    操作系统应当具备读写硬盘的能力。因此,本章将要实现的是硬盘驱动。硬盘驱动由两个函数构成:读硬盘函数与写硬盘函数。9.1读硬盘想要读硬盘,就需要提供以下三个信息:起始扇区号读取的扇区数数据存储的地址需要注意的是:读取的扇区数只能是一个8字节的整数。由于读硬盘需要使......
  • 一个操作系统的设计与实现——第8章 内存管理系统
    计算机上的任何程序,包括操作系统自己,都需要使用内存。因此,操作系统需要实现内存管理系统,以进行内存的分配和回收。在我们的操作系统中,内存管理系统由两部分组成:页分配器与页回收器。本章将实现这两个部分。8.1从虚拟地址到物理地址回顾CPU对内存地址的转换过程:使用段寄存器......
  • 一个操作系统的设计与实现——第7章 中断
    7.1什么是中断中断是一种能够随时打断CPU正常工作的机制。这句话看着挺别扭的,CPU工作的好好的,为什么要"随时打断"它?这是因为,CPU需要为诸多外部设备提供服务,以键盘为例,当键盘上的键被按下时,CPU需要对此做出响应和处理,如果不能及时响应,我们会说:"电脑很卡";如果一直都不能响应,我们会......
  • 一个操作系统的设计与实现——第6章 显卡驱动
    进入内核以后,应该做些什么呢?本章将实现一个最容易看到效果的模块:显卡驱动。6.1什么是驱动驱动这个词听起来很高大上,但实际上很简单,就是硬件的接口函数。在软件工程中,可以使用接口封装和简化设计,硬件也是一样。例如:想要读硬盘,需要很多指令设定好几个端口,然后等待硬盘就绪,最后才......
  • 一个操作系统的设计与实现——第12章 任务(三):3特权级任务
    特权级是保护模式的核心概念之一,但我们的操作系统一直没有引入这个概念。这是因为,特权级只有在3特权级任务存在时才有意义。本章将要实现的是3特权级任务的加载与任务切换。12.1特权级12.1.1特权级的功能特权级(PrivilegeLevel),是保护模式中用于限制任务权限的机制。特权级有4......
  • 一个操作系统的设计与实现——第11章 任务(二):0特权级任务
    上一章中,我们的操作系统已经支持内核共享,这为任务的加载和运行做好了准备。本章将要实现的是0特权级任务的加载与任务切换。11.1任务切换的原理11.1.1协同式与抢占式任务切换如果CPU上只运行着Kernel.c的main函数,那么情况非常简单,只需要不断执行下一条指令即可。然而,如果现......
  • 一个操作系统的设计与实现——第10章 任务(一):共享内核
    一直以来,我们的操作系统在启动后,运行的都是Kernel.c中的main函数。只运行这一个函数是不够的,操作系统应当有能力加载并运行其他程序。从本章开始,将使用四章的篇幅讨论操作系统如何加载并运行任务。这里的任务(Task)与进程(Process)是同义词,在操作系统领域中,任务这个词更为常用,请读者......
  • 一个操作系统的设计与实现——第13章 任务(四):任务回收
    在前面的两章中,我们的操作系统均不支持任务回收,所以任务不能退出。本章将要实现的是任务回收功能。13.1任务回收的原理如果一个任务位于任务队列中,其就会被运行。所以,如果一个任务的运行已经结束,它就应该从任务队列中删除。仅仅将任务从任务队列中删除是不够的,这是因为任务还......
  • Powershell 实现telnet 服务端
    Write-Host"这是一个简单的TCP服务器,用于监听指定的端口,并接收来自客户端的数据。"Write-Host"客户端请使用telnetIP+端口的方式连接至服务器"Write-Host"目前同时只支持单个客户端,请勿连接多个客户端,会导致程序运行异常"Write-Host"作者:ID404"Write-Host"版本:1.0"......