自己动手写操作系统
文章平均质量分 93
谁不小心的
过于复杂,无法简介
展开
-
《自己动手写操作系统 》第九章 一 简易硬盘驱动的实现
摘要:我们都知道磁盘由控制器、磁头等组件组成。我们在终端编辑文件的时候,文件内容是如何从内存到达磁盘的呢?磁盘驱动主要完成哪些工作?硬盘中断是如何触发的?等等,这些都是硬盘工作的基本原理。本文主要从“自己动手写操作系统” 出发,通过实现一个简单的硬盘驱动,来解释硬盘工作的基本原理。1.程序执行流程:1)task_hd()作为一个守护进程,初始化硬盘,然后一直运行,等待接收来自其他进原创 2014-04-10 15:49:19 · 3236 阅读 · 1 评论 -
《自己动手写操作系统》第三章 pmtest9源码解析——中断处理程序
本节,我们将学习现代操作系统的一个重要的特点——中断处理机制。同样,中断处理也是软硬件协同完成的,其中硬件部分:8259A负责可编程中断控制器,通过读写端口,实现中断信号和中断号的绑定等工作;CPU通过门描述符与中断向量表来实现中断服务程序。最后,访问一个中断和访问一个门的过程是类似的,读者可以进行相应比较。本文,主要通过pmtest9讲解中断程序的编写。中断门的实现包括如下内容:设置8259原创 2014-03-07 17:38:05 · 2381 阅读 · 0 评论 -
<自己动手写操作系统>第三章pmtest7源码解析——检测系统内存
摘要:在pmtest6.asm中,我们已经初步接触了分页机制,但是很显然,上述分页机制浪费比较严重,而且没有体现应有的用处。本节,我们主要介绍如何根据内存容量,恰当地分配页表。一、理论基础1.如何获取内存分布信息?获取内存,需要用到dos下的int 15h中断,可以参考这里:http://blog.csdn.net/trochiluses/article/details/20078161原创 2014-03-06 10:21:38 · 1931 阅读 · 3 评论 -
《自己动手写操作系统》第三章pmtest8源码解析——多任务系统下的地址映射
摘要:本节,我们主要接触现代操作系统的一个重要特性——虚拟地址下的多任务。我们都知道,编写高级语言程序使用的地址都是虚拟线性地址,屏蔽了底层实际的物理地址。也就是说,在相同的物理内存布局条件下,对于任务A和B,相同的线性地址line,对应的物理地址内容是不一样的。本节,我们就从实践的角度来看看,这种原理是如何实现的。另外,结合调试过程中出现的错误,讲解关于call和ret指令以及段描述符寄存器的相原创 2014-03-06 22:23:02 · 2073 阅读 · 0 评论 -
《自己动手写操作系统》第三章 pmtest5源码解析——特权级变换与堆栈切换实例详解
摘要:在pmtest4中,我们已经看到,对于非一致性代码,如何从低特权级转移向高特权级。但是我们该怎样从高特权级别,转移到低特权级别呢?本文,主要是为你解答这些疑问,展现实现这种特权级别转移的方法。另外,我们将在实践中探讨,为什么要设定RPL,是不是相对与DPL多此一举呢?在调试环节,我们将通过改动代码,排查相关错误来深入理解特权级检测机制。一、预备理论1.关于堆栈我们都知道,可以通过cal原创 2014-03-04 17:43:51 · 1999 阅读 · 1 评论 -
保护模式编程——保护的详尽意义:通过调用门转移特权级
保护模式及其编程——保护机制摘要:在汇编语言的编程和操作系统的编写过程中,我们经常能听说到“保护模式”这个名词。为什么要叫“保护模式”呢?保护 二字的含义何在?本文主要探讨,“保护模式”下面各种具体的保护机制,这些保护机制产生的原因和具体的影响。阅读本文之前,读者需要了解基本的处理器相关知识,知道分段和分页机制的基本原理,熟悉一些基本的数据结构(段选择符、描述符、GDT、页表、CR系列寄存器等)原创 2014-02-20 22:14:57 · 4388 阅读 · 2 评论 -
《自己动手写操作系统》第三章 pmtest4源码解析——利用门调用实现特权级转移
摘要:本节,我们将通过分析pmtest4来实现利用调用门进行段间转移。一、背景与原理在汇编语言中,我们不能执行这样的指令:mov ds100h和movcs,ax;也就是说,段寄存器的值,是不能像通用寄存器一样,随意赋值的。具体的cs寄存器而言,它涉及到程序的控制转移,需要借助jmp、call、ret、sysenter,sysexit,int n,iret来实现,或者通过中断原创 2014-03-04 10:49:22 · 1932 阅读 · 0 评论 -
《自己动手写操作系统》 第三章 pmtest6源码解析——开启分页机制
摘要:在pmtest5中,我们已经看到了如何在不同的特权级之间进行跳转。那么,pmtest6中,我们将展示如何开启分页机制。读者需要明白的是,无论是分段还是分页,从本质上所都是通过逻辑来设想,然后辅助硬件设计来实现的。不同的内存单元没有本质上的不同,一眼望去,所有的内存都是一样的。所以,读者在学习这一部分的时候,一定要勤于在纸上画出内存的布局图和不同数据结构之间的转换关系。pmtest5,在pmt原创 2014-03-04 23:05:47 · 1766 阅读 · 0 评论 -
保护模式及其编程——8086系统寄存器和系统指令
摘要:为了协助处理器完成初始化和控制系统操作,80x86提供了一个标志寄存器和几个系统寄存器。Eflags用于控制任务切换、中断处理、指令跟踪和权限访问。系统寄存器用于内存管理和控制处理器操作。1.标志寄存器32b,含有系统标志和通用标志,以及保留位等等,具体可以参考相关资料,下面简介系统标志位1) TF:b8,跟踪标志2)IOPL:b13-b12,IO特权级3)NT:b14,嵌套任原创 2014-02-18 23:43:09 · 5391 阅读 · 0 评论 -
《自己动手写操作系统》第三章 pmtest1——从实模式到保护模式
摘要:本节,我们将学习如何从实模式进入保护模式,剖析pmtest1.asm源码。详细讲解如何从保护模式进入实模式。1.头文件编写:这一部分,你需要把一些关键物理器件和数据结构的布局记在脑子里GDT描述符:32b段基地址(B2、B3、B4、B7)+20b段限长(B0、B1、B6的低4位)+12b段属性(B5、B6的高4位),详细布局见下图(针对代码段和数据段):所原创 2014-03-02 22:28:43 · 3542 阅读 · 3 评论 -
《自己动手写操作系统》第三章pmtest2源码解析
摘要:本节,通过代码解析,帮你解决如下问题:保护模式和实模式下面的偏移量有什么不同?保护膜是和实模式下段基地址是一个意思吗?长跳转指令jmp 0:entry为什么能够在一个代码段中更改另一个代码段的代码?一、总体思路剖析:pmtest2,其实实现的是从实模式到保护模式,然后从保护模式回到实模式,最后回归到dos。其中,一开始就进入了实模式,然后在实模式下初始化段描述符,处理GDT等原创 2014-03-03 20:51:38 · 2506 阅读 · 0 评论 -
《自己动手写操作系统》第四章——摆脱dos引导:boot &&Loader
摘要:在开机过程中,从BIOS中取得第一条指令到内核加载,操作系统的开机运行过程是这样的:“引导---加载内核进入内存——跳入保护模式——开始执行内核”。也就是说,内核执行之前,需要先加载进入内存,然后准备进入保护模式。引导扇区(里面有一定的程序)的512B是不够的,我们在引导扇区和内核之间加入一个模块——Loader,负责完成上述过程。即“引导扇区——Loader——kernel”。在前三章中,原创 2014-03-09 12:27:28 · 3124 阅读 · 1 评论 -
《自己动手写操作系统》第五章:扩充内核
从后面的章节开始,orange的书籍上往往没有解释为什么要这样做。我们在学习这段内容的时候,尽量多查找资料,从三个层次思考问题:应该怎么做?为什么要这样做?从本质上来看,这是一个什么问题。1、切换堆栈和GDT先来看看是如何切换的:108 mov esp, StackTop ; 堆栈在 bss 段中109 110 mov dword [disp_pos],原创 2014-03-17 17:43:41 · 2139 阅读 · 5 评论 -
《自己动手写操作系统》第五章 从loader到内核
loader需要做两件工作:加载到内核到内存,并且将控制权交给内核;跳入保护模式。1.用loader加载elf 这个过程和用boot加载loader没有太大的区别,当然,其中有各种琐碎的细节和偏移,这个结合fat12文件格式和根目录项格式就可以明白。根目录中条目格式如下:2.跳入保护模式,启动分页机制 加载完成之后,我们需要进入保护模式,这里我们准备原创 2014-03-17 17:28:42 · 1831 阅读 · 0 评论 -
自己动手写操作系统 第八章 :进程间通信 IPC
摘要:对于进程间通信,我们往往并不陌生。linux下的进程间通信主要有管道、信号量、消息队列等几种模式。在《自己动手写操作系统中》,我们将采用消息机制来实现进程间通信,原来和linux的消息队列有些类似。1.IPC同步与异步;很多领域里我们都用到了同步和异步的概念,这里再次区分一下。同步好比走路,走路毕竟需要同步嘛。当你的左脚迈出去之后,会等待你的右脚迈出去,不然你的左脚只能等待(原创 2014-04-07 14:39:41 · 2278 阅读 · 4 评论 -
《自己动手写操作系统》第六章:进程调度
摘要:进程和任务都有轻重缓急之分,如何让高优先级别的进程能够获得很好的CPU权限?进程调度方面有很多算法——时间片轮转算法、绝对优先级算法、动态有限级算法、短作业优先算法等。本文,我们将结合实践篇轮转算法实现一种绝对优先级算法。1.固定非等比例下的延迟 我们来修改A、B、C三个进程的延迟: 75 *====================================原创 2014-03-24 21:24:54 · 1313 阅读 · 0 评论 -
《自己动手写操作系统第六章》引入minix中断处理方式
摘要:回过头来看,我们发现我们的中断处理程序写的并不够优雅。中断被响应需要三个条件:Eflags中的中断标记是打开状态;中断屏蔽寄存器没有屏蔽对应中断,设置了EOI标志。1.修改一下时钟中断处理程序:g/kernel/kernel.asm174 inc dword [k_reenter]175 cmp dword [k_reenter], 0176原创 2014-03-24 21:11:50 · 1523 阅读 · 0 评论 -
《自己动手写操作系统 》第六章 多进程
摘要:为了实现进程切换,我们需要实现多进程。进程管理是操作系统中最重要的内容之一,在本节中,我们将实现多个进程,从而为以后的进程调度打下基础。1.添加一个进程体 85 void TestB() 86 { 87 int i = 0x1000; 88 while(1){ 89 disp_str("B"); 90 disp_int原创 2014-03-24 20:33:42 · 1173 阅读 · 0 评论 -
《自己动手写操作系统》第六章:从系统内核到进程A ring0>>ring1(一)
摘要:进程调度可谓是操作系统中最为重要的环节之一,在本文中,我们主要讲解进程模型、涉及的数据结构、如何从内核态转到用户进程?这一小节主要完成进程数据结构的分析,和从ring0>>ring1的进程开始阶段的内容。1.进程我们来盘点一下,完成进程切换需要哪些数据结构和程序模块:1)首先,一个进程必须有代码、数据(和堆栈):相关数据有LDT、段描述符、TSS等2)对于正在休息的进原创 2014-03-18 23:54:01 · 2995 阅读 · 1 评论 -
自己动手写操作系统 第六章 :丰富中断处理程序
在上面部分,我们仅仅添加了中断,但是中断没有进行任何处理,下面,我们来丰富一下中断处理程序5.第二步——丰富中断处理程序5.1打开时钟中断这里,我们需要复习两个要点:1)要想使得中断控制器能够正常工作,还需要写OCW到中断控制器OCW1:中断屏蔽寄存器的控制,端口是21h和A1h;OCW2:EOI信号,在中断结束的时候发给20h端口和A0h端口5.2现场原创 2014-03-22 15:16:38 · 1558 阅读 · 0 评论 -
自己动手写操作系统 第六章 号外:中断处理流程详细分析
摘要:进程调度可以说是操作系统中最重要的部分,而中断处理程序,可以说是进程调度中最重要的部分,因此,明白了中断处理流程,可以说就明白了进程调度,也明白了操作系统中很重要的一部分。本文,主要针对自己动手写操作系统中,没有理明白的部分进行讲解和总结,如果你在第六章感觉C和汇编编程之后,遇到一些阻力和困惑,也许能从中找到答案。注意:以下所有内容,均针对进程切换相关的中断程序——从理论上说,一个中断可以不原创 2014-03-22 20:18:34 · 1320 阅读 · 0 评论 -
C与汇编混合编程&&ELF文件格式解析
准备工作:C与汇编的混合编程ELF文件格式解析,这是《自己动手写操作系统》第五章的准备工作,主要讲解C与汇编混合编程的一些知识,并讲解ELF文件的相关知识,为有C语言写操作系统做准备。1.关于系统调用sys_writeLinux的系统调用通过int 80h实现,用系统调用号来区分入口函数,它的作用类似与dos的中断。 mov edx, len原创 2014-03-17 17:18:20 · 1733 阅读 · 0 评论 -
《自己动手写操作系统》 第六章 系统调用的实现
在学习系统调用之前,我们有必要理清几个问题:什么是系统调用?为什么要使用系统调用?如何来实现一个系统调用。1.理论知识 所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口。 系统服务之所以需要通过系统调用来提供给用户空间的根本原创 2014-03-24 21:20:06 · 1958 阅读 · 0 评论 -
8259初始化命令字(ICW1-ICW4)
8259A的中断操作功能很强,包括中断的请求、屏蔽、排队、结束、级联以及提供中断类型号和查询等操作,并且其操作的方式又有不同。它既能实现向量中断,又能进行中断查询,它可以用于16位机,也可用于8位机。因此,使用起来感到复杂且不好掌握。为此,以8259A的操作功能为线索,来讨论为实现这些功能的各个命令字的含义,为编程使用8259A提供一些思路。ICW1~ICW4在初始化程序中设定,且在整个工作过转载 2014-03-06 23:04:45 · 34674 阅读 · 3 评论 -
<自己动手写操作系统>第三章——pmtest3源码解析:使用LDT
摘要:在本节中,我们将添加一个LDT段,在段中打印一个字符L,从而学习如何利用程序的LDT段。程序的执行流程随之也会发生变化,我们将分析代码和分析代码结构。一、概要分析:在pmtest2的基础上,我们增加一个段LDT和一个LDT中的一个段codeA。需要注意的是,LDT存在的前提是GDT,因为LDT本身是一个段中,需要由GDT中的信息,得到基地址。另外,这个场景,给出了段选择子,我原创 2014-03-04 09:02:25 · 2164 阅读 · 0 评论 -
保护模式内存管理
保护模式内存管理1.内存寻址 保护模式下寻址由段地址+段内offset构成,其中段地址16b,其中的14b(16b的选择子中有2b用于特权级)可以选择2的14次方个段;段内偏移用32b来表示。程序中由上述48b构成的称为一个长地址或者一个长指针。 将要执行的指令的地址为CS:[EIP],段间转移指令可以用于为CS和EIP赋新值,从而可以将执行位置改变到其他的代码段中。这样,就原创 2014-02-19 20:39:00 · 1531 阅读 · 0 评论 -
《自己动手写操作系统》第一章 boot.asm源码剖析
1.代码: org 07c00h ; 告诉编译器程序加载到7c00处 mov ax, cs mov ds, ax mov es, ax call DispStr ; 调用显示字符串例程 jmp $原创 2013-05-24 19:40:30 · 4762 阅读 · 1 评论 -
BIOS 工作流程解析
学习linux很长时间了,一直没有时间把经验和挖掘的一些技巧整理出来,这个暑假在家没事,整理了一些与大家分享。由于都是自己的理解和实验产物,所以肯定有些不当之处,期待交流指正! 这个系列文章将以Ubuntu探秘命名,内容涉及到整个开机流程及GNOME桌面的hack . 今天发表第一篇心得:BIOS到底干啥用? BIOS(basic input/output system,基本输入输出转载 2013-05-19 16:09:43 · 1970 阅读 · 0 评论 -
《自己动手写操作系统》第三章a/pmtest1.asm
[html] view plaincopy 1 ; ========================================== 2 ; pmtest1.asm 3 ; 编译方法:nasm pmtest1.asm -o pmtest1.com 4 ; ==========================================转载 2013-05-27 10:31:21 · 2504 阅读 · 0 评论 -
《自己动手写操作系统》第二章——Bochs调试及相关仿真工具的使用方法
<!--p {margin-bottom:0.08in}-->关键词:bochs,自己动手写操作系统 一 安装具有调试功能的bochs注意:安装bochs以后,常常发现bochs不能调试,原因如下:$ sudo apt-get install vgabios bochs bochs-x bximage 敲入这样一行命令,不一会儿就装好了原创 2013-05-24 17:01:05 · 2298 阅读 · 0 评论 -
自己动手写操作系统--搭建保护模式下的运行环境:bochs下安装freedos
在进行保护模式的运行环境配置前,先看了了下书上的代码,编译运行结果如下:nasm 3_pmtest1.asm -o pmtest1.bin,可以看到界面出现了红色的 p 字 保护模式环境配置1:在网站http://bochs.sourceforge.net/guestos/freedos-img.tar.gz 上下载FreeDos,转载 2013-05-24 15:37:50 · 3562 阅读 · 2 评论 -
Linux启动过程前传——前世BIOS与今生OS
概述:我们经常讨论操作系统的启动过程,但是却很少讨论操作系统启动之前的过程。BIOS除了开机自检,还完成了哪些工作?CPU厂家,BIOS厂家,OS厂家是如何协作从而保证计算机的运行的?如何保证硬件能认识操作系统,并且听从操作系统的指挥?所有boot sector的第一句可执行汇编语句往往是 mov ax,cs,此时,cs的值来自于哪里呢?是随机的吗?为何boot sector的汇编指令中第一个伪操原创 2013-05-14 16:47:20 · 3179 阅读 · 0 评论 -
Int 10 中断功能
INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序,而后倚天公司针对倚天中文提供了许多服务程序,这些服务程序也加挂在 INT 10H 内。使用 INT 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 INT 10H。底下是它们的说明:AH功 能转载 2013-05-24 16:57:45 · 3113 阅读 · 0 评论 -
保护模式编程之(一)——分段机制与GDT/LDT
概述:若想理解操作系统程序中的启动相关的部分,必须要理解保护模式下的编程,而分段机制是保护模式编程下的基础。另外,由于实模式与保护模式的不同,对保护模式下的分段机制更需要注意。同时,这一部分的基本数据结构是以后理解代码跳转的基础,必须要熟练。1.段的定义 段是虚拟地址到线性地址转换的基础,段的特征有以下三个:段基址,段限长,段属性。这三个特征存储在段描述符(s原创 2013-05-24 10:51:31 · 4298 阅读 · 0 评论 -
实模式与保护模式解惑之(一)——二者的起源与区别
概述:实模式和保护模式是处理器发展的两个非常重要的阶段。这两个模式下的编程也有着显著的不同,弄明实模式与保护模式的区别是理解操作系统运行原理和编写操作系统的基础。本文主要讲解了实模式和保护模式的区别和保护模式的起源,侧重点在二者寻址方式上的差异。1.保护模式的起源 最开始的程序寻址是直接的“段:偏移”模式,这样的好处是所见即所得,程序员指定的地址就是物理地址,物理地址对程原创 2013-05-21 11:42:18 · 13147 阅读 · 2 评论 -
汇编基础——常用寄存器及其用途
通用寄存器的主要用途寄存器的分类寄存器主 要 用 途通用寄存器数据 寄存器AX乘、除运算,字的输入输出,中间结果的缓存AL字节的乘、除运算,字节的输入输出,十进制算术运算AH字节的乘、除运原创 2013-05-14 19:50:08 · 2060 阅读 · 2 评论 -
bochs调试方法与指令详解
bochs调试FAQ:一 基本调试命令1. Q:如何从引导扇区开始设置断点?A: BIOS被载入内存中运行,其引导扇区的地址一般都是在0x7c00,因为在实模式下,逻辑地址和物理地址是一一对应的, 所以我们可以在启动bochs调试的命令行下输入 pb 0x7c00 或者 vb 0:0x7c00就着输入 cbochs就会在0x7c0原创 2013-05-27 10:11:11 · 3603 阅读 · 0 评论 -
保护模式及其编程——任务管理
摘要:任务是处理器可以分配、调度、执行和挂起的一个工作单元。用于可执行程序、任务或者进程、操作系统服务、中断或者异常处理过程和内核代码。通过中断、异常、跳转或者调用我们可以执行一个任务。任务描述符表中与任务相关的描述符有任务状态描述符和任务门,当执行权转移到上述任何一种描述符的时候,将会造成任务切换。任务切换很像过程调用,但是会保存更多的处理器信息。任务切换几乎要保存所有的处理器寄存器信息原创 2014-02-23 21:01:47 · 2052 阅读 · 0 评论 -
32位处理器内寄存器简介
摘要:在32位CPU中,还有各种各样的寄存器。一些寄存器是通用的,一些寄存器是专用的。一些指令如add、loop,如果后面没有完整的寄存器操作数,说明它们使用了隐含的操作数,这样的话,我们需要对每个寄存器的常规用途比较了解。本文,主要是一个汇总和浅要介绍,帮你理清32位寄存器的主要用途。原创 2014-02-24 15:33:31 · 1502 阅读 · 0 评论 -
《自己动手写操作系统》源码解析——第三章pmtest5.asm
在pmtest4中,我们已经看到,对于非一致性代码,如何从低特权级转移向高特权级。但是我们该怎样从高特权级别,转移到低特权级别呢?一开始我们在实模式,是ring 0,我们怎样从ring 0到ring3 ,这个通过call和jmp没法做到,我们该通过什么方式实现?本文,主要是为你解答这些疑问,展现实现这种特权级别转移的方法。通过本节,你将学会如何在特权级之间自由切换。一、预备理论1.原创 2014-02-27 17:59:10 · 2508 阅读 · 0 评论