一个操作系统的实现

合集下载

操作系统的设计和实现

操作系统的设计和实现

操作系统的设计和实现操作系统(Operating System,简称OS)是一种管理计算机硬件和软件资源的系统软件,它为用户和应用程序提供了一个友好的、稳定的和统一的运行环境。

操作系统的设计和实现涉及到计算机体系结构、编程语言、算法、数据结构、系统调用、进程通信、内存管理、文件系统和网络通信等多个方面。

操作系统的设计和实现可以分为以下几个阶段:第一阶段:引导程序当计算机启动时,首先执行的程序是BIOS(Basic Input/Output System)或UEFI(Unified Extensible Firmware Interface)固件。

这些固件负责初始化硬件设备、自检和检测外部设备。

接着会加载引导程序或操作系统。

引导程序负责读取操作系统镜像文件,将其加载到内存中,并跳转到操作系统的入口点。

第二阶段:内核初始化操作系统的内核(Kernel)是最基本的组成部分,它负责管理计算机的硬件和软件资源。

内核初始化的任务包括建立基本的数据结构、设置中断和异常处理、初始化进程调度器、设置内存管理以及加载设备驱动程序。

内核初始化完成后,就可以开始接受和响应系统调用请求。

第三阶段:进程管理操作系统通过进程管理来控制程序的执行。

进程是一个程序的执行实例,它拥有自己的内存空间、寄存器和资源。

操作系统通过进程调度器来分配CPU时间片,以保证每个进程都能得到执行的机会。

进程之间可以通过进程通信机制(如管道、消息队列、信号和共享内存)来实现数据共享和同步。

操作系统还提供了进程状态监测和调试工具,方便程序员进行调试和性能分析。

第四阶段:内存管理内存管理是操作系统的一个关键功能,它负责管理内存的分配、回收和保护。

操作系统需要提供一个虚拟内存地址空间,使得每个进程都能访问自己的独立内存空间。

操作系统通过页表映射机制来实现虚拟内存和物理内存之间的映射。

操作系统还需要提供内存保护机制,以防止进程越界访问或误操作导致系统崩溃。

操作系统的设计与实现

操作系统的设计与实现

操作系统的设计与实现操作系统是计算机硬件的核心,它可以控制整个计算机系统的工作,为用户提供方便和高效的计算机环境。

计算机操作系统不仅需要具有稳定可靠的性能,同时还需要满足安全、易用和灵活等需求。

本文将从操作系统的设计和实现两个方面来探讨计算机操作系统的原理和实践。

一、操作系统的设计1.1、操作系统的层次结构操作系统的层次结构是指在操作系统中采用了不同的层次来完成不同的职责。

操作系统的层次结构可以分为:硬件层、内核层、系统调用层、程序库层和应用层等。

硬件层是指物理层,主要是处理器、内存、硬盘等设备,操作系统需要对这些硬件资源进行管理和分配。

内核层是操作系统的核心,主要提供管理和分配硬件资源的功能,同时还负责处理硬件和软件之间的交互和通讯。

系统调用层是通过应用程序向内核层请求服务的界面,它包含了一系列的系统调用接口,应用程序可以利用这些接口来请求内核级别的服务。

程序库层是应用程序开发的基础,它包含了一些函数库和工具集,开发人员可以通过这些工具来更方便地开发应用程序。

应用层是最外层,包含了各种应用程序,例如浏览器、文本编辑器、游戏等,用户可以通过这些应用程序来完成功能。

1.2、操作系统的功能操作系统的主要功能包括:进程管理、内存管理、文件管理、设备管理和安全管理。

进程管理:进程是指正在运行的程序,操作系统需要对进程进行管理和调度,使它们能够协调地运行。

进程管理包括进程创建、进程调度、进程通信、进程同步和进程撤销等。

内存管理:内存是计算机的重要组成部分,操作系统需要对内存进行管理和分配。

内存管理包括内存分配、内存回收、内存保护和虚拟内存管理等。

文件管理:文件是计算机系统中重要的数据存储和共享方式,操作系统需要提供文件管理功能。

文件管理包括文件的创建、删除、修改、复制和文件保护等。

设备管理:设备是计算机系统中的重要组成部分,操作系统需要对设备进行管理。

设备管理包括设备的驱动程序开发、设备的分配和设备的控制等。

操作系统原理及其实现方式

操作系统原理及其实现方式

