聲名,其中有很**是載自《自己動手寫作業系統》,作為讀書的筆跡吧~~
高中的時候就口出狂言,要寫乙個作業系統.
到現在還不知道操具體為合物.索性,買了本作業系統的書看《自己動手寫作業系統》.乙個月的囫圇吞棗的瀏覽了一遍這本書,對於我這個彙編還沒有入門的人來說,很多地方還是不勝明白?
雖對作業系統有了大概的了解,為求勝解,無奈,再看一遍吧~~
看到第三章保護模式,被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裝置管理軟體,由...