亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 自己動手寫操作系統.txt

?? 學習(編程技巧_編程知識_程序代碼),是學習編程不可多得的學習精驗
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
boot_buf[510] = 0x55; 
boot_buf[511] = 0xaa; 
floppy_desc = open(“/dev/fd0”, O_RDWR); 
lseek(floppy_desc, 0, SEEK_SET); 
write(floppy_desc, boot_buf, 512); 
file_desc = open(“./sect2”, O_RDONLY); 
read(file_desc, boot_buf, 512); 
close(file_desc); 
lseek(floppy_desc, 512, SEEK_SET); 
write(floppy_desc, boot_buf, 512); 
close(floppy_desc); 
} 


在上一期中,我曾經介紹過如何操作能啟動的軟盤。現在這一個過程稍微有點不同,首先把由bsect.s編譯出來的可執行文件bsect拷貝至軟盤的啟動扇區。然后再把由sect2.s產生的可執行文件sect2拷貝至軟盤的第二個扇區。 

把上述文件置于同一目錄之下,然后分別對其進行編譯,方法如下所示: 

as86 bsect.s -o bsect.o 
ld86 -d bsect.o -o bsect 

對sect2.s文件重復以上的操作,得出可執行文件sect2。編譯write.c,插入軟盤后執行write文件,命令如下所示: 

cc write.c -o write 
./write 

下一步我們要做的事情 

從軟盤啟動以后,可以看到顯示出來的字符串。這是使用了BIOS中斷來完成的。 
我向大家講述了如何使用Linux提供的開發工具在軟盤的啟動扇區寫一些代碼,以及如何調用BIOS的問題。現在,這個操作系統已經越來越接近當年Linus Torvalds的那個具有“歷史意義”的Linux內核了。因此,要馬上把這個系統切換到保護模式之下。 

什么是保護模式 

自從1969年推出第一個微處理器以來,Intel處理器就在不斷地更新換代,從8086、8088、80286,到80386、80486、奔騰、奔騰Ⅱ、奔騰4等,其體系結構也在不斷變化。80386以后,提供了一些新的功能,彌補了8086的一些缺陷。這其中包括內存保護、多任務及使用640KB以上的內存等,并仍然保持和8086家族的兼容性。也就是說80386仍然具備了8086和80286的所有功能,但是在功能上有了很大的增強。早期的處理器是工作在實模式之下的,80286以后引入了保護模式,而在80386以后保護模式又進行了很大的改進。在80386中,保護模式為程序員提供了更好的保護,提供了更多的內存。事實上,保護模式的目的不是為了保護程序,而是要保護程序以外的所有程序(包括操作系統)。 

簡言之,保護模式是處理器的一種最自然的模式。在這種模式下,處理器的所有指令及體系結構的所有特色都是可用的,并且能夠達到最高的性能。 

保護模式和實模式 

從表面上看,保護模式和實模式并沒有太大的區別,二者都使用了內存段、中斷和設備驅動來處理硬件,但二者有很多不同之處。我們知道,在實模式中內存被劃分成段,每個段的大小為64KB,而這樣的段地址可以用16位來表示。內存段的處理是通過和段寄存器相關聯的內部機制來處理的,這些段寄存器(CS、DS、SS和ES)的內容形成了物理地址的一部分。具體來說,最終的物理地址是由16位的段地址和16位的段內偏移地址組成的。用公式表示為: 

物理地址=左移4位的段地址+偏移地址。 

在保護模式下,段是通過一系列被稱之為“描述符表”的表所定義的。段寄存器存儲的是指向這些表的指針。用于定義內存段的表有兩種:全局描述符表(GDT)和局部描述符表(LDT)。GDT是一個段描述符數組,其中包含所有應用程序都可以使用的基本描述符。在實模式中,段長是固定的(為64KB),而在保護模式中,段長是可變的,其最大可達4GB。LDT也是段描述符的一個數組。與GDT不同,LDT是一個段,其中存放的是局部的、不需要全局共享的段描述符。每一個操作系統都必須定義一個GDT,而每一個正在運行的任務都會有一個相應的LDT。每一個描述符的長度是8個字節,格式如圖3所示。當段寄存器被加載的時候,段基地址就會從相應的表入口獲得。描述符的內容會被存儲在一個程序員不可見的影像寄存器(shadow register)之中,以便下一次同一個段可以使用該信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址組成。 
此外,還有一個中斷描述符表(IDT)。這些中斷描述符會告訴處理器到那里可以找到中斷處理程序。和實模式一樣,每一個中斷都有一個入口,但是這些入口的格式卻完全不同。因為在切換到保護模式的過程中沒有使用到IDT,所以在此就不多做介紹了。 