操作系统原理及其实现方式操作系统是计算机系统中的一个重要组成部分,它起着协调、管理和控制计算机硬件和软件资源的作用。

本文将详细介绍操作系统的原理以及实现方式,以便读者对操作系统有更深入的了解。

一、操作系统原理1.1 操作系统的定义操作系统是一个管理计算机硬件和软件资源的程序,它可以提供给用户和应用程序一个简单的接口,对资源进行管理和分配,以实现计算机系统的高效运行。

1.2 操作系统的功能操作系统具有以下基本功能:1)处理器管理:对处理器的分配和调度,确保每个任务都能得到足够的处理时间。

2)内存管理:对内存的分配和回收,以及进程的地址空间管理。

3)文件系统管理:对磁盘上文件的组织和访问进行管理。

4)设备管理:对输入输出设备的控制和分配。

5)用户接口:提供给用户和应用程序一个方便的操作界面。

1.3 操作系统的设计原则操作系统的设计遵循以下几个原则:1)简洁性:操作系统应该尽量简洁,去除冗余的功能,保证核心功能的高效运行。

2)可靠性:操作系统应该具有足够的容错能力,能够正确处理各种异常情况。

3)可扩展性:操作系统应该具备良好的扩展性,能够方便地添加新的功能和设备支持。

4)高效性:操作系统应该具有高效的资源管理和调度机制,以提高整个系统的运行效率。

二、操作系统的实现方式2.1 单任务操作系统单任务操作系统是最简单的操作系统形式,它只能处理一个任务,无法进行并发处理。

单任务操作系统的实现方式通常采用顺序执行的方式,即按照特定的顺序执行任务,并在任务完成后切换到下一个任务。

2.2 多任务操作系统多任务操作系统可以同时处理多个任务,具有并发处理的能力。

多任务操作系统的实现方式主要有以下几种:1)分时系统:将处理器的时间片分配给不同的任务,轮流执行,给用户一种同时运行多个任务的错觉。

2)多道程序系统:将内存划分为多个区域,每个区域存放一个程序,并同时加载多个程序到内存中,通过在程序之间进行切换实现多任务处理。

3)实时系统:针对实时应用的操作系统,具有对任务的响应时间有严格要求,需保证实时任务在规定的时间内完成。

实现一个简单的分时操作系统

实现一个简单的分时操作系统

实现一个简单的分时操作系统一、介绍分时操作系统随着计算机技术的日新月异,越来越多的人开始接触和使用计算机。

而分时操作系统是一种常见的操作系统,它可以使多个用户同时共享一台计算机,实现多任务处理和资源共享。

本文将介绍如何实现一个简单的分时操作系统。

二、实现分时操作系统的要素要实现一个分时操作系统,需要考虑以下要素:1. 进程调度:实现进程调度算法,将 CPU 资源分配给各个进程,使得各个进程能够公平地使用计算机资源。

2. 内存管理:为每个进程分配内存,保证各个进程之间不会互相干扰。

3. 用户界面:提供良好的用户界面,使得用户能够方便地使用计算机。

4. 文件系统:为用户提供存储和管理文件的功能。

三、实现分时操作系统的步骤下面,我们将从步骤的角度来介绍如何实现一个简单的分时操作系统。

1. 确定系统框架首先,需要确定系统的基本框架,包括设计系统的模块,定义系统的数据结构,确定模块的交互方式等等。

比如,在我们的系统中,应该至少包括进程调度模块、内存管理模块、用户界面模块和文件系统模块。

2. 实现进程调度算法进程调度算法是分时操作系统最核心的部分,它决定了进程如何按照一定的规则获得CPU 资源。

可选的进程调度算法有很多种,比如先来先服务调度算法、优先级调度算法、时间片轮转调度算法等等。

在我们的系统中,我们可以选择时间片轮转调度算法,即为每个进程分配一个时间片,在时间片用完之后,将 CPU 资源交给下一个进程。

3. 实现内存管理模块内存管理模块负责为每个进程分配内存空间。

在我们的系统中,可以采用页式内存管理,将物理内存划分成多个大小相等的页,在需要分配内存时,为进程分配连续的多个页。

同时,还需要考虑内存的回收问题,即当进程结束时,如何将其占用的内存空间回收。

4. 实现用户界面模块用户界面模块负责提供良好的用户交互界面,让用户能够方便地使用该系统。

