认识操作系统(一)

声名,其中有很代码是载自<自己动手写操作系统>,作为读书的笔迹吧~~

高中的时候就口出狂言,要写一个操作系统.

到现在还不知道操具体为合物.索性,买了本操作系统的书看《自己动手写操作系统》.一个月的囫囵吞枣的浏览了一遍这本书,对于我这个汇编还没有入门的人来说,很多地方还是不胜明白?

虽对操作系统有了大概的了解,为求胜解,无奈,再看一遍吧~~

看到第三章保护模式,被GDT,LDT,IDT,ldtr~~~~搞得头晕,

上网搜寻资料,也有很多详细的介绍,看似详细,或许真要叫真,问他到底是为什么要这样?或者也是照抄某段著作吧?继续搜寻,发现csdn里面居然没有操作系统板块,欧到汇编,发现一人号召创建一汇编板块,欣然奋起支持.发现http://www.xemean.net/resource/ 网站,上面有些不错的资料,或许不错, 发现一篇 写你自己的操作系统(前6课) 国人 Kasi 翻译  Joel Gompert的作品 <Write Your Own Operating System Tutorial>,才感觉和<自己动手写操作系统>颇有几分相似~~姑且叫做相似吧,更深的含义也不去揣摩了,和一个朋友说起,这么年轻的人写这样的书或许早了点.或许吧~~~~这个也不关我的事,有书看就行了,有中文书看,就更好,写得好一点的中文书,那就更好了.姑且认为是叫做写吧,翻译得好的也不错~~~~~虽然看 候捷 大师翻译书籍台湾味颇浓,毕竟都是中文,台湾大陆都是一家,也就看得明白了~~

转入正题,保护模式

看到代码----<自>---p38

; pmtest1.asm
; 编译方式:nasm pmtest1.asm -o pmtest1.com

%include   "pm.inc"  ;  常量、宏,以及一些说明
org 0100h
    jmp LABEL_BEGIN

[SECTION .gdt]
; GDT
LABEL_GDT:          Descriptor 0, 0, 0      ; 空描述符
LABEL_DESC_CODE32:  Descriptor 0, SegCode32Len-1, DA_C + DA_32 ; 代码段,32位
LABEL_DESC_VIDEO:   Descriptor 0B800h, 0ffffh, DA_DRW ; 显存首地址

; GDT 结束

GdtLen    equ $ - LABEL_GDT   ; GDT长度
GdtPtr    dw  GdtLen -1       ; GDT界限
          dd  0
; GDT 选择子
SelectorCode32      equ LABEL_DESC_CODE32 - LABEL_GDT
SelectorVideo       equ LABEL_DESC_VIDEO  - LABEL_GDT
; END OF [SECTION .gdt]
[SECTION .s16]
[BITS 16]
LABEL_BEGIN:
   mov ax, cs
   mov ds, ax
   mov es, ax
   mov ss, ax
   mov sp, 0100h

   ; 初始化32位代码段描述符
   xor eax, eax
   mov ax, cs
   shl eax, 4
   add eax, LABEL_SEG_CODE32
   mov word [LABEL_DESC_CODE32+2], ax
   shr eax, 16
   mov byte [LABEL_DESC_CODE32+4], al
   mov byte [LABEL_DESC_CODE32+7], ah
  
   ; 为加载gdtr做准备
   xor eax, eax
   mov ax, ds
   shl eax, 4
   add eax, LABEL_GDT                    ; eax <- gdt 基地址
   mov dword [GdtPtr+2], eax             ; [GdtPtr+2] <- gdt 基地址

   ; 加载gdtr
   lgdt [GdtPtr]

   ; 关中断
   cli
  
   ; 打开地址线A20
   in  al, 92h
   or  al, 00000010b
   out 92h, al

   ; 准备进入保护模式
   mov eax, cr0
   or  eax, 1
   mov cr0, eax

   ; 真正计入保护方式
   jmp dword SelectorCode32:0              ; 执行这一句会把SelectorCode32
                                           ; 装入cs,并跳转到SelectorCode32:0 处

[SECTION  .s32] ; 32位代码段,由实模式跳入
[BITS  32]

LABEL_SEG_CODE32:
   mov ax, SelectorVideo
   mov gs, ax                              ; 视频段选择子(目的)
  
   mov edi, (80 * 10 + 0) * 2              ; 屏幕第10行,第0行
   mov ah, 0Ch                             ; 0000:黑底  1100:红字
   mov al, 'P'      
   mov [gs:edi], ax
  
   ; 到此停止
   jmp $
SegCode32Len           equ $-LABEL_SEG_CODE32
; END OF [SECTION .s32]

中,

  mov ax, cs
   mov ds, ax
   mov es, ax
   mov ss, ax
   mov sp, 0100h

不明白其意,为何要把其他寄存器的值都指向CS?

后经Orion和Peter点拨才明白,ds,es,ss,sp都可以指向其他的地方,只有在初试的时候保证他们都指向同一个段,才能保证取出的数据不会出错.

再看到

   ; 初始化32位代码段描述符
   xor eax, eax
   mov ax, cs
   shl eax, 4
   add eax, LABEL_SEG_CODE32
   mov word [LABEL_DESC_CODE32+2], ax
   shr eax, 16
   mov byte [LABEL_DESC_CODE32+4], al
   mov byte [LABEL_DESC_CODE32+7], ah

时不明白其理,为何要

mov ax,cs
shl eax,4

根据初始化ds,es……,想明白,要保证ax指向的cs正确的代码段,后面的shl eax,4是为了保证在实模式下seggemnet:offset考虑,

先写到这里,明天继续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值