動手學操作系統(三、通過IO接口直接控制顯卡)

動手學操作系統(三、通過IO接口直接控制顯卡)

在之前的學習內容中,我們成功編寫了MBR主引導記錄,在終端上進行了打印顯示,在這一節我們使用MBR通過IO接口來直接控制顯卡輸出字符。

文章目錄

  • 動手學操作系統(三、通過IO接口直接控制顯卡)
    • 1. 什么是IO
    • 2. 顯卡
    • Reference

1. 什么是IO

為了兼容大量的硬件外設,CPU需要增加一“層”來解決不兼容的問題,在CPU和外設之間的這一層就是IO接口,IO接口的形式不限,它可以是電路板,芯片,插槽等等,它的作用就是在CPU和外設之間做相互協調的轉化。

IO接口的功能有:

  • 設置數據緩沖,解決CPU與外設的速度不匹配
  • 設置信號電平轉換電路
  • 設置數據格式轉換
  • 設置時序控制電路來同步CPU和外設
  • 提供地址譯碼

同一時刻,CPU只能和一個IO接口通信,當很多IO接口都需要和CPU通信的時候,需要再增加一“層”來仲裁IO接口的競爭,這個部分就是輸入輸出控制中心(I/O control hub, ICH),一般被稱為南橋芯片。

Image

2. 顯卡

顯卡想必不用過多的介紹,只需要理解我們為什么需要操作顯卡,我們在上一節使用了MBR在實模式下運行,使用了BIOS的0x10中斷來打印了字符串,但是操作系統的正常工作狀態是保護模式,在保護模式下就沒有了中斷向量表,則BIOS的中斷也不能使用了,所以凡是涉及到需要向屏幕打印的操作,我們都需要操作顯卡來實現。

無論哪種顯卡,我們都只關心其向我們提供的可編程接口:IO端口和顯存。

顯卡的顯存地址分布如下

Image

從起始地址0xB80000xBFFFF,這片32KB的內存區域是用于文本顯示的,我們往0xB8000處輸出的字符會直接落到顯存中,顯存中有了數據,顯卡會自動將其顯示到屏幕上,這后續的處理過程交給顯卡自動完成即可,我們不需要關心。

在顯卡的文本模式下,每個字符由2個連續字節組成,一個表示字符本身的ASCII碼,另一個表示該字符的其他顯示特性(顏色、閃爍等)

Image

修改之前的mbr.S文件如下

; ~/d2los/src/mbr.S
; 主引導程序 
;
; LOADER_BASE_ADDR equ 0xA000 
; LOADER_START_SECTOR equ 0x2
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         mov ax,cs      mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax; 清屏
; 利用0x06號功能,上卷全部行,可以清屏。
; -----------------------------------------------------------
; INT 0x10   功能號:0x06    功能描述:上卷窗口
; ------------------------------------------------------
; 輸入:
; AH 功能號= 0x06
; AL = 上卷的行數(如果為0,表示全部)
; BH = 上卷行屬性
; (CL,CH) = 窗口左上角的(X,Y)位置
; (DL,DH) = 窗口右下角的(X,Y)位置
; 無返回值:mov     ax, 0600hmov     bx, 0700hmov     cx, 0               ; 左上角: (0, 0)mov     dx, 184fh           ; 右下角: (80, 25),; 因為VGA文本模式中,一行只能容納80個字符,共25行。; 下標從0開始,所以0x18=24,0x4f=79int     10h                 ; int 10h; 輸出背景色綠色,前景色紅色,并且跳動的字符串"1 MBR"mov byte [gs:0x00],'H'mov byte [gs:0x01],0xA4     ; A表示綠色背景,4表示前景色為紅色mov byte [gs:0x02],'e'mov byte [gs:0x03],0xA4mov byte [gs:0x04],'l'mov byte [gs:0x05],0xA4mov byte [gs:0x06],'l'mov byte [gs:0x07],0xA4mov byte [gs:0x08],'o'mov byte [gs:0x09],0xA4mov byte [gs:0x0A],' 'mov byte [gs:0x0B],0xA4mov byte [gs:0x0C],'W'mov byte [gs:0x0D],0xA4mov byte [gs:0x0E],'r'mov byte [gs:0x0F],0xA4mov byte [gs:0x10],'o'mov byte [gs:0x11],0xA4mov byte [gs:0x12],'l'mov byte [gs:0x13],0xA4mov byte [gs:0x14],'d'mov byte [gs:0x15],0xA4jmp $                       ; 通過無限循環使程序停在此處times 510-($-$$) db 0db 0x55,0xaa