在我们的系统中,可以设计一个简单的Shell 程序,让用户可以通过 Shell 命令来进入不同的模式,执行各种操作。

怎样写一个简单的操作系统

怎样写一个简单的操作系统

怎样写一个简单的操作系统写一个简单的操作系统需要涉及到多个层面的知识和技能,包括计算机体系结构、汇编语言、系统编程、驱动程序开发等等。

由于篇幅限制,下面我将以几个主要步骤简要介绍一个简单的操作系统的开发过程。

1.设计操作系统的结构和功能首先,你需要明确你的操作系统要实现的功能和为哪种类型的硬件系统提供服务。

然后,你可以设计出操作系统的基本结构和模块,例如核心内核、文件系统、进程管理和用户界面等。

2.学习汇编语言和体系结构计算机操作系统的底层是依托机器语言编写的,所以你需要了解机器的体系结构并学习汇编语言编程。

汇编语言是一种直接操作硬件的语言,理解它将有助于你编写底层驱动和实现系统调用等操作系统的核心功能。

3.编写启动代码和引导扇区操作系统运行时需要加载到计算机的内存中,所以你需要编写一个引导扇区代码来启动和加载操作系统。

引导扇区是计算机启动时加载的第一个扇区,它的任务是读取操作系统的其他部分并将其加载到内存中。

4.实现内核功能在操作系统的内核中,你需要实现一些核心功能,如中断处理、进程管理、内存管理、文件系统等。

对于每个模块,你需要编写对应的代码,并确保它们能够相互协调工作。

5.开发驱动程序驱动程序是操作系统与硬件之间的桥梁,它们负责管理和控制硬件设备的工作。

你需要了解硬件的特性和接口规范,并编写对应的驱动程序来支持所需硬件设备。

6.编写用户界面和应用程序7.测试和调试在完成操作系统的开发后,你需要对其进行测试和调试,确保系统的稳定性和性能。

你可以编写一些测试用例来验证系统的功能,并对可能出现的错误进行调试和修复。

需要注意的是,编写一个完整和稳定的操作系统是一个庞大的工程,仅用1200字无法详尽地讲述所有的细节。

以上只是一个简要的介绍,如果你对操作系统开发感兴趣,建议你深入学习相关领域的知识,并参考相关书籍和教程进行进一步的学习和实践。

操作系统设计与实现

操作系统设计与实现

操作系统设计与实现操作系统是计算机系统中的核心软件,负责管理和协调计算机硬件和软件资源,为用户和应用程序提供一个高效、可靠、安全的运行环境。

操作系统的设计与实现是一项复杂而关键的工程,涉及到诸多原理、技术和方法。

本文将从操作系统的设计概念、设计原则以及设计和实现过程等方面进行论述。

一、操作系统设计概念在操作系统的设计过程中,需要明确一些基本的概念,以便于理解和把握设计的目标和意义。

1.1 内核和外壳操作系统可以分为内核和外壳两个部分。

内核是操作系统的核心,提供了对硬件资源的管理和控制功能,包括处理器管理、内存管理、设备管理等。

外壳则是用户与操作系统之间的接口,为用户提供了操作系统的功能和服务,包括命令解释、文件管理、用户界面等。

1.2 进程和线程进程是指正在执行的一个程序的实例,它具有独立的内存空间和资源,是操作系统进行资源分配和调度的基本单位。

线程是进程的一部分,是指进程内的一个执行路径,拥有独立的栈空间和寄存器状态,可以与同一进程内的其他线程共享全局数据。

1.3 并发和并行并发是指两个或多个事件在同一时间间隔内发生,但不一定同时进行;并行则是指两个或多个事件在同一时刻同时进行。

操作系统需要支持并发和并行执行,提高系统的资源利用率和响应能力。

二、操作系统设计原则在进行操作系统的设计和实现时,需要遵循一些基本的设计原则,以确保系统的正确性和可靠性。

2.1 简洁性操作系统的设计应该尽量简洁,避免冗余和复杂性,只包含必要的功能和模块,以降低系统的复杂性和出错概率。

2.2 可扩展性操作系统应该具备良好的可扩展性,能够根据需求进行灵活的扩展和添加新的功能和模块,以适应不断变化的硬件和软件环境。

2.3 可移植性操作系统应该具备良好的可移植性,能够在不同的硬件平台上运行和适应不同的操作环境,减少对硬件和平台的依赖性。