進入保護模式 

80386有4個32位控制寄存器,名字分別為CR0、CR1、CR2和CR3。CR1是保留在未來處理器中使用的,在80386中沒有定義。CR0包含系統的控制標志,用于控制處理器的操作模式和狀態。CR2和CR3是用于控制分頁機制的。在此,我們關注的是CR0寄存器的PE位控制,它負責實模式和保護模式之間的切換。當PE=1時,說明處理器運行于保護模式之下,其采用的段機制和前面所述的相應內容對應。如果PE=0,那么處理器就工作在實模式之下。 

切換到保護模式,實際就是把PE位置為1。為了把系統切換到保護模式,還要做一些其它的事情。程序必須要對系統的段寄存器和控制寄存器進行初始化。把PE位置1后,還要執行跳轉指令。過程簡述如下: 

1.創建GDT表; 

2.通過置PE位為1進入保護模式; 

3.執行跳轉以清除在實模式下讀取的任何指令。 

下面使用代碼來實現這個切換過程。 

需要的東西 

◆ 一張空白軟盤 

◆ NASM編譯器 

下面是整個程序的源代碼: 

org 0x07c00; 起始地址是0000:7c00 
jmp short begin_boot ; 跳過其它的數據,跳轉到引導程序的開始處 
bootmesg db "Our OS boot sector loading ......" 
pm_mesg db "Switching to protected mode ...." 
dw 512 ; 每一扇區的字節數 
db 1 ; 每一簇的扇區數 
dw 1 ; 保留的扇區號 
db 2 
dw 0x00e0 
dw 0x0b40 
db 0x0f0 
dw 9 
dw 18 
dw 2 ; 讀寫扇區號 
dw 0 ; 隱藏扇區號 
print_mesg : 
mov ah,0x13 ; 使用中斷10h的功能13,在屏幕上寫一個字符串 
mov al,0x00 ; 決定調用函數后光標所處的位置 
mov bx,0x0007 ; 設置顯示屬性 
mov cx,0x20 ; 在此字符串長度為32 
mov dx,0x0000 ; 光標的起始行和列 
int 0x10 ; 調用BIOS的中斷10h 
ret ; 返回調用程序 
get_key : 
mov ah,0x00 
int 0x16 ; Get_key使用中斷16h的功能0,讀取下一個字符 
ret 
clrscr : 
mov ax,0x0600 ; 使用中斷10h的功能6,實現卷屏,如果al=0則清屏 
mov cx,0x0000 ; 清屏 
mov dx,0x174f ; 卷屏至23,79 
mov bh,0 ; 使用顏色0來填充 
int 0x10 ; 調用10h中斷 
ret 
begin_boot : 
call clrscr ; 先清屏 
mov bp,bootmesg ; 提供串地址 
call print_mesg ; 輸出信息 
call get_key ; 等待用戶按下任一鍵 
bits 16 
call clrscr ; 清屏 
mov ax,0xb800 ; 使gs指向顯示內存 
mov gs,ax ; 在實模式下顯示一個棕色的A 
mov word [gs:0],0x641 ; 顯示 
call get_key ; 調用Get_key等待用戶按下任一鍵 
mov bp,pm_mesg ; 設置串指針 
call print_mesg ; 調用print_mesg子程序 
call get_key ; 等待按鍵 
call clrscr ; 清屏 
cli ; 關中斷 
lgdt[gdtr] ; 加載GDT 
mov eax,cr0 
or al,0x01 ; 設置保護模式位 
mov cr0,eax ; 將更改后的字送至控制寄存器中 
jmp codesel:go_pm 
bits 32 
go_pm : 
mov ax,datasel 
mov ds,ax ; 初始化ds和es,使其指向數據段 
mov es,ax 
mov ax,videosel ; 初始化gs,使其指向顯示內存 
mov gs,ax 
mov word [gs:0],0x741 ; 在保護模式下顯示一個白色的字符A 
spin : jmp spin ; 循環 
bits 16 
gdtr : 
dw gdt_end-gdt-1 ; gdt的長度 
dd gdt ; gdt的物理地址 
gdt 
nullsel equ $-gdt ; $指向當前位置,所以nullsel = 0h 
gdt0 ; 空描述符 
dd 0 
dd 0 ; 所有的段描述符都是64位的 
codesel equ $-gdt ; 這是8h也就是gdt的第二個描述符 
code_gdt 
dw 0x0ffff ; 段描述符的界限是4Gb 
dw 0x0000 
db 0x00 
db 0x09a 
db 0x0cf 
db 0x00 
datasel equ $-gdt 
data_gdt 
dw 0x0ffff 
dw 0x0000 
db 0x00 
db 0x092 
db 0x0cf 
db 0x00 
videosel equ $-gdt 
dw 3999 
dw 0x8000 ; 基址是0xb8000 
db 0x0b 
db 0x92 
db 0x00 
db 0x00 
gdt_end 
times 510-($-$$) db 0 
dw 0x0aa55 


