自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大道至简的专栏

操作系统,linux嵌入式

  • 博客(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 998 2

原创 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 840

原创 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 2529

原创 专注于于操作系统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 1016

原创 专注于操作系统30之把控制权交给kernel

在上一篇文章中,我们只是将kernel加载到了内存,并没有转到kernel执行。由于,我们后面的kernel是在linux下编译和连接的,是elf文件格式。有关elf文件格式的内容请参考elf文件格式。我们需要先像加载loader一样把kernel加载到内存,然后根据elf文件格式,把kernel中的相应的段加载到内存中的相应的位置,然后,跳到kernel执行。    下面给出loader.a

2012-03-25 16:22:26 1004

原创 专注于操作系统29之从loader进入保护模式并分页

在上一篇文章中loader将kernel加载到了内存,在这里我们还要在loader中进入保护模式并启动分页。代码我们可以不用写了,只需复制粘贴即可,把第20篇文章启动分页的代码复制到上一篇文章loader.asm中就可以了。     新的loader.asm的源代码如下:org 0100h;=============================================

2012-03-24 14:27:04 1176

原创 专注于操作系统28之用loader加载kernel

在上一篇文章中已实现了用boot加载loader,并执行loader,loader中的代码只是显示一个‘L’字符。在这里,我们要用loader加载kernel到内存。加载方法和用boot加载loader的方法一样,只是加载的文件名变了(由loader.bin改为kernel.bin),加载到内存的地址变了。       下面只给出loader.asm的源代码,该源代码是《自己动手写操作系统》上

2012-03-24 12:51:45 1365

原创 专注于操作系统27之对GetFATEntry函数的理解

在《自己动手写操作系统》的第四章中作者给出了这个函数。作者说这个函数的输入是扇区号,输出是其对应的fat项的值。我觉得说函数的输入是扇区号让人会产生疑惑,说函数的输入是Sector在FAT中的序号更恰当,在源代码中作者也是这么注释的。还有就是函数中有区别对待ax是奇数还是偶数。ax的值是Sector在FAT中的序号。这个函数的目的是根据这个序号,得到该序号所对应的fat项的值。一个fat项占1.5

2012-03-23 20:53:38 1507 1

原创 专注于操作系统26之从软盘引导boot,并加载loader

在这篇文章中我们将从软盘镜像中引导操作系统,至于软盘的制作在上一篇文章中已做了介绍。因为要从软盘中加载,就要了解软盘的结构,这里是fat12文件系统。关于fat12文件系统的介绍请参看fat12文件系统。在这我直接给出《自己动手写操作系统》关于这部分的源代码(书中第4章),不过这代码我也在电脑上敲了一遍,这样印象深刻。在这我主要给出执行的步骤,以及在下一篇文章中对源代码中的GetFATEntry函

2012-03-23 19:50:56 1395 1

原创 专注于操作系统25之软盘镜像

在以后的文章中我们要用到软盘镜像,因为我们是通过软盘来启动操作系统(因为软盘比硬盘更简单,暂时用软盘)的,而现在的计算机又几乎不配软驱,所以我们只有通过虚拟的软盘来启动。在这里我们主要解决3个问题:1.制作虚拟软盘(即软盘镜像),2.格式化软盘镜像,3.向软盘镜像中写入文件      1.制作虚拟软盘。在这是通过WMware来制作的。首先,选择任一个虚拟机,点击edit virtual mac

2012-03-22 22:15:03 1332

原创 专注于操作系统24之boot,loader,kernel

在第6篇文章中,我们已能导入操作系统内核(该内核非常小,姑且称为内核),但也只是在实模式下,没有进入保护模式。前面我们已经学习了关于保护模式的很多内容,所以让操作系统进入保护模式是非常简单的。这里先解释一下boot,loader,kernel的意思和作用。boot是引导程序,它的作用是把loader(loader专门用于加载kernel)加载到内存,执行loader。loader是加载程序,它的作

2012-03-18 11:04:58 1658 1

原创 专注于操作系统23之中断进阶

在这里我们要实现一个硬件中断,计时器中断。在上一篇文章中我们屏蔽了所有的可屏蔽的中断,在这将打开IRQ0中断,即时钟中断,只需把送入OCW1的内容由原来的11111111b改为11111110b即可。还要修改一下IDT表的内容,增加一个处理时钟中断的程序。所以,我们只需在上篇的代码中修改几行即可。该程序实现的效果是在屏幕的第一行第70列,出现一个不断变化的字符(时钟改变一次,字符也变化一次)。

2012-03-17 13:46:04 853

原创 专注于操作系统22之中断

我们知道中断是计算机非常重要的一部分。那中断是什么的呢?中断就是cpu暂停执行现在的任务,转而去执行更重要或更紧迫的事,执行完后,再返回来执行暂停了的任务。打个比方,你正在做作业时,有人有事找你,你就会暂停执行现在的任务(做作业),转而去处理事情,等事情处理完了,你又回来继续做作业。那怎样启动中断呢?主要有两件事要做:1.建立IDT表(中断描述符表),加载IDT表的信息到IDTR寄存器;2.初始化

2012-03-17 12:49:45 715

原创 专注于操作系统21之分页进阶

在上一篇文章中,我们虽然启动的分页,但我们没感受到分页带来的好处。这里,让我们来体会一下分页带来的其中一点好处,用同一个线性地址去访问不同的物理地址处的程序。再说一下,线性地址到物理地址的转换,先用32位线性地址的高20位去找到一个页表项,再把这个页表项的内容(物理页的地址)加上线性地址的低12位(页内偏移),便得到了物理地址。那怎样用同一个线性地址来访问不同的物理地址呢?我们只需把该线性地址所对

2012-03-15 14:50:01 844 4

原创 专注于操作系统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 874

原创 专注于操作系统19之走进分页

在保护模式下,还提供了分页机制。为什么要分页呢?在开始的分段中,是静态分配的(也就是说段的大小是固定的),这样使内存不能充分利用(因为如果一个小程序放到了一个较大的段中,这样,这个段就有空闲空间,而这个空闲空间又不能被其它程序利用)。后来引入了动态分配(段的大小可以根据程序大小相应的变化),这解决了内存不能充分利用的问题。但在程序结束后,回收内存时,要将空闲内存连起来,这很麻烦。分页可以很好的解决

2012-03-12 22:23:36 746

原创 专注于操作系统18之完整的特权级转换

在上一篇文章中,我们已经能从ring0级进入到ring3级,在这里我们将再加上从ring3级到ring0级。从ring3级到ring0级这需要使用在第十四篇文章中提到的调用门来实现。即在进入ring3级后,在使用调用门来调用ring0级代码(注意当发生特权级转换时,堆栈是发生了变化的,上一篇文章已说明从ring0级到ring3级堆栈所发生的变化。当从ring3到ring0级时,ring0级堆栈信息

2012-03-08 23:00:49 948

原创 专注于操作系统17之进入ring3特权级

现在,我们要进行特权级间的跳转,即低特权级代码,调用高特权级的代码;高特权级调用低特权级的代码。我们前面的程序都是在ring0级(特权级最高),所以,我们先实现从高特权级向低特权级的跳转,从ring0级跳到ring3级。     从ring0级进入ring3级时,我们的堆栈是发生了变化了的,即ring0级和ring3级各有各的堆栈。所以,首先我们要建立两个堆栈段,一个ring0级的堆栈段,一个

2012-03-08 22:41:26 984 1

原创 专注于操作系统16之搭建dos环境

前面的文章中的代码,都是作为引导程序,在虚拟机中运行的,但引导程序只能有512字节的大小。然而现在的程序已经超过了512字节,所以不能作为引导程序来运行(当然可以通过加载内核的方式来运行,不过这太麻烦了),现在,我们建立一个dos的环境(即在虚拟机中安装一个dos操作系统),把我们的代码编译成后缀名为com的文件(dos系统中的可运行程序)。我们写代码还是在windows系统中,只是在dos中运行

2012-03-08 16:10:26 709

原创 专注于操作系统15之特权级

这里主要看一下CPL,DPL,RPL。要知道它们存放在哪,CPL表示当前代码段的特权级,存放在CS中(cs中放的是段的选择子,后两位表示特权级的大小);DPL表示被访问段的特权级,放在被访问段的描述符中;RPL放在选择符的最低两位。 访问时,要求CPL和RPL中最大的一个要小于被访问段的DPL。(DPL,CPL,RPL的值越大,表示的特权级就越小)。     再说一下,一致代码段和非一致代码段

2012-03-05 22:25:20 650

原创 专注于操作系统14之初识调用门

在这篇我们将利用调用门来调用代码。调用门也有选择子和描述符,注意这里的描述符和前面的有所不同,这里的描述符是由段选择子,段内偏移(前面段选择子所指向的段),属性等等组成。 这里在前面代码的基础上,增加了一个段(通过调用门所调用的段)。在后面的文章中将利用调用门来进行不同特权级间的调用。下面是代码:;;nasm 2.07;;nasm ldt.asm -o ldt.imgorg 07c

2012-03-05 22:06:07 1396

原创 专注于操作系统13之LDT

前面在保护模式下,我们所使用的段都是用GDT表描述的,在这里我们将使用LDT表描述的段。一个系统中,GDT表有且只有一个,而LDT表可以没有,也可以有多个。在这里,只建立一个LDT表,我们只需在上一篇代码的基础上加入一些代码就可以了。我们需要加入的代码主要有:1.在GDT表中建立一个LDT表的描述符;2.建立一个LDT表,注意在LDT表中的描述符的选择子的TI是等于1的,表示该选择子将在LDT表中

2012-03-05 17:51:26 1017 1

原创 专注于操作系统12之回到实模式

前面我们实现了从实模式到保护模式的转换,现在来实现实模式到保护模式的转换。转换需注意:要从16位的代码段返回实模式,所以在转换代码中加了一段16位代码(即先从保护模式进入到这个16位代码段,再由这个16位代码段转换到实模式);在转换到实模式前,需将段寄存器标准化(属性为可读写,大小为0ffffh),这里用了一个normal描述符来实现.以下代码参照了《自己动手写操作系统》。

2012-03-04 15:39:12 761

原创 专注于操作系统11之保护模式进阶

在上一篇中,我们已经完成了从实模式到保护模式的转变,并且还在保护模式下,输出了一个字符,但这在实模式下也能做到。这没体现出保护模式的优势,现在我们要充分利用保护模式的优势,完成向内存大地址(比如5M的地址)的读写(实模式只能寻址1M,保护模式能寻址4G)。下面的代码是参照了《自己动手写操作系统》,但我在这里把它更加的简化了,只保留了我们需要关心的部分,即完成向内存大地址的读写,只需在上一篇代码中加

2012-03-04 11:42:01 804

原创 专注于操作系统10之走进保护模式

首先说一下,从实模式进入保护模式的步骤。     1.建立GDT表,也就是填上段描述符。(此处不考虑描述LDT表的描述符,TSS描述符)。     2.把GDT表的信息,也就是GDT表的基地址,和表限信息装入GDTR。     3.打开A20地址线,因为在实模式下只用了20根地址线,而保护模式下要用32根,所以要将另外的地址线打开。     4.将CR0的PE置1表示CPU处于

2012-02-28 22:58:39 869 3

原创 专注于操作系统9之保护模式基础知识b

在这介绍一下,控制寄存器,CR0,CR1,CR2,CR3。它们是用来存放全局特性的机器状态,如是否分页,处于实模式还是保护模式等等。这里特别注意,CR0中的PE,当PE=1时,系统在保护模式下运行,PE=0时,系统在实模式下运行。这在后面由实模式转换到保护模式时要用到。CR1为后来的intel CPU 保留CR2 放页故障的线性地址CR3 放当前任务的页目录表的基址。

2012-02-28 17:39:54 521

原创 专注于操作系统8之保护模式基础知识a

要知道保护模式下地址的变换,就要知道几张表,和几个寄存器。三张表GDT,LDT,IDT。四个寄存器GDTR,LDTR,IDTR,TR。先区分两个名词,描述符和选择符。描述符是用来描述一个段,包括段的基地址,段限,段的属性。选择符是用来查找描述符用的。     GDT是全局描述符表,这个表只有一张。其中有段的描述符,LDT的描述符(描述LDT表的位置,长度等),TSS描述符(描述任务的状态信息,

2012-02-27 22:30:29 702

原创 专注于操作系统7之初识保护模式

前面的引导程序,操作系统内核都是在实模式下运行的。实模式是32位cpu的一种工作模式,它还有保护模式,虚拟8086模式。而我们所常用的操作系统,如windows,linux都是在保护模式下运行的。那为什么,还要有实模式?这是为了兼容以前的16位cpu,让在16位cpu上运行的程序,也能在32位cpu上运行。     保护模式和实模式有什么区别呢?第一,保护模式的寻址范围更大,实模式下有1M的寻

2012-02-27 21:17:07 574

原创 专注于操作系统6之导入操作系统内核

前面的引导程序,只是显示了一个字符串,但它还没执行它的主要任务,即导入操作系统内核。当然这里的操作系统的内核是非常简单的,在这主要是说明导入的过程。下面是引导程序和操作系统内核的代码。引导程序 myboot.asm 的代码;;nasm 2.07 汇编org 7c00Hcall welcome ;调用欢迎模块,显示欢迎字符call loadkernel ;导入操作

2012-02-26 12:04:36 917 2

原创 专注于操作系统5之引导程序代码

这里给出一个很简单的引导程序代码,它功能是先显示一段字符,并允许通过键盘输入字符,并显示在屏幕上,还没引导操作系统。这段代码是我看过《自己动手写操作系统》后,根据理解自己写的,在VMware虚拟机机中实现的(因为这段引导程序是以软盘作为引导盘的,而现在的计算机几乎都不用软盘,所以,只能通过虚拟机来实现) 知道16位汇编,知道中断,就非常简单了,这个可看一下王爽老师的《汇编语言》,相当的经典。关于B

2012-02-25 11:38:05 1258 3

原创 专注于操作系统4之引导程序

以通过硬盘的启动为例,引导程序放在硬盘(假设放在c盘)的首扇区(0号柱面,0号磁头,1号扇区), 它只有且只能有512字节的大小。BIOS怎么知道它是不是引导扇区呢? 只要首扇区中的程序满足,有512字节的大小,并且以0aa55H 这两个字节作为结尾, 那么该程序就是引导程序, 它所在的这个首扇区就是引导扇区。 因为这个程序是如此的小,所以,它做不了太多事, 它主要功能是跳到操作系统代码的入口地址

2012-02-25 10:15:14 751

原创 专注于操作系统3之计算机的启动过程

我们使用计算机,都是在操作系统下来用的,如windows,linux等,那操作系统是怎样从没有到有的呢?那就需要了解一下计算机的启动过程。     操作系统也是一个程序,也是由一段代码组成,在计算机没启动之前,它是放在硬盘上的。我们要启动操作系统,就要知道它在硬盘上的位置,而这个位置由硬盘上的引导扇区给出。引导扇区上存放的也是一段代码,叫引导程序,它来负责把操作系统调入内存,运行起来。计算机加

2012-02-25 09:49:25 956 1

原创 专注于操作系统2之操作系统的从无到有b

4.多道程序设计     早期的CPU只有一个核,这时CPU中只能运行一个程序的代码。一个程序总的来说会有3部分操作:输入,计算,输出。而输入,输出是不需占用CPU的。假如,有一个程序运行一段时间后,需要用户输入一个数据,才能继续运行下去。而输入的过程是缓慢的(相对与高速的CPU来说)。输入时,CPU便处于空闲状态,这便没有充分的利用CPU。如果让空闲的CPU再去运行另一个程序,等用户输入完成

2012-02-23 22:30:33 750 2

原创 专注于操作系统1之操作系统的从无到有a

1.纯手工      计算机最终处理的都是0和1的序列,因此给计算机处理的程序最终也是0和1的序列。早期是将0和1的序列记录在打孔的纸带上,比如有孔表示0,无孔表示1。运行程序的过程是先将要输入的程序记录到打孔的纸带上,然后,将纸带送入计算机进行处理,等计算机运行完程序,得出结果,并将结果打印到纸上,这时便可以输入下一个程序。      纯手工阶段,cup的利用率非常低,因为它既要读纸带,

2012-02-23 21:57:44 710

MS-DOS 7.1精简版IMG镜像

dos操作系统的IMG镜像文件 用的着的请下载

2012-03-08

经典汇编语言 王爽著

汇编语言的经典之作,看了就知道。从此汇编不再那么难。

2011-12-05

win32dll对话框的创建与调用

dll对话框的创建同普通对话框程序非常类似。调用采用的是动态调用

2011-11-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除