2.4 安全性操作系统设计应该注重安全性,保护用户的数据和隐私,防止恶意程序和攻击者对系统进行破坏和入侵。

操作系统的基本概念和实现原理

操作系统的基本概念和实现原理概述操作系统是计算机系统中最为核心的软件之一,它为计算机提供了基本的管理和控制功能。

操作系统的设计和实现涵盖了许多计算机科学的核心概念和技术,如进程管理、内存管理、文件系统等。

本文将从操作系统的基本概念和实现原理两个方面,探讨操作系统的核心技术和原理。

一、操作系统的基本概念操作系统是计算机系统中的一种基本软件,它是计算机硬件和应用程序之间的中介,负责协调和管理系统资源,提供一些基本的服务和接口,如进程管理、内存管理、文件系统等。

1. 进程管理进程是指正在运行的程序的程序实例,它通过各种系统调用来向操作系统请求服务,比如 I/O 操作、内存分配等。

操作系统需负责进程的管理和调度,将 CPU 资源分配给不同的进程。

进程管理的核心技术是进程调度算法,其目的是使 CPU 的利用率最高,同时保证进程能够按时完成任务。

常用的调度算法有先来先服务(FCFS)、最短进程优先(SJF)、时间片轮转等。

2. 内存管理内存管理主要包括内存的分配、回收和保护等功能。

在操作系统中,每个进程都有自己的虚拟地址空间,操作系统需要将此地址空间映射到实际的物理地址空间,并保证每个进程的地址空间相互独立,不会相互干扰。

另外,操作系统还需要解决内存碎片的问题,采用动态存储分配算法来解决。

3. 文件系统文件系统是操作系统中的一种重要的管理方式,它负责管理磁盘中存储的各种文件。

文件系统需负责文件的读写、创建、删除等操作,并提供一些常用的系统调用,如 open、read、write 等。

文件系统通常采用树形结构来组织磁盘中的文件。

二、操作系统的实现原理操作系统的实现基于计算机的硬件和体系结构,包括中央处理器(CPU)、存储器等。

操作系统需要通过操作硬件来提供服务和管理系统资源,因此需要与硬件密切配合。

1. 操作系统内核操作系统通常采用内核(Kernel)的形式来实现,内核是操作系统的核心,是操作系统的实际执行者。

操作系统原理及其实现方式

操作系统原理及其实现方式操作系统是一种软件程序,它是计算机系统的核心和管理者。

它根据用户的需求将硬件资源分配给各个进程,并监控和协调它们之间的交互。

操作系统的设计和实现是计算机科学的基本研究领域之一。

本文将简要介绍操作系统的原理和实现方式。

操作系统的基本原理操作系统的主要任务是管理和分配系统资源,这些资源包括处理器、内存、硬盘、网络、打印机等。

操作系统通过控制进程(程序的执行实例)来实现这些任务。

进程是操作系统管理的基本单位,它由代码、数据和系统资源组成。

操作系统通过分时技术(time-sharing)将处理器的时间分配给不同的进程,从而实现多任务处理。

操作系统还为进程提供了各种服务,例如文件管理、用户界面、I/O 等。

操作系统通过中断和异常机制来处理外部事件,例如用户输入、网络请求和硬件故障。

操作系统的实现方式操作系统的实现方式有两种主要方法:内核操作系统和微内核操作系统。

内核操作系统是指将所有操作系统功能集成在一个内核中的系统。

内核操作系统通常具有高性能和较低开销,但它缺乏灵活性和可扩展性。

微内核操作系统则是指将操作系统的核心功能分解成多个独立的服务,每个服务运行在独立的地址空间中,它们通过消息传递来交互。

微内核操作系统通常具有较高的可扩展性和灵活性,但也存在性能开销的问题。

操作系统的实现方式还可以根据内存管理、进程调度等方面的策略分类。

例如,分页和分段是常见的内存管理策略,它们分别采用不同的地址映射方式。

进程调度策略可以分为基于时间片和抢占式,前者将时间划分为若干个时间片分配给进程,后者则将CPU 从当前进程中抢占出来进行另一进程的调度。

操作系统的进阶理论在操作系统的进阶领域,一些研究正在进行中,例如多核系统的并行处理、虚拟化、容错性和安全性等。

多核系统需要一些新的处理方式,例如虚拟化和并行计算。

容错性是指在系统遭受意外事件(例如软件错误、硬件故障或网络攻击)时能够继续正常工作。

