- 博客(34)
- 资源 (3)
- 收藏
- 关注
原创 linux0.11学习3之head
下面给出head部分的nasm源代码。其中的stack_start,main,printk都只是用于测试,,并不是linux中的,因为现在main等函数还没有。head.asmbits 32[section .text]global _idt,_gdt,_pg_dir,_tmp_floppy_area_pg_dir:startup_32:mov eax,0x10 ;设置段寄
2012-05-15 10:41:49
1058
原创 linux0.11学习2之setup
setup.asm上一篇文章中的setup是用于测试的,不是linux中的setup。现在给出linux中的setup的源代码(nasm实现);;setup.asm[section .data]INITSEG equ 0x9000SYSSEG equ 0x1000SETUPSEG equ 0x9020[section .text]mov ax,INITSEG ;将系统数据放
2012-05-13 16:29:52
907
原创 linux0.11学习1之bootsect
前段时间参考《自己动手写操作系统》来写操作系统,对操作系统有了更加深刻的认识。现在打算研读linux 0.11的源代码(参考书目:《Linux内核完全注释(修正版v1.9.5)》,《Linux_内核设计的艺术》)。由于linux 0.11源代码的汇编部分,有类似于intel的汇编还有AT&T汇编,本人对nasm比较熟悉,所以打算把汇编部分全部改为nasm汇编来实现。 现在给出li
2012-05-12 18:01:59
2642
原创 专注于于操作系统31之用boch调试系统内核
先下载安装boch,在安装时选择full(with DLX Linux Demo ),我安装是bochs2.5. 在bochs-2.5的文件夹下建立一个文件夹Tnix ,然后将bochs-2.5文件夹下的所有文件复制到Tinix下,然后,打开Tinix文件夹下的dlxlinux文件夹,把Tinix复制到该文件夹下。接下来,修改该文件夹下的bochsrc.bxrc, 把floppya: 1_44=
2012-03-26 18:32:37
1064
原创 专注于操作系统30之把控制权交给kernel
在上一篇文章中,我们只是将kernel加载到了内存,并没有转到kernel执行。由于,我们后面的kernel是在linux下编译和连接的,是elf文件格式。有关elf文件格式的内容请参考elf文件格式。我们需要先像加载loader一样把kernel加载到内存,然后根据elf文件格式,把kernel中的相应的段加载到内存中的相应的位置,然后,跳到kernel执行。 下面给出loader.a
2012-03-25 16:22:26
1045
原创 专注于操作系统29之从loader进入保护模式并分页
在上一篇文章中loader将kernel加载到了内存,在这里我们还要在loader中进入保护模式并启动分页。代码我们可以不用写了,只需复制粘贴即可,把第20篇文章启动分页的代码复制到上一篇文章loader.asm中就可以了。 新的loader.asm的源代码如下:org 0100h;=============================================
2012-03-24 14:27:04
1229
原创 专注于操作系统28之用loader加载kernel
在上一篇文章中已实现了用boot加载loader,并执行loader,loader中的代码只是显示一个‘L’字符。在这里,我们要用loader加载kernel到内存。加载方法和用boot加载loader的方法一样,只是加载的文件名变了(由loader.bin改为kernel.bin),加载到内存的地址变了。 下面只给出loader.asm的源代码,该源代码是《自己动手写操作系统》上
2012-03-24 12:51:45
1431
原创 专注于操作系统27之对GetFATEntry函数的理解
在《自己动手写操作系统》的第四章中作者给出了这个函数。作者说这个函数的输入是扇区号,输出是其对应的fat项的值。我觉得说函数的输入是扇区号让人会产生疑惑,说函数的输入是Sector在FAT中的序号更恰当,在源代码中作者也是这么注释的。还有就是函数中有区别对待ax是奇数还是偶数。ax的值是Sector在FAT中的序号。这个函数的目的是根据这个序号,得到该序号所对应的fat项的值。一个fat项占1.5
2012-03-23 20:53:38
1586
原创 专注于操作系统26之从软盘引导boot,并加载loader
在这篇文章中我们将从软盘镜像中引导操作系统,至于软盘的制作在上一篇文章中已做了介绍。因为要从软盘中加载,就要了解软盘的结构,这里是fat12文件系统。关于fat12文件系统的介绍请参看fat12文件系统。在这我直接给出《自己动手写操作系统》关于这部分的源代码(书中第4章),不过这代码我也在电脑上敲了一遍,这样印象深刻。在这我主要给出执行的步骤,以及在下一篇文章中对源代码中的GetFATEntry函
2012-03-23 19:50:56
1450
原创 专注于操作系统25之软盘镜像
在以后的文章中我们要用到软盘镜像,因为我们是通过软盘来启动操作系统(因为软盘比硬盘更简单,暂时用软盘)的,而现在的计算机又几乎不配软驱,所以我们只有通过虚拟的软盘来启动。在这里我们主要解决3个问题:1.制作虚拟软盘(即软盘镜像),2.格式化软盘镜像,3.向软盘镜像中写入文件 1.制作虚拟软盘。在这是通过WMware来制作的。首先,选择任一个虚拟机,点击edit virtual mac
2012-03-22 22:15:03
1521
原创 专注于操作系统24之boot,loader,kernel
在第6篇文章中,我们已能导入操作系统内核(该内核非常小,姑且称为内核),但也只是在实模式下,没有进入保护模式。前面我们已经学习了关于保护模式的很多内容,所以让操作系统进入保护模式是非常简单的。这里先解释一下boot,loader,kernel的意思和作用。boot是引导程序,它的作用是把loader(loader专门用于加载kernel)加载到内存,执行loader。loader是加载程序,它的作
2012-03-18 11:04:58
1876
原创 专注于操作系统23之中断进阶
在这里我们要实现一个硬件中断,计时器中断。在上一篇文章中我们屏蔽了所有的可屏蔽的中断,在这将打开IRQ0中断,即时钟中断,只需把送入OCW1的内容由原来的11111111b改为11111110b即可。还要修改一下IDT表的内容,增加一个处理时钟中断的程序。所以,我们只需在上篇的代码中修改几行即可。该程序实现的效果是在屏幕的第一行第70列,出现一个不断变化的字符(时钟改变一次,字符也变化一次)。
2012-03-17 13:46:04
915
原创 专注于操作系统22之中断
我们知道中断是计算机非常重要的一部分。那中断是什么的呢?中断就是cpu暂停执行现在的任务,转而去执行更重要或更紧迫的事,执行完后,再返回来执行暂停了的任务。打个比方,你正在做作业时,有人有事找你,你就会暂停执行现在的任务(做作业),转而去处理事情,等事情处理完了,你又回来继续做作业。那怎样启动中断呢?主要有两件事要做:1.建立IDT表(中断描述符表),加载IDT表的信息到IDTR寄存器;2.初始化
2012-03-17 12:49:45
763
原创 专注于操作系统21之分页进阶
在上一篇文章中,我们虽然启动的分页,但我们没感受到分页带来的好处。这里,让我们来体会一下分页带来的其中一点好处,用同一个线性地址去访问不同的物理地址处的程序。再说一下,线性地址到物理地址的转换,先用32位线性地址的高20位去找到一个页表项,再把这个页表项的内容(物理页的地址)加上线性地址的低12位(页内偏移),便得到了物理地址。那怎样用同一个线性地址来访问不同的物理地址呢?我们只需把该线性地址所对
2012-03-15 14:50:01
900
3
原创 专注于操作系统20之启动分页
启动分页的步骤: 1.建立页目录表,2.建立页表,3.将页目录表的地址放到CR3中,4.将CR0中的PG置1表示启动分页。这里建立一个页目录表(有1024项,每一项对应一个页表),建立1024个页表(每个页表有1024项,每一项对应一个物理页)。下面是程序的代码, 参考了《自己动手写操作系统》;;nasm 2.04 ;;nasm fenye.asm -o fenye.comor
2012-03-13 16:43:32
911
原创 专注于操作系统19之走进分页
在保护模式下,还提供了分页机制。为什么要分页呢?在开始的分段中,是静态分配的(也就是说段的大小是固定的),这样使内存不能充分利用(因为如果一个小程序放到了一个较大的段中,这样,这个段就有空闲空间,而这个空闲空间又不能被其它程序利用)。后来引入了动态分配(段的大小可以根据程序大小相应的变化),这解决了内存不能充分利用的问题。但在程序结束后,回收内存时,要将空闲内存连起来,这很麻烦。分页可以很好的解决
2012-03-12 22:23:36
790
原创 专注于操作系统18之完整的特权级转换
在上一篇文章中,我们已经能从ring0级进入到ring3级,在这里我们将再加上从ring3级到ring0级。从ring3级到ring0级这需要使用在第十四篇文章中提到的调用门来实现。即在进入ring3级后,在使用调用门来调用ring0级代码(注意当发生特权级转换时,堆栈是发生了变化的,上一篇文章已说明从ring0级到ring3级堆栈所发生的变化。当从ring3到ring0级时,ring0级堆栈信息
2012-03-08 23:00:49
1025
原创 专注于操作系统17之进入ring3特权级
现在,我们要进行特权级间的跳转,即低特权级代码,调用高特权级的代码;高特权级调用低特权级的代码。我们前面的程序都是在ring0级(特权级最高),所以,我们先实现从高特权级向低特权级的跳转,从ring0级跳到ring3级。 从ring0级进入ring3级时,我们的堆栈是发生了变化了的,即ring0级和ring3级各有各的堆栈。所以,首先我们要建立两个堆栈段,一个ring0级的堆栈段,一个
2012-03-08 22:41:26
1051
原创 专注于操作系统16之搭建dos环境
前面的文章中的代码,都是作为引导程序,在虚拟机中运行的,但引导程序只能有512字节的大小。然而现在的程序已经超过了512字节,所以不能作为引导程序来运行(当然可以通过加载内核的方式来运行,不过这太麻烦了),现在,我们建立一个dos的环境(即在虚拟机中安装一个dos操作系统),把我们的代码编译成后缀名为com的文件(dos系统中的可运行程序)。我们写代码还是在windows系统中,只是在dos中运行
2012-03-08 16:10:26
740
原创 专注于操作系统15之特权级
这里主要看一下CPL,DPL,RPL。要知道它们存放在哪,CPL表示当前代码段的特权级,存放在CS中(cs中放的是段的选择子,后两位表示特权级的大小);DPL表示被访问段的特权级,放在被访问段的描述符中;RPL放在选择符的最低两位。 访问时,要求CPL和RPL中最大的一个要小于被访问段的DPL。(DPL,CPL,RPL的值越大,表示的特权级就越小)。 再说一下,一致代码段和非一致代码段
2012-03-05 22:25:20
692
原创 专注于操作系统14之初识调用门
在这篇我们将利用调用门来调用代码。调用门也有选择子和描述符,注意这里的描述符和前面的有所不同,这里的描述符是由段选择子,段内偏移(前面段选择子所指向的段),属性等等组成。 这里在前面代码的基础上,增加了一个段(通过调用门所调用的段)。在后面的文章中将利用调用门来进行不同特权级间的调用。下面是代码:;;nasm 2.07;;nasm ldt.asm -o ldt.imgorg 07c
2012-03-05 22:06:07
1445
原创 专注于操作系统13之LDT
前面在保护模式下,我们所使用的段都是用GDT表描述的,在这里我们将使用LDT表描述的段。一个系统中,GDT表有且只有一个,而LDT表可以没有,也可以有多个。在这里,只建立一个LDT表,我们只需在上一篇代码的基础上加入一些代码就可以了。我们需要加入的代码主要有:1.在GDT表中建立一个LDT表的描述符;2.建立一个LDT表,注意在LDT表中的描述符的选择子的TI是等于1的,表示该选择子将在LDT表中
2012-03-05 17:51:26
1063
原创 专注于操作系统12之回到实模式
前面我们实现了从实模式到保护模式的转换,现在来实现实模式到保护模式的转换。转换需注意:要从16位的代码段返回实模式,所以在转换代码中加了一段16位代码(即先从保护模式进入到这个16位代码段,再由这个16位代码段转换到实模式);在转换到实模式前,需将段寄存器标准化(属性为可读写,大小为0ffffh),这里用了一个normal描述符来实现.以下代码参照了《自己动手写操作系统》。
2012-03-04 15:39:12
788
原创 专注于操作系统11之保护模式进阶
在上一篇中,我们已经完成了从实模式到保护模式的转变,并且还在保护模式下,输出了一个字符,但这在实模式下也能做到。这没体现出保护模式的优势,现在我们要充分利用保护模式的优势,完成向内存大地址(比如5M的地址)的读写(实模式只能寻址1M,保护模式能寻址4G)。下面的代码是参照了《自己动手写操作系统》,但我在这里把它更加的简化了,只保留了我们需要关心的部分,即完成向内存大地址的读写,只需在上一篇代码中加
2012-03-04 11:42:01
840
原创 专注于操作系统10之走进保护模式
首先说一下,从实模式进入保护模式的步骤。 1.建立GDT表,也就是填上段描述符。(此处不考虑描述LDT表的描述符,TSS描述符)。 2.把GDT表的信息,也就是GDT表的基地址,和表限信息装入GDTR。 3.打开A20地址线,因为在实模式下只用了20根地址线,而保护模式下要用32根,所以要将另外的地址线打开。 4.将CR0的PE置1表示CPU处于
2012-02-28 22:58:39
906
3
原创 专注于操作系统9之保护模式基础知识b
在这介绍一下,控制寄存器,CR0,CR1,CR2,CR3。它们是用来存放全局特性的机器状态,如是否分页,处于实模式还是保护模式等等。这里特别注意,CR0中的PE,当PE=1时,系统在保护模式下运行,PE=0时,系统在实模式下运行。这在后面由实模式转换到保护模式时要用到。CR1为后来的intel CPU 保留CR2 放页故障的线性地址CR3 放当前任务的页目录表的基址。
2012-02-28 17:39:54
557
原创 专注于操作系统8之保护模式基础知识a
要知道保护模式下地址的变换,就要知道几张表,和几个寄存器。三张表GDT,LDT,IDT。四个寄存器GDTR,LDTR,IDTR,TR。先区分两个名词,描述符和选择符。描述符是用来描述一个段,包括段的基地址,段限,段的属性。选择符是用来查找描述符用的。 GDT是全局描述符表,这个表只有一张。其中有段的描述符,LDT的描述符(描述LDT表的位置,长度等),TSS描述符(描述任务的状态信息,
2012-02-27 22:30:29
735
原创 专注于操作系统7之初识保护模式
前面的引导程序,操作系统内核都是在实模式下运行的。实模式是32位cpu的一种工作模式,它还有保护模式,虚拟8086模式。而我们所常用的操作系统,如windows,linux都是在保护模式下运行的。那为什么,还要有实模式?这是为了兼容以前的16位cpu,让在16位cpu上运行的程序,也能在32位cpu上运行。 保护模式和实模式有什么区别呢?第一,保护模式的寻址范围更大,实模式下有1M的寻
2012-02-27 21:17:07
619
原创 专注于操作系统6之导入操作系统内核
前面的引导程序,只是显示了一个字符串,但它还没执行它的主要任务,即导入操作系统内核。当然这里的操作系统的内核是非常简单的,在这主要是说明导入的过程。下面是引导程序和操作系统内核的代码。引导程序 myboot.asm 的代码;;nasm 2.07 汇编org 7c00Hcall welcome ;调用欢迎模块,显示欢迎字符call loadkernel ;导入操作
2012-02-26 12:04:36
953
2
原创 专注于操作系统5之引导程序代码
这里给出一个很简单的引导程序代码,它功能是先显示一段字符,并允许通过键盘输入字符,并显示在屏幕上,还没引导操作系统。这段代码是我看过《自己动手写操作系统》后,根据理解自己写的,在VMware虚拟机机中实现的(因为这段引导程序是以软盘作为引导盘的,而现在的计算机几乎都不用软盘,所以,只能通过虚拟机来实现) 知道16位汇编,知道中断,就非常简单了,这个可看一下王爽老师的《汇编语言》,相当的经典。关于B
2012-02-25 11:38:05
1303
原创 专注于操作系统4之引导程序
以通过硬盘的启动为例,引导程序放在硬盘(假设放在c盘)的首扇区(0号柱面,0号磁头,1号扇区), 它只有且只能有512字节的大小。BIOS怎么知道它是不是引导扇区呢? 只要首扇区中的程序满足,有512字节的大小,并且以0aa55H 这两个字节作为结尾, 那么该程序就是引导程序, 它所在的这个首扇区就是引导扇区。 因为这个程序是如此的小,所以,它做不了太多事, 它主要功能是跳到操作系统代码的入口地址
2012-02-25 10:15:14
784
原创 专注于操作系统3之计算机的启动过程
我们使用计算机,都是在操作系统下来用的,如windows,linux等,那操作系统是怎样从没有到有的呢?那就需要了解一下计算机的启动过程。 操作系统也是一个程序,也是由一段代码组成,在计算机没启动之前,它是放在硬盘上的。我们要启动操作系统,就要知道它在硬盘上的位置,而这个位置由硬盘上的引导扇区给出。引导扇区上存放的也是一段代码,叫引导程序,它来负责把操作系统调入内存,运行起来。计算机加
2012-02-25 09:49:25
988
原创 专注于操作系统2之操作系统的从无到有b
4.多道程序设计 早期的CPU只有一个核,这时CPU中只能运行一个程序的代码。一个程序总的来说会有3部分操作:输入,计算,输出。而输入,输出是不需占用CPU的。假如,有一个程序运行一段时间后,需要用户输入一个数据,才能继续运行下去。而输入的过程是缓慢的(相对与高速的CPU来说)。输入时,CPU便处于空闲状态,这便没有充分的利用CPU。如果让空闲的CPU再去运行另一个程序,等用户输入完成
2012-02-23 22:30:33
778
1
原创 专注于操作系统1之操作系统的从无到有a
1.纯手工 计算机最终处理的都是0和1的序列,因此给计算机处理的程序最终也是0和1的序列。早期是将0和1的序列记录在打孔的纸带上,比如有孔表示0,无孔表示1。运行程序的过程是先将要输入的程序记录到打孔的纸带上,然后,将纸带送入计算机进行处理,等计算机运行完程序,得出结果,并将结果打印到纸上,这时便可以输入下一个程序。 纯手工阶段,cup的利用率非常低,因为它既要读纸带,
2012-02-23 21:57:44
773
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人