OpenHero 开勇

Open heart, bravely fly!

用户操作
[即时聊天] [发私信] [加为好友]
OpenHero 开勇ID:OpenHero
239705次访问,排名270好友202人,关注者213
OpenHero的文章
原创 241 篇
翻译 2 篇
转载 51 篇
评论 476 篇
OpenHero 开勇的公告
有事留言
最近评论
SnowBirdBird:才子....
nicole_yaoyao:家乡,一个可以触及我们心底最柔软地方的词
XiaoG602:谢谢前辈了,正为这个烦呢,能交流一下比赛经验么?谢谢了
qdzhouhanqing:受益匪浅,看过编程手册没太看懂,一看你的文章,真是太形象了,呵呵,学习中~
Evelyn:請問以Wizard產生的cuda dll,可以給vb.net call嗎?我要如何做呢?依照c#例子來寫似乎不可行,謝謝!
文章分类
收藏
    相册
    MetaWeblog API
    相册
    自己
    参与的开源项目
    Scilab Robotics Toolbox
    常去的几个地方
    Robocup 机器人足球官方站点
    RTSJ
    感兴趣的开源项目
    Flash得开源代码
    Robocup server
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 认识操作系统(一)收藏

    新一篇: Oracle 安装的时候java环境配置选项 | 旧一篇: ADO

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

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

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

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

    看到第三章保护模式,被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考虑,

    先写到这里,明天继续

    发表于 @ 2006年02月22日 21:05:00|评论(loading...)|编辑

    新一篇: Oracle 安装的时候java环境配置选项 | 旧一篇: ADO

    评论

    #Cloud_Apex 发表于2006-02-22 22:46:00  IP: 59.38.32.*
    我的blog是操作系统的
    #OpenHero 发表于2006-02-23 09:51:00  IP: 61.48.20.*
    to Cloud_Apex
    收藏你的blog能联系嘛?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © OpenHero 开勇