安全性是指系统可以抵御不良用户、黑客和病毒等外部攻击,并保护用户和系统资源不受攻击者的侵害。

一个操作系统的实现

Verum ipsum factum.──Giambattista Vico1马上动手写一个最小的“操作系统”虽说万事开头难,但有时也未必。

比如说,写一个有实用价值的操作系统是一项艰巨的工作,但一个最小的操作系统或许很容易就实现了。

现在我们就来实现一个小得无法再小的“操作系统”,建议你跟随书中的介绍一起动手来做,你会发现不但很容易,而且很有趣。

1.1准备工作对于写程序,准备工作无非就是硬件和软件两方面,我们来看一下:1.硬件•一台计算机(Linux操作系统1或Windows操作系统均可)•一张空白软盘2.软件•汇编编译器NASMNASM最新版本可以从其官方网站获得2。

此刻你可能会有疑问:这么多汇编编译器中,为什么选择NASM?对于这一点本书后面会有解释。

•软盘绝对扇区读写工具在Linux下可使用dd命令,在Windows下则需要额外下载一个工具比如rawrite3或者图形界面的rawwritewin4。

当然如果你愿意,也可以自己动手写一个“能用就好”的工具,并不是很复杂5。

1实际上Linux并非一种操作系统,而仅仅是操作系统的内核。

在这里比较准确的说法是GNU/ Linux,本书提到的Linux泛指所有以Linux为内核的GNU/Linux操作系统。

GNU经常被人们遗忘,但它的贡献无论怎样夸大都不过分,这不仅仅是因为在你所使用的GNU/Linux中,GNU软件的代码量是Linux内核的十倍,更加因为,如果没有以Richard Stallman为首的GNU项目倡导自由软件文化并为之付出艰辛努力,如今你我可能根本没有自由软件可用。

本书将GNU/Linux简化为Linux,仅仅是为表达方便,绝不是因为GNU这一字眼可有可无。

2NASM的官方网站位于/projects/nasm。

3rawrite可以在许多地方找到,比如/debian/tools/。

4下载地址为/rawwrite。

5我们不需要太强大的软盘读写工具,只要能将512字节的数据写入软盘的第一个扇区就足够了。

计算机操作系统实现与基础知识

计算机操作系统实现与基础知识计算机操作系统是指控制和管理计算机硬件和软件资源的系统软件。

它是计算机系统中最核心、最基础的一个部分,为用户和应用程序提供了统一的接口,使得计算机能够高效地运行。

本文将介绍计算机操作系统的实现和基础知识。

一、操作系统的实现操作系统的实现是指将操作系统的各个功能模块通过编程语言实现,并将其加载到计算机的内存中运行。

操作系统的实现包括以下几个方面:1.1 内核操作系统的核心是内核,它负责管理计算机的硬件资源,并提供给应用程序访问硬件的接口。

内核负责处理中断、调度进程、分配内存等核心功能。

内核可以分为微内核和宏内核两种架构。

1.2 文件系统文件系统是操作系统对磁盘上文件进行组织和管理的一种方法。

它负责文件的创建、查找、读写等操作。

文件系统将磁盘上的数据组织成文件和目录,使得用户可以方便地管理和访问文件。

1.3 设备驱动程序设备驱动程序是连接计算机系统和硬件设备之间的桥梁。

它负责将操作系统的命令翻译成硬件设备可以执行的指令,并将设备的状态传递给操作系统。

设备驱动程序包括磁盘驱动程序、打印机驱动程序、网络驱动程序等。

1.4 用户界面用户界面是用户和操作系统之间的接口。

它可以分为命令行界面和图形界面两种形式。

命令行界面通过用户输入命令来与操作系统交互,而图形界面提供了图形化的操作界面,用户通过鼠标和键盘与操作系统交互。

二、操作系统的基础知识2.1 进程管理进程是指正在运行的程序的实例。

操作系统通过进程管理来控制程序的执行和资源的分配。

进程管理包括进程的创建、销毁、调度和通信等功能。

操作系统通过进程管理实现了多任务的并发执行。

2.2 内存管理内存管理是操作系统中重要的一项功能。

它负责管理计算机的内存资源,包括内存的分配和回收。

内存管理还需要解决内存碎片的问题,以提高内存的利用率和性能。

2.3 文件管理文件管理是操作系统对文件进行组织和管理的一种方法。

