認識作業系統 一

2021-08-22 02:14:02 字數 2959 閱讀 6488

聲名,其中有很**是載自《自己動手寫作業系統》,作為讀書的筆跡吧~~

高中的時候就口出狂言,要寫乙個作業系統.

到現在還不知道操具體為合物.索性,買了本作業系統的書看《自己動手寫作業系統》.乙個月的囫圇吞棗的瀏覽了一遍這本書,對於我這個彙編還沒有入門的人來說,很多地方還是不勝明白?

雖對作業系統有了大概的了解,為求勝解,無奈,再看一遍吧~~

看到第三章保護模式,被gdt,ldt,idt,ldtr~~~~搞得頭暈,

上網搜尋資料,也有很多詳細的介紹,看似詳細,或許真要叫真,問他到底是為什麼要這樣?或者也是照抄某段著作吧?繼續搜尋,發現csdn裡面居然沒有作業系統板塊,歐到彙編,發現一人號召建立一彙編板塊,欣然奮起支援.發現**,上面有些不錯的資料,或許不錯, 發現一篇 寫你自己的作業系統(前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]

中,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考慮,

先寫到這裡,明天繼續

作業系統(一)

1.01 歷史 1.02 分類 作業系統 桌面作業系統 redhat fedora slackware ubuntu debian suse linux centos 伺服器作業系統 linux ubuntu deepin startos mint debain suse redhat centos...

作業系統(一)

1 單道批處理系統 batch processing system 2 多道批處理系統 multiprogrammed batch processing system 3 分時系統 time sharing system 程序控制 為作業建立程序 撤銷已結束的程序 控制程序狀態轉換。程序同步 為多個...

作業系統(一)

1.設計現代os的主要目標是什麼?方便性 有效性 可擴充性和開放性 2.os的作用可表現在那幾個方面?os作為使用者與計算機硬體系統之間的介面 os作為計算機系統資源的管理者 os 實現了對計算機資源的抽象 3.為什麼說作業系統實現了對計算機資源的抽象?os首先在裸機上覆蓋一層i o裝置管理軟體,由...