然后編譯,鏈接,執行

cd ~/d2los
nasm -o bin/mbr.bin src/mbr.S 
cd ~/d2los
dd if=./bin/mbr.bin of=~/bochs/bin/hardisk60MB.img bs=512 count=1 conv=notrunc 
~/bochs/bin/bochs -f ~/bochs/bin/bochsrc.disk

執行的效果如下

Image

Reference

[1]《一個64位操作系統的設計與實現》
[2]《操作系統真象還原》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17781.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PostgreSQL Windows 數據庫主從模式 熱同步

1.操作主服務器 1.1修改pg_hba.conf // 這邊就設置所有用戶,所有ip都可以交互 host replication all 0.0.0.0/0 md52.2 創建流復制用戶 // 創建流復制用戶replicator CREATE USER replica REPLICATION LOGIN PASSWORD replica…

邏輯回歸(頭歌)

第1關:邏輯回歸算法大體思想 #encodingutf8import numpy as np#sigmoid函數 def sigmoid(t):#輸入:負無窮到正無窮的實數#輸出:轉換后的概率值#********** Begin **********#result 1.0 / (1 np.exp(-t))#********** End **********#retur…

43、Flink 的 Window Join 詳解

1.Window Join a)概述 Window join 作用在兩個流中有相同 key 且處于相同窗口的元素上,窗口可以通過 window assigner 定義,并且兩個流中的元素都會被用于計算窗口的結果。 兩個流中的元素在組合之后,會被傳遞給用戶定義的 Joi…

外匯天眼:野村證券和Laser Digital與GMO互聯網集團合作發行日元和美元穩定幣

野村控股和Laser Digital將與GMO互聯網集團合作,在日本探索發行日元和美元穩定幣。GMO互聯網集團的美國子公司GMO-Z.com Trust Company, Inc. 在紐約州金融服務部的監管框架下,在以太坊、恒星幣和Solana等主要區塊鏈上發行穩定幣。GMO-Z.com Trust Compa…

MySQL增刪查改進階

數據庫約束表的關系增刪查改 目錄 一.數據庫約束類型 NOT NULL約束類型 UNIQUE 唯一約束 DEFAULT 默認值約束 PRIMARY KEY:主鍵約束 FOREIGN KEY :W外鍵約束 二,查詢 count()兩種用法 sum,avg,max…

Vue3_創建項目

目錄 一、創建vue項目 1.下載vue 2.進入剛才創建的項目 3.安裝依賴 4.運行項目 ?5.打包項目放入生產環境 二、vue項目組成 1.項目文件結構 2.項目重要文件 Vue (發音為 /vju?/,類似 view) 是一款用于構建用戶界面的 JavaScript 框架。它基于標準 HTML、C…

Go語言中實現RSA加解密、簽名驗證算法

隨著互聯網的高速發展,人們對安全的要求也越來越高。密碼學中兩大經典算法,一個是對稱加解密,另一個是非對稱加解密,這里就來分享一下非對稱加密算法的代表:RSA加解密。 在Go語言中實現RSA加解密還是比較簡單的&#…

【安全產品】基于HFish的MySQL蜜罐溯源實驗記錄

MySQL蜜罐對攻擊者機器任意文件讀取 用HFish在3306端口部署MySQL蜜罐 配置讀取文件路徑 攻擊者的mysql客戶端版本為5.7(要求低于8.0) 之后用命令行直連 mysql -h 124.222.136.33 -P 3306 -u root -p 可以看到成功連上蜜罐的3306服務,但進行查詢后會直接lost con…

ai機器人電銷資源有哪些?真的能幫到我們提高效率嗎ai智能語音機器人部署

隨著互聯網科技的發展,各種各樣的科技產物都應用于電銷企業,ai機器人電銷就是其中一個。那么ai機器人電銷可靠嗎?ai機器人電銷資源有哪些?我們一起來看看。 AI機器人在電銷資源方面有以下一些用途和功能: 自動識別潛在…

for循環綁定id,更新html頁面的文字內容