它包括文件的创建、读写、修改、删除等操作。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4 特权级我首先假定内核的level=0 系统服务的level=1 应用程序的level=3。

程序从一个代码段转移到另一个代码段时(可能的情况是调用系统函数),需要考虑权限问题,利用了CPL,DP L和RPL来判断是否可以进行代码转移。

利用call调用门实现一个低特权级的进程访问高特权级的代码段,利用ret指令实现高特权级到低特权级的跳转。

Jmp时,不管长跳转还是短跳转都一样的实现。

Call时,长跳转需要比短跳转额外保存一下当前进程的cs地址到堆栈段中(因为返回时需要知道要返回到哪个代码段)。

例如用户进程A(ring3)执行时通过调用门访问系统进程B(ring0)的代码段(可以理解为一个系统函数调用),执行完后返回,这个过程可以归纳如下:1)用户进程A将参数,返回值,cs地址保存到LDT进程A的堆栈段中。

2)用户进程A的程序通过call调用门跳转到系统进程B中执行。

由于现在已经是B中的代码在执行,所以相应的使用的是B的堆栈段。

同时,A的堆栈段的位置ss和esp会保存到TSS (每个进程一个)3) B中相应的代码执行完毕(对应命令ret),执行完毕后通过取出TSS中保存的A的堆栈段中的返回地址来返回A。

反过来,由一个系统进程(ring0)进入用户进程(ring3)的关键在于,在ring0向ring3跳转之前,手动保存ring3进程A的当前cs,eip,ss,esp到A的ss中,然后调用命令retf,这个命令会自动加载A的cs,eip,ss,esp到CPU寄存器,并跳转开始执行A。

这就实现了ring0 tori ng3。

5 中断和异常中断是一个计算机执行的根本,进程调度,键盘输入等等都是中断。

保护模式下,中断是通过IDT(中断描述符表)来实现的,中断发生时,会在IDT中找到对应的描述符,并转到相应的中断处理函数处运行。

终端分为软件中断(通过int N命令实现)和外部硬件中断(例如|--pm.inc //保护模式相关|--fat12hdr.inc //文件系统相关|--include|--const.h|--type.h //数据类型|--protect.h|--kernel|--kernel.asm //kernel.bin 其中包含内核入口点_start和异常处理入口点。

|--start.c //内核的C入口cstart() / 初始化IDT|--lib|--string.asm //string注意,在写makefile的时候,至少要3个标签,分别为boot loader kernel 和clean9这时,内核已经掌握了控制权,但是由于没有中断,内核几乎不能做什么工作(不能进程调度,不能接受输入),所以接下来需要完成中断处理。

步骤为:1)设置和CPU直连的2个8259A芯片的寄存器,将硬件初始化(代码位于starts. c中)。

2)手动建立IDT。

3)建立异常处理,过程如下。

…………//kernel.asmdivide_error: //如果发生异常便会跳到此函数处运行push 参数(包括错误码和错误的ID)call exception_hander //除零错处处理函数,显示错误吗…………..//start.c中运行idt[INT_VECTOR_DEVIDE].selsect= GDT_idtseclet; //寻址时先在GD T中找到IDT的段地址在加上偏移找到devide_error()的线性地址idt[INT_VECTOR_DEVIDE].offset= devide_erro r; //错误处理函数为devide_error(); //idt中每一个元素代表了一个中断向量,发生中断时候,CPU会首先根据中断寄存器找到idt的起始位置,然后根据中断向量号和idt数组找到中断处理程序的位置,并保存相关寄存器后跳转到中断处理程序处运行!4)建立中断处理(步骤和建立异常类似,就是中间多了一个设置初始化8259A)。

文章标题:一个操作系统的实现(2)原作者:xiongjian原出处:xiongjian Blog发布者:loose_went发布类型:转载发布日期:2010-12-22今日/总浏览:3/6410 下面开始进程,首先引入几个基本原则:1)进程表A用来保存进程A的信息和进程A切换时,保存当前A运行时寄存器信息。

定义为:PROCESSproc_table[1024]; 表示系统最多可以有1024个进程,PROCE SS里面就保存了本进程运行时的各个寄存器信息(这样可以在进程切换回来的时候返回寄存器信息),该进程对应的LDT描述符(一般指向代码段和数据段),最后还有一个指向GDT 中该进程位置的描述符。