把上面的代碼存在一個名為abc.asm的文件之中,使用命令nasm abc.asm,將得出一個名為abc的文件。然后插入軟盤,輸入命令:dd if=abc of=/dev/fd0。該命令將把文件abc寫入到軟盤的第一扇區之中。然后重新啟動系統,就會看到如下的信息: 

*Our os booting................ 
* A (棕色) 
* Switching to protected mode.... 
* A (白色) 


對代碼的解釋 

上面給出了所有的代碼,下面我對上述代碼做一些解釋。 

◆ 使用的函數 

下面是代碼中一些函數的說明: 

print_mesg 該子程序使用了BIOS中斷10h的功能13h,即向屏幕寫一字符串。屬性控制是通過向一些寄存器中送入不同的值來實現的。中斷10h是用于各種字符串操作,我們把子功能號13h送到ah中,用于指明要打印一個字符串。al寄存器中的0說明了光標返回的起始位置,0表示調用函數后光標返回到下一行的行首。如果al為1則表示光標位于最后一個字符處。 

顯存被分成了幾頁,在同一時刻只能顯示其中的一頁。bh指明的是頁號;bl則指明要顯示字符的顏色;cx指明要顯示字符串的長度;dx指明光標的位置(即起始的行和列)。所有相關寄存器初始化完成以后,就可以調用BIOS中斷10h了。 

get_key 使用中斷16h的子功能00h,從屏幕得到下一個字符。 

clrscr 該函數使用了中斷10h的另外一個子功能06h,用于輸出開始前清屏。初始化時給al中送入0。寄存器cx和dx指明要清屏的屏幕范圍,在本例中是整個屏幕。寄存器bh指明屏幕填充的顏色,在本例中是黑色。 

◆ 其它內容 

程序一開始是一條短跳轉指令,跳到begin_boot處。在實模式下,在此打印一個棕色的“A”,并且設置一個GDT。切換到保護模式,并且打印一個白色的“A”。這兩種模式使用的都是自己的尋址方法。 

在實模式下,使用段寄存器gs指示顯存位置,我們使用的是CGA顯卡(默認基址是0xb8000)。在代碼中是不是漏了一個0呢?沒有,因為實模式下會提供一個附加的0。這種方式也被80386繼承下來了。A的ASCⅡ是0x41,0x06指明了需要一個棕色的字符。該顯示會一直持續直至按下任意鍵。下面要在屏幕上顯示一句話,告訴使用者下面馬上要進入保護模式了。 

啟動到保護模式,在進行切換時不希望此時有中斷的影響,故要關閉所有的中斷(使用cli來實現)。然后對GDT初始化。在整個切換過程中,對4個描述符進行了初始化。這些描述符對代碼段(code_gdt)、數據和堆棧段(data_gdt),以及為了訪問顯存而對顯示段進行初始化。此外,還會對一個空描述符進行初始化。 