需求&#xff1a;將方法中內容對齊 實現方式 給for循環中每個方法添加一個動態的id在DOM結果渲染完后&#xff0c;更新頁面數據&#xff0c;否則會報錯&#xff0c;找不到對應節點或對應節點為空 <view v-for"(item, index) in itemList" :key"index"…

OWASP十大API漏洞解析:如何抵御Bot攻擊?

新型數字經濟中&#xff0c;API是物聯網設備、Web和移動應用以及業務合作伙伴流程的入口點。然而&#xff0c;API也是犯罪分子的前門&#xff0c;許多人依靠Bot來發動攻擊。對于安全團隊來說&#xff0c;保護API并緩解Bot攻擊至關重要。那么Bot在API攻擊中處于怎樣的地位&#…

香橙派Kunpeng Pro測評

目錄 香橙派Kunpeng Pro開發板試用體驗 觀察理解與適用場景 體驗步驟 試用感受

【ARM+Codesys案例】T3/RK3568/樹莓派+Codesys枕式包裝機運動控制器

枕式包裝機是一種包裝能力非常強&#xff0c;且能適合多種規格用于食品和非食品包裝的連續式包裝機。它不但能用于無商標包裝材料的包裝&#xff0c;而且能夠使用預先印有商標圖案的卷筒材料進行高速包裝。同時&#xff0c;具有穩定性高、生產效率高&#xff0c;適合連續包裝、…

C語言 數組—— 一維數組下標越界問題分析

目錄 數組元素的訪問 一維數組元素的越界訪問 二維數組元素的越界訪問 小結 數組元素的訪問 訪問數組元素時&#xff0c; 下標越界 是大忌&#xff01; ? 編譯器通常不檢查下標越界&#xff0c;導致程序運行時錯誤 ? 下標越界&#xff0c;將訪問數組以外的空間 ? …

pyqt窗體水印

pyqt窗體水印 介紹效果代碼 介紹 給窗體加上水印 效果 代碼 import sys from PyQt5.QtWidgets import QApplication, QMainWindow from PyQt5.QtGui import QPainter, QColor, QFont,QPen from PyQt5.QtCore import Qtclass WatermarkedWindow(QMainWindow):def __init__(se…

鴻蒙4.2小版本推出,鴻蒙5.0已經不遠了

上個月&#xff0c;市場上迎來了華為鴻蒙系統4字開頭的小升級&#xff0c;版本來到了4.2版本。 我們先來看看4.2版本都給用戶帶來哪些特色&#xff1a; 界面切換更流暢&#xff1a;無論是響應速度還是操作手感&#xff0c;用戶都將感受到更加迅速和順滑的體驗 搜星速度的顯著…

工具:Visual Studio Code

一、VSCode生成exe 二、在vs中斷點調試 如果沒效果需要安裝如下與unity相連接的插件 三、注釋 1、代碼注釋 注釋和取消都是都是同一個命令&#xff1a;選中代碼&#xff0c;然后按住CtrlShift/ 2、方法或類注釋 /// 四、導航 五、將變量注釋展示到解釋面板 1、直接顯示 [Too…

Git提交時出現Merge branch ‘master‘ of ...之解決方法

最近遇到了一個問題 我是用git提交代碼的時候 分支上 顯示的是merge 意思是 合并代碼了 每次都會 創建一個分支 因為我和另一個小伙伴共同 開發一個項目 所以 小伙伴告訴我 總是創建新的分支 我細細看了一下 測試了一下 我們兩個人 修改不同的文件 同時修改 他提交了 我再提…

pip安裝軟件包提示“沒有那個文件或目錄”問題的處理

文章目錄 一、Python.h&#xff1a;沒有那個文件或目錄二、lber.h&#xff1a;沒有那個文件或目錄 一、Python.h&#xff1a;沒有那個文件或目錄 pip install -I python-ldap3.0.0b1 #異常提示In file included from Modules/LDAPObject.c:3:0:Modules/common.h:9:20: 致命錯…

React hooks - useLayoutEffect

useLayoutEffect 用法區別 用法 useLayoutEffect 和 useEffect 的使用方式很相似&#xff1a; useLayoutEffect 接收一個函數和一個依賴項數組作為參數只有在數組中的依賴項發生改變時才會再次執行副作用函數useLayoutEffect 也可以返回一個清理函數 useEffect(()>{retur…