实现一个最简单的进程切换系统,需要下面3个子模块:时钟中断处理程序/进程调度模块/至少1个主进程和2个子进程一个进程(ring1)的最小需要的元素为进程执行体,堆栈大小和位置。

另外需要GDT中有一个选择符指向一个该进程的LDT。

在时钟中断发生时,时钟中断处理函数(ring0)将esp指向将要运行的进程在进程表中的位置。

当做到这里,系统应该可以定时触发时间中断处理函数,时间中断处理函数会轮流的调用进程A和B了。

(这也是个ring0到ring1直接相互切换的过程)到此为止,操作系统的启动可以高于段落。

其他需要注意的是:系统调用系统调用的简单实现就是进程(ring1)将参数例如:num,保存在寄存器中,然后自己产生一个中断,例如int 100h.表示软件发生100H号中断(假设中断处理函数为sys_call)。

I/O system(注意以下都是微内核形态)IO首先第一个想到的就是键盘,其实键盘驱动非常简单,只要注意以下几个方面即可:1 建立键盘中断处理函数2 打开8259a的键盘中断3 解析中断发生时的数据以确定用户按下的具体按键4 键盘有一个缓冲区,用于保存用户按键信息,驱动需要及时的吧这个缓冲区的数据读取出来,如果不是一个完整数据,需要做临时缓存。

系统有一个固定的显存内存位置,显示的最基本原理就是N个字节里面保存字符和颜色信息,最常见的是的565色。

Linux的多终端机制的一般规则为多个终端对应一个屏幕,用户在使用一个屏幕的时候,可以随时切换到其他屏幕而好像是切换了用户一样。

实现这样机制的一个进程叫做TTY进程,他作为第一个微内核以为的系统进程而存在,已区别于一般的用户进程。

下面就来看看他的大概实现思路:Tty_task(){Init_keyboard();For(循环3次) init_tty(i);While(1){//依次遍历每一个ttyFor(I= 0; i<3 ; i++){Tty_read(i);//如果当前活跃的tty是我,则从键盘驱动中读取键盘缓存In_process(i,key); //将读出的缓存存放到当前tty的缓存中,另外处理alt+Fn的切换控制台命令(即Fn)Tty_write(i);}}}微内核有MM和FS,分别为内存管理进程和文件系统进程,下面看看一个微内核是如何实现进程创建的。

² 1 用户调用fork函数² 2 fork调用sys_call(MM, FORK); //表示消息要发给MM进程,消息内容为FOR K,内部通过send_recv实现,即先发送在接收消息² 3 send_recv内部使用int触发IDT中的一个中断,假设中断处理函数为s_call(ring0)² 4 s_call内部会将消息从寄存器中取出,并向MM进程发送消息(msg_send() ).² 5 msg_send(sender, dest, msg) //发送者/接收者/要发送的消息体××发送消息××{检查发送者和接收者不能相等检查是否会发生死锁,例如A->B->A 即A和B在同时相互发送消息,A B进程都会堵死在发送程序处。

If(接收者是处理RECEIVE状态){在线性地址(物理地址)层面将要发送的消息复制到接收者的缓存中(虚拟地址-)线性地址)。

因为发送者的消息是存放在物理地址里面的,所以必须要找到消息的物理位置才能将消息复制到接收者进程。

}Else 发送者处于SEND状态,并等待一直到接收者处于RECEIVE为止,通过调用进程调度进程实现。

}² 6 通过msg_send的调用,在物理地址层面,消息就被复制到了接收进程中(消息可以保持在接收进程的进程表项中)。

下面看看接受进程:接收进程调用msg_recv来阻塞的接收消息msg_recv(接收者,发送者,接收消息的指针m){If(接收者有来自硬件的消息)If(接收者队列里有消息) 将接收到的消息复制到m里。

Else (没有消息) 阻塞}² 7 到目前为止,进程可以实现发送和接收消息了。

实现的根本原理还是通过物理地址的消息复制。

现在的进程有了以下状态:发送(消息)状态,接收(消息)状态,运行状态,休眠状态。

其中发送/接收/休眠状态都不会获得CPU运行机会。

,同时MM进程会不停的查询,如果有消息,则调用do_fork真正创建进程。

从这一系列流程可以看出,微内核仅仅给上层发送和接收消息2个接口,而不关心具体实现。

具体的实现是他们通过参数传给具体的ring1进程(例如FS,MM……)来实现。

以上就是微内核的思想,同时也是一个简单同步IPC思想。

相关文档
最新文档