GDT的基址要加載至GDTR系統寄存器之中。gdtr段的第一個字加載的是GDT的大小,在下一個雙字中則加載的是基址。然后,lgdt指令把把gdt段加載至GDTR寄存器中。現在已經做好了切換到保護模式前的所有準備。最后一件事情就是把CR0寄存器的PE位置1。不過,即使這樣還沒有處于保護模式狀態之下。 

設置了PE位以后,還需要通過執行JMP指令來清除處理器指令預取隊列。在80386中,使用指令前總是先將其從內存中取出,并且進行解碼和尋址。然而,當進入保護模式以后,預取指令信息(它還處于實地址模式)就無效了。使用JMP指令的目的就是強迫處理器放棄無效的信息。 

現在,已經在保護模式下了。那么,如何檢測是在保護模式狀態之下呢?讓我們來看一看屏幕上這個白色的字母A。在這里,使用了數據段選擇符(datase1)對數據段和附加段進行了初始化,使用顯示段選擇符(videose1)對gs進行了初始化。告示的字符“A”其ASCⅡ值和屬性位于[gs:0000]處,也就是b8000:0000處。循環語句使得該字符一直在屏幕上顯示,直至重新啟動系統。 

下一步要做的事 

現在,這個操作系統已經工作在保護模式下了,但是實際上它并不實現什么具體的功能。你可以在這個基礎上為它增加各種操作系統所具有的功能。我們自己動手寫操作系統到此也就告一段落。 
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲色图都市小说| 欧美日韩dvd在线观看| 久久99精品久久久久久动态图| 1区2区3区精品视频| 国产亚洲人成网站| 久久亚洲影视婷婷| 亚洲精品在线一区二区| 欧美变态tickling挠脚心| 91精品一区二区三区在线观看| 欧美日韩国产成人在线免费| 欧美人牲a欧美精品| 欧美精品九九99久久| 日韩精品中文字幕在线不卡尤物| 91精品婷婷国产综合久久| 日韩欧美成人午夜| 国产日韩欧美综合在线| 国产精品国产三级国产普通话蜜臀| 国产精品久久久久久亚洲毛片| 综合色中文字幕| 亚洲小少妇裸体bbw| 天堂久久一区二区三区| 狠狠网亚洲精品| 91在线视频官网| 欧美日韩高清在线| 久久精品一区蜜桃臀影院| 日本一区二区免费在线| 亚洲精品大片www| 美女性感视频久久| 成人三级伦理片| 欧美网站一区二区| 精品国产一区二区国模嫣然| 国产精品毛片大码女人| 亚洲国产精品视频| 国产高清不卡一区| 精品视频1区2区3区| 久久青草国产手机看片福利盒子| 成人免费小视频| 精品一区二区三区久久久| eeuss鲁一区二区三区| 欧美日韩精品高清| 久久免费精品国产久精品久久久久| 专区另类欧美日韩| 国产一区二区精品久久| 色综合激情久久| 精品久久国产97色综合| 亚洲国产日韩精品| 成人午夜视频在线观看| 9191久久久久久久久久久| 一区精品在线播放| 国产精品一区一区三区| 欧美日韩极品在线观看一区| 国产精品久久久久婷婷二区次| 日本免费新一区视频| 色成年激情久久综合| 欧美激情综合网| 久久精品久久综合| 欧美精品在欧美一区二区少妇| 国产精品女同一区二区三区| 久久国产福利国产秒拍| 6080国产精品一区二区| 一区二区三区高清| 色综合天天综合狠狠| 国产日韩欧美精品在线| 激情图片小说一区| 日韩欧美国产精品一区| 三级在线观看一区二区 | 欧美性视频一区二区三区| 久久久久久久久久久99999| 日韩综合一区二区| 6080亚洲精品一区二区| 亚洲成a天堂v人片| 欧美日韩精品欧美日韩精品 | 成人av电影在线播放| 欧美成人精品3d动漫h| 日韩激情在线观看| 欧美一区午夜视频在线观看| 亚洲国产精品久久人人爱 | 欧美调教femdomvk| 亚洲免费视频成人| 色综合久久天天| 亚洲在线免费播放| 精品视频免费看| 免费在线看成人av| 2020国产精品| 国产91精品一区二区麻豆网站 | 一区二区三区中文字幕电影| 91网站黄www| 亚洲影视资源网| 在线不卡免费欧美| 精东粉嫩av免费一区二区三区| 欧美成人video| 国产成人av福利| 国产精品成人免费在线| 91视频com| 午夜av一区二区三区| 日韩一区二区高清| 成人免费视频一区| 一区二区三区免费在线观看| 欧美麻豆精品久久久久久| 久久er99精品| 一区二区中文视频| 欧美一级一级性生活免费录像| 久久99九九99精品| 国产精品福利电影一区二区三区四区| 91麻豆成人久久精品二区三区| 亚洲第一综合色| 久久午夜国产精品| 欧美在线|欧美| 久久99精品久久久久久| 综合久久久久久| 日韩视频免费观看高清完整版在线观看 | 丝袜亚洲另类欧美| 国产欧美日韩综合精品一区二区| 色综合av在线| 麻豆精品国产91久久久久久| 国产精品免费久久| 欧美日韩精品三区| 成人av电影观看| 视频一区二区三区在线| 国产精品美女久久久久aⅴ| 欧美挠脚心视频网站| 粉嫩久久99精品久久久久久夜 | 丝袜美腿亚洲一区二区图片| 国产欧美一区在线| 欧美日韩高清影院| 91视频一区二区三区| 不卡av免费在线观看| 日韩高清不卡在线| 亚洲男人的天堂一区二区| 日韩欧美中文字幕公布| 91蜜桃在线观看| 国产成人精品www牛牛影视| 亚洲不卡在线观看| 亚洲欧美日韩在线| 国产欧美日韩精品一区| 日韩免费视频一区二区| 欧美综合视频在线观看| av高清不卡在线| 福利电影一区二区| 精品在线一区二区三区| 日日夜夜免费精品视频| 亚洲人成在线观看一区二区| 国产欧美1区2区3区| 亚洲精品一区二区三区蜜桃下载| 在线观看亚洲专区| 色婷婷综合五月| 一本色道亚洲精品aⅴ| 国产成人av一区二区三区在线| 久久国产精品第一页| 日韩二区三区四区| 热久久一区二区| 日韩中文字幕一区二区三区| 亚洲国产精品一区二区尤物区| 亚洲欧美日韩精品久久久久| 国产精品久久看| 国产精品国产三级国产三级人妇 | 精品少妇一区二区三区日产乱码 | 中文字幕字幕中文在线中不卡视频| 久久久久久久久久看片| 久久夜色精品国产噜噜av| 亚洲精品一区二区精华| 国产三区在线成人av| 久久综合久久综合久久综合| 久久久久久久久一| 国产精品视频在线看| 亚洲欧美精品午睡沙发| 一级中文字幕一区二区| 日韩国产在线观看一区| 免费av网站大全久久| 蜜桃视频在线一区| 国产成人无遮挡在线视频| www.久久精品| 欧美三级视频在线播放| 欧美一三区三区四区免费在线看 | 亚洲欧美色一区| 视频在线在亚洲| 精品一区二区在线免费观看| 国产成人午夜视频| 色美美综合视频| 欧美一二三区精品| 国产婷婷色一区二区三区四区| 国产精品久久久久三级| 精一区二区三区| 91亚洲精品久久久蜜桃| 欧美精品久久久久久久多人混战| 久久综合九色综合欧美亚洲| 国产精品久久久久久久久免费丝袜 | 日韩免费成人网| 欧美国产日韩a欧美在线观看| 一区二区三区中文字幕电影| 久久草av在线| 日本韩国一区二区三区视频| 日韩一区二区精品| 国产精品超碰97尤物18| 免费日韩伦理电影| 91视频观看免费| 久久免费精品国产久精品久久久久 | 精品88久久久久88久久久| 亚洲免费观看高清完整| 激情都市一区二区|