久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的

時間:2019-05-14 09:17:43下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的》。

第一篇:CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的

CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的操作系統(下)

首 頁 | 新 聞 | 技術中心 | 第二書店 | 《程序員》 | 《開發高手》 | 社 區 | 黃 頁 | 人 才

移 動∣專 題∣SUN∣IBM∣微 軟∣微 創∣精 華∣Donews∣人 郵

我的技術中心

我的分類我的文檔

全部文章發表文章

專欄管理使用說明

RSS 訂閱

最新文檔列表 Windows/.NET.NET(rss)Visual C++(rss)Delphi(rss)Visual Basic(rss)ASP(rss)JavaScript(rss)Java/Linux Java(rss)Perl(rss)綜合

其他開發語言(rss)文件格式(rss)企業開發

游戲開發(rss)網站制作技術(rss)數據庫

數據庫開發(rss)軟件工程

其他(rss)

積極原創作者 yzsind(42)qdzx2008(52)Kendiv(114)btbtd(84)soft_bird(8)nizhigang2000(11)coofucoo(110)iyanglian(101)Aoouch(11)NinGoo(28)

CSDN其他開發語言 閱讀:2228 評論: 1 參與評論

標題 讓你自己的操作系統支持鼠標——做一個支持圖形界面的操作系統(下)選擇自 xiaohan13916830 的 Blog 關鍵字 讓你自己的操作系統支持鼠標——做一個支持圖形界面的操作系統(下)

出處

原文:http://purec.binghua.com/Article/Class6/Class7/200410/281.html

pdf 格式:http://purec.binghua.com/Soft/Class9/Class16/200410/67.html 源代碼:http://purec.binghua.com/Soft/Class9/Class16/200410/66.html 轉載請注明原作者及出處

讓你自己的操作系統支持鼠標

——做一個支持圖形界面的操作系統(下)Version 0.01(對應 pyos 版本 2004_10_06_15_00)

哈爾濱工業大學 謝煜波

(email:xieyubo@126.com 網址:http://purec.binghua.com)(QQ:13916830 哈工大紫丁香 BBS ID:iamxiaohan)

前言

在上篇中,我們已經了解了怎樣顯示一個圖形界面,包括怎樣操作顯卡,怎樣顯示圖片,怎樣顯示中文漢字及英文字符。然而,作為一個完整的圖形界面,不光需要顯示信息,還需要接受用戶輸入,而在圖形界面中,最重要的輸入手段就是通過鼠標進行輸入,在這一篇中我們將描述一下怎么樣讓你自己的操作系統支持鼠標。

由于鼠標存在很多的接口協議,這里我們只對最常用的PS/2協議進行描述。本文主旨在于引導對此感興趣而又不知怎么下手的朋友,親自動手進行實驗,因此,不會詳細描述協議的完整內容,如果你需要了解整個協議內容,你應當去尋找相關文獻進行閱讀,也可以參考一個本文的參考文獻。

本文所描述的內容均基于我自己對此問題的理解,其中定然存在偏差及不當之處,因此,千萬別將此文中所描述的內容作為“標準”,如果你一旦發現其中存在的問題,非常歡迎您及時與我聯系,我也會在純C論壇上(http://purec.binghua.com)及時對其中出現的問題進行反饋。本次我同樣將以pyos為基礎進行實驗,下面我們先來看看這次實驗的最終成果:

這是pyos啟動后,等待用戶登陸的界面

這是用戶登陸后的界面,相當于windows的桌面

用鼠標的右鍵可以拖動應用程序圖標

單擊圖標可以打開應用程序,這個應用程序是一個推箱子游戲

用I,J,K,L四個鍵可以玩游戲,Esc鍵或者用鼠標單擊窗口標題欄的關閉按鈕可以關閉它

用鼠標右鍵拖動窗口的標題欄可以拖動整個窗口,就像windows中一樣

單擊左下角的“關機”按鈕,可以退出pyos

這是關機后,pyos退出后的界面

上面就是本實驗的最終實驗結果,希望通過閱讀此篇實驗報告之后,你能完成一個比這更好的實驗:)。

本次實驗對也是對前幾次實驗的一個綜合,其中用到了《操作系統引導探究》、《保護模式下的8259A芯片編程及中斷處理探究(上下)》、《編寫操作系統之鍵盤交互的實現》、《做一個支持圖形界面的操作系統(上)》這幾篇實驗報告中所描述的內容。因此,如果你想更好的理解本實驗的內容,可以在純C論壇上找到上面幾篇實驗報告進行參考,本篇實驗報告將不會對以前實驗報告中已提到的內容重復論述。

本次實驗,得到了不少朋友的幫助,其中,哈爾濱工業大學紫丁香網友SwordLea建議支持符合windows標準的bmp圖片格式,pineapple幫助我找了到了windows下的圖標,hotice指導使用PhotoShop, and so on~~:)

言歸正傳,下面開始進行我們的實驗。

一、通過對i8042 鍵盤控制器編程控制鼠標

現在我們用的鼠標,大多是支持PS/2協議的鼠標,這樣的鼠標也被稱為PS/2 鼠標,PS/2協議其實支持兩種設備,一種是鍵盤,一種是鼠標,它是由IBM公司制定的,協議的本身定義了鍵盤與鼠標同主機進行通迅的規則,其中包括了大量的物理及電器方面的信息,比如鼠標連接線的插頭的管腳(針)數,每個管腳(針)的用途,電平是多少等,不過幸運的是,我們并不需要對這樣的硬件細節有詳細的了解,就可以完成我們的操作系統,我們需要了解的就是怎樣初始化鼠標,以及怎樣從鼠標中獲得信息。

這里,我們首先來看看怎樣初始化鼠標。根據PS/2協議,鼠標是由鍵盤的控制器(i8042)進行控制的,鍵盤控制器(i8042)總共有兩個通道,一個通道由鍵盤使用,另一個通道由鼠標使用,我們對鼠標進行操作也是通過i8042芯片來完成的,因此,現在的重點就是了解并熟悉怎樣對i8042進行編程,來完成對鼠標的控制。i8042支持兩種工作模式——AT模式及PS/2模式,這都是由IBM所定義的一些規范,i8042在計算機啟動時會自動檢測用戶是否使用的支持PS/2協議的鍵盤及鼠標,以決定是否工作在PS/2模式下,現在我們假設我們使用的都是PS/2鍵盤及鼠標,因此,現在i8042工作在PS/2模式下(請記住這一點,即i8042可以工作在AT模式或者PS/2模式下,并且現在假設其工作在PS/2模式下,這在后面將會用到)。

與i8042有關的I/O端口共有兩個,一個是0x60端口,一個是0x64端口,如果我們想獲得i8042的狀態,我們需要讀0x64端口,這將返回i8042中狀態寄存器的內容。如果我們想向i8042發送命令,我們需要先把命令發送到0x64端口,然后緊接著把這個命令的參數發送到0x60端口,然后我們可以通過讀0x60端口,獲得i8042返回給我們的數據。

下面我們就來看看,應當發送什么樣的命令去控制鼠標,這涉及到下面幾個需要發送給i8042的命令:

0xA8命令:許可i8042的鼠標通道,即允許鼠標操作。0xD4命令:把發往0x60端口的參數數據發給鼠標。

0x60命令:把發往0x60端口的參數數據寫入i8042的控制寄存器。

從上面的分析我們可以基本窺見怎樣操作鼠標。首先,我們應向i8042的0x64端口發送0xA8命令,以許可i8042的鼠標通道,以便完成對鼠標的操作。其次我們應向i8042的0x64端口發送0xD4命令,以通知i8042我們需要控制鼠標,并把控制鼠標的命令發到i8042的0x60端口,再從i8042的0x60端口取回鼠標發給我們的數據,這一過程無疑是比較簡單的,我們先來看看,我們應向鼠標發送什么樣的控制命令,然后再看看實際的代碼。

控制鼠標的命令非常之多,比如0xFF命令可以讓鼠標復位;0xFE命令可以讓鼠標重新發送上次的數據包;0xF3命令可以設置鼠標的采樣率,也即鼠標滑動時的靈敏度;0xF4命令可以允許鼠標向主機發送數據包等。這里最重要的就是0xF4命令,而其它的設置鼠標的命令我們暫時可以不用理會,因為使用默認值已經能很好的完成本實驗了。要理解0xF4命令有什么作用,我們需要先了解一下鼠標的四種工作模式:Reset模式,Stream模式,Remote模式及Wrap模式。

首先是Reset模式,當鼠標初次加電或收到0xFF命令之后,鼠標就處于此模式,然后鼠標將進行一系列的初始化及檢測工作,包括設定默認的采樣率等,完成初始化極檢測之后,鼠標將進入Stream模式。

在Stream模式下,如果鼠標被移動,或者有鍵被按下,那么鼠標將向主機發送數據包,并提請一個中斷請求,主機需要響應此中斷,并在中斷處理程序中取得鼠標發送的數據包。如果在Stream模式下,我們向鼠標發送0xF0命令,將使鼠標進入Remote模式。Remote模式同Stream模式差不多,主要工作就是檢測鼠標是否被移動及是否有鍵被按下,不過它與Stream模式的區別在于,它并不會主動的向主機提請中斷請求,也即它不會主動的向主機發送數據包,而是被動的等待主機使用0xEB(讀數據命令)后,再向主機提請中斷請求,發送數據包。換句話說,如果在Remote模式下,你每次欲讀數據時,均需要向鼠標發送0xEB命令,而如果是在Stream模式下,鼠標會自動向你發送數據。

Wrap模式主要用于檢測鼠標與主機之間的連線是否正常,主機向它發送命令,它一般不會執行此命令,而只是簡單的將此命令原封不同的回送給主機,主機可比較它發出的命令及接收到的命令是否一致,并以此來認定鼠標與主機之間的連線是否正常。

從上面的描述中我們可以看出,我們需要關心的只有Reset模式及Stream模式,但對于操作系統編寫人員而非BIOS編寫人員來說,真正需要關心的只有Stream模式,這是因為當計算機啟動的時候,BIOS會自動檢測鼠標,與鼠標進行通信,這個時候它會向鼠標發送0xFF(復位)命令,然后鼠標會自檢,并通知主機自檢是否正常,然后鼠標就將處于Stream模式,此時,鼠標已經開始檢測鼠標是否移動及是否有鍵按下了,但是它不會立即就向主機發送數據,因為有可能主機還沒有進入真正的操作系統,主機還正在啟動中,因此,鼠標會等待主機的通知,直到主機給它發送0xF4命令后,它才開始向主機發送數據。

所以,在操作系統中初始化鼠標的動作就很簡單了,請看下面pyos中初始化鼠標的相關代碼:

// 許可 鼠標

void mouse_enable_mouse(){ // 對 8042 鍵盤控制芯片進行編程 // 允許 鼠標 接口

io_write_to_io_port(0x64 , 0xa8);// 通知 8042 下個字節的發向 0x60 的數據將發給 鼠標 io_write_to_io_port(0x64 , 0xd4);// 允許 鼠標 發數據

io_write_to_io_port(0x60 , 0xf4);// 通知 8042,下個字節的發向 0x60 的數據應放向 8042 的命令寄存器 io_write_to_io_port(0x64 , 0x60);// 許可鍵盤及 鼠標 接口及中斷

io_write_to_io_port(0x60 , 0x47);} 有了上面的描述,這段代碼就相當簡單了,首先它向i8042的0x64端口發送了一個0xA8命令,通知i8042,允許鼠標通道。然后,它向i8042的0x64端口發送了一個0xD4命令,這個命令表示,下面發給0x60的命令需要發給鼠標,所以,緊接著,它向i8042的0x60端口,也即向鼠標,發送了0xF4命令,這個命令將允許經過BIOS初始化后,現在已處于Stream模式下的鼠標給主機發送數據包。隨后,它向i8042的0x64端口發送了0x60命令,表示,下面發向0x60端口的數據需要寫入i8042的控制寄存器,最后它向i8042的0x60端口發送了值為0x47的數據,這個數據被寫入了i8042的控制寄存器。下面,我們就來看看這個控制寄存器,以明白,這里為什么需要向它發送這樣一個值為0x47的數據。

下面就是i8042的控制寄存器的格式,這個控制寄存器總共有8位,即1個字節。

位0:鍵盤中斷標志位,如果置1,那么如果有鍵盤動作,則i8042將提請IRQ1中斷。

位1:鼠標中斷標志位,如果置1,那么如果有鼠標動作,則i8042將提請IRQ12中斷(在AT模式下這位不使用,只在PS/2模式下有效。這里可以回憶一下前面我們提到的i8042可以工作在AT或者PS/2兩種模式下的描述)。

位2:系統標志位,上電的時候是0,自檢成功后是1。

位3:鍵盤鎖標志位,如果是1,將忽略鍵盤鎖,這主要是為了兼容一些老式的帶鎖的鍵盤,而且這位只在AT模式下使用,PS/2模式下將不使用此位。

位4:鍵盤接口標志位,如果置1,將禁止使用鍵盤接口。

位5:在AT模式下,這是AT鍵盤協議位。置0的時候,i8042將使用AT協議,如果置1,將使用XT協議。在PS/2模式下,這是鼠標接口(通道)標志位,如果置1將禁止鼠標接口(通道)。

位6:鍵盤掃描碼轉換標志位。如果置1將把真實的鍵盤掃描碼轉換為第一套鍵盤掃描碼(有關此內容詳見《編寫操作系統之鍵盤交互的實現》一文)。

位7:保留,應置為0。

二、鼠標數據包簡析

在上節中,我們知道了怎樣對i8042進行編程,以完成對鼠標的初始化操作,那么當鼠標的初始化完成之后,如果有鼠標動作發生,比如用戶移動了一下鼠標,或者按下了鼠標鍵,那么鼠標將把數據包發回給主機,現在我們就來看看鼠標發回給主機的數據包的結構,在了解這個結構之前,我們先要知道現存的總共有兩類鼠標,一類就是所謂的2D(二維)鼠標,它就是我們平常用的那種沒有滾輪的鼠標,由于這種鼠標在位移上只有X與Y兩個方向,所以稱之為2D(二維)鼠標;還有一類就是現在比較常見的3D(三維)鼠標,它們中間存在有一個滾輪,而這個滾輪會產生一個額外的Z位移量,因此,它在位移上有X、Y、Z三個方向,所以又稱之為3D(三維)鼠標。下面,我們就來看看這兩類鼠標發給主機的數據包有什么不同。下面,我們先來看看二維鼠標。

位0:左鍵按下標志位,為1表示左鍵被按下。

位1:右鍵按下標志位,為1表示右鍵被按下。

位2:中鍵按下標志位,為1表示中鍵被按下。

位3:保留位,總是為1。

位4:X符號標志位,為1表示X位移量為負。

位5:Y符號標志位,為1表示Y位移量為負。

位6:X溢出標志位,為1表示X位移量溢出了。

位7:Y溢出標下位,為1表示Y位移量溢出了。

下面,我們再來看看三維鼠標的數據包結構。

三維鼠標數據包中第一個數據包每位的含義與二維鼠標數據包中第一個數據包中每位含義完全相同,唯一不同的就在于它每次會多發送一個數據包,即第4個數據包,這個數據包包含了Z的位移量,同X、Y位移量相同的是,它們都是以補碼表示的。不過與X及Y位移量不同的是,Z位移量是4位的,其中最高位(第四位)是符號位,因此,Z位移量的有效的范圍為:-8~7。而X與Y的位移量是9位的,最高一位(第9位)是符號位,這個符號位在第一個數據包中表示,故,X與Y的位移量的有效范圍為:-256~255。

看到這里,你或許有疑問了,系統是怎么來知道到我到底應當接收3個數據包還是接收4個數據包的呢?三維鼠標的標準是由微軟制定的,最初,這種三維的鼠標只工作在標準的PS/2模式下,如果你想讓它工作在三維模式下,你需要用0xF3這個設置鼠標采樣率的命令,按如下的順序進行操作: 1.設置鼠標采樣率為200 2.設置鼠標采樣率為100 3.設置鼠標采樣率為80 這之后,如果你的鼠標是個三維鼠標,那么,它將轉到三維模式下進行工作,這個時候,主機向它發送0xF2(獲得鼠標類型ID)命令,你的工作在三維模式下的鼠標將向主機返回它的類型ID,但如果你的鼠標不支持三維模式,即如果你的鼠標只是一個二維鼠標,它返回給主機的類型ID將是0,這樣,主機就能夠知道現在你用的鼠標是什么類型的鼠標,并由此知道應當接受3個還是4個數據包了。本實驗將只操作標準的二維鼠標,如果你有興趣,你可以對程序進行改動,以讓它支持三維鼠標。

現在,我們來看看,這個數據包是怎么被主機獲得的。在《保護模式下的8259A芯片編程及中斷處理探究(上下)》這篇實驗報告中我們知道了,鼠標中斷是通過IRQ12提出的,因此,在操作系統中,我們需要為IRQ12這號中斷編寫一個中斷處理程序,然后在這個中斷處理程序中讀取鼠標發來的數據包,下面,就讓我們來看一看這段存在于pyos中的真實的代碼:

// 鼠標 中斷處理函數

void mouse_handle_for_mouse_interrupt(){ static int x_position = 444;// 定義 鼠標 的初始 x 坐標

static int y_position = 300;// 定義 鼠標 的初始 y 坐標

static int count = 0;// 此變量用來記錄這是第幾個數據包了

// 因為 鼠標 發來的每個數據包

// 都會引起一個中斷

static int x_sign = 0;// 用來表示 x 位移量的符號

static int y_sign = 0;// 用來表示 y 位移量的符號

static struct message_message_struct message;// 定義一個消息 // 這個消息用來通知操作系統內核有鼠標動作

char ch = io_read_from_io_port(0x60);// 通過 0x60 端口,獲得

鼠標 發來的數據包

switch(++count){ // 檢測是第幾個數據包

case 1 : // 收到的是第一字節 // 檢測按鍵信息

message.dose_left_button_down = ch & 0x1;message.dose_right_button_down = ch & 0x2;// 獲得 x 及 y 位移量的符號

x_sign = ch & 0x10 ? 0xffffff00 : 0;y_sign = ch & 0x20 ? 0xffffff00 : 0;break;case 2 : // 收到的是第二字節,即 x 的位移量

x_position +=(x_sign | ch);// 計算新的 x 坐標

break;case 3 : // 收到的是第三字節,即 y 的位移量

y_position +=-(y_sign | ch);// 計算新的 y 坐標

// 把消息發送給內核

message.message_type = MESSAGE_MOUSE_MESSAGE;// 設定消息的類型

message.x_position = x_position;// 設定消息的參數(x 的坐標)

message.y_position = y_position;// 設定消息的參數(y 的坐標)

message_put_message(&kernel_message_queue , message);// 把消息放進內核的消息隊列中

count = 0;// 三個數據包已接收完畢,故清零計數器 break;} } 上面的代碼注釋已經很詳細了,有關“消息”這部份,如果你已前看過《編寫操作系統之鍵盤交互的實現》這篇實驗報告,應當對它非常熟悉,如果你沒有看過,那么也別著急,在后面分析整個pyos實驗程序架構的時候,還會對它進行描述。

這次的pyos實驗,支持了Windows標準的BMP圖片格式,下面我們就來描述一下對這個標準BMP圖片格式的處理問題,以便于更好的理解本實驗。

三、Pyos所支持的Windows標準的BMP圖片格式

BMP圖片格式其實不是只單單的一種格式,而是一類格式的總稱,這包括皆如24位真彩格式,16位真彩格式,16位真彩格式中又有555格式,565格式等,還有4位,8位調色板格式,壓縮存儲格式等,非常復雜,本次Pyos只支持了其中的一種,即非壓縮的,16位真彩色555格式,這也是現在的32位windows默認的16位BMP格式。由于BMP格式的紛繁復雜,我想有關這方面最權威最全面的資料莫過于通過MSDN獲得了,因此,本實驗報告并不打算對此進行完整而詳盡的描述,本實驗報告將只描述本實驗所用到的一些細節,以便于你能非常便利的閱讀本實驗的代碼。

下面我們來簡單理解一下BMP格式。BMP格式又稱之為位圖格式,它是把一幅圖的色彩信息完整的記錄了下來,每個點都用一個色彩于表示,這樣在顯示的時候,只需要讀取此文件,然后獲得每個點的色彩數據,然后把這個點用這個色彩顯示到屏幕上就行了,由于每幅圖都是由一個一個的點構成的,因此,把所有的點都顯示完了之后,就完成了整幅圖片的顯示。

但是,一個文件光記錄每個點的色彩信息還不行,還需要記錄這個圖片的大小,以及這幅圖片每個點用幾個數據位來記錄色彩等信息,這部份信息被稱之為BMP文件的頭信息,而被記錄在文件的開頭位置。下面我們就來看看這個文件頭: struct bmp_bmp_head_struct{ short type;// 類型 int size_file;// 大小 short reserved_0;short reserved_1;int offset;// 位圖陣列的起始位置

struct bmp_bmp_info_head_struct info_head;};這個結構比較簡單,首先是2字節的類型數據,用來認定這是不是一個BMP文件,緊接著是一個4字節的數據,用來表示這個文件的大小,跟著的4字節保留給將來使用,隨后的4字節是一個偏移量,這個偏移量指出了每個點的色彩數據在這個BMP文件中的什么位置,這對我們來說非常重要。隨后,是一個所謂的BMP信息結構,下面我們就來看看這個所謂的BMP信息結構中到底都有些什么數據值得我們關心。struct bmp_bmp_info_head_struct{ int the_struct_size;int width;int height;// 下面還有數據,但目前 pyos 只處理 16 位真彩位圖,因此下面的數據不要了

};這個結構也比較簡章,首先是4字節的數據,用來表示這個結構的大小,隨后的4字節數據給出了這個文件所描述的圖片的寬度,緊接著的4個字節給出了這副圖片的高度,隨后還有一些數據,它們給出了這個圖片是否使用了壓縮格式來存放數據,每個點是用多少位來表示的,以及是否使用了調色版,如果使用了調色版,后面還有調色版的數據。由于本篇只處理 16 位的真彩位圖,所以下面的數據本實驗都不考慮了,但是,如果你想做一個更好更完善的系統,那么你需要好好的研究一下BMP完整的格式,然后根據其中所記錄的不同信息,在程序中進行不同的處理,pyos只是一個原理性的實驗系統,故而,并不打算在此方面多下功夫,非常希望能在以后見到改進版本:P。

有了上面的描述,我們可以對怎么樣顯示圖片有個比較良好的認識了,我們現在來看看pyos中的實際的處理代碼: // 顯示 pbmp 格式的圖片

void vesa_show_bmp_picture(unsigned int x , unsigned int y , void *bmp_addr , unsigned short mask_color , int dose_use_mask_color){ // 這里只支持 windows 標準 16 位 bmp 格式圖片,(1:5:5:5)struct bmp_bmp_head_struct *bmp_head =(struct bmp_bmp_head_struct *)bmp_addr;int width = bmp_head->info_head.width;// 獲得圖片的寬度 int height = bmp_head->info_head.height;// 獲得圖片的高度

// 下面記算存儲每個點的色彩的信息所在的位置

unsigned short *color =(unsigned short *)((unsigned int)bmp_addr + bmp_head->offset);

// 由于一行的字節數比須是 4 的倍數,因此,這里先計算每行需要的填充數,除 2 是因為每個像素兩個字節

int fill_length = width * 2 % 4 / 2;

// bmp 的存放順序是從下到上,從左到右 for(int i = height-1;i >= 0;--i){ for(int j = 0;j < width;++j){ // 取得每個點的色彩信息

// 由于 windows 默認的是 555 格式,而 pyos 用的是 565 格式,因此先進行一下轉換

unsigned short temp_color = vesa_change_color_form_555_to_565(*color);if(!dose_use_mask_color || temp_color!= mask_color){ // 畫出每個點

vesa_draw_point(x + j , y + i , temp_color);} ++color;} // 填充

color += fill_length;} } 上面的代碼也是比較簡單的,而且有較為詳盡的注釋,這里就不多描述了,需要提醒的只有兩點:第一,BMP文件存放圖片的默認順序是從一幅圖的最左下角開始,從左到右,從下到上,而不是按正常的從上到下的順序。而且,每存一行數據,都要檢測一下是否是4的倍數,如果不是,則填充0,以使它總是4字節的倍數,這也稱之為4字節對齊。

第二個需要注意的地方就是,windows默認使用的16位真彩位圖是555格式,也就是說紅(R)、綠(G)、蘭(B)都用5位數據來表示,而pyos現在用的是565格式(即紅(R)用5位表示,綠(G)用6位表示,蘭(B)用5位表示),因此,在顯示之前,需要將其轉換一下,具體的內容,可以參看源代碼。

四、pyos系統架構

本實驗所需的基礎知識,前面已經全部描述完了,這里我們就來看看pyos的主程序架構。首先需要說明的是,由于目前pyos還沒有完成磁盤驅動及文件系統,因此,pyos中所用到的所有資源,包括圖片、字庫等,都是在最初制作pyos的啟動映象(pyos.img)的時候,被一個稱之為“make_together.exe”的程序直接寫到磁盤上的固定地址的,然后,再由setup.asm在系統引導時,讀入內存中的固定位置,而操作系統內核在使用它們時,也是通過這個內存的固定地址使用的。了解這一點,對看源代碼非常有幫助。

當setup.asm讀入了所用的圖片、字庫等資源后,系統將跳到kernel.c處執行,這是系統的內核,我們現在來看看這個文件中的一些程序: // 內核主函數

void kernel_main(){ // 操作系統初始化 system_init();

old_picture =(unsigned short *)0x100000;// 越過前面的只讀內存區

// 畫登陸界面

kernel_draw_login_form();// 0x903b3

// 清空鍵盤緩沖區

io_read_from_io_port(0x60);

// 初始化消息隊列

message_init_message_queue(&kernel_message_queue);

// 開中斷

interrupt_open_interrupt();

struct message_message_struct message;

kernel_kernel_state = KERNEL_WAIT_USER_LOGIN;

// 進入消息循環 for(;;){ if(!message_get_message(&kernel_message_queue , &message)){ continue;} if(message.message_type == MESSAGE_SHUTDOWN_COMPUTER){ break;} switch(message.message_type){ case MESSAGE_KEYBOARD_MESSAGE : // 處理鍵盤消息 ??

case MESSAGE_MOUSE_MESSAGE : // 處理 鼠標 消息 ?? } }

// 停機

for(;;){ __asm__(“hlt”);} } 這段程序也是非常簡單的,首先調用system_init()來進行一些初始化操作,比如初始化中斷向量表、初始化鍵盤、初始化鼠標等,然后,它調用kernel_draw_login_form()這個函數來顯示等待用戶登陸的界面,最后它初始化了一個消息隊列,然后進入一個消息循環,不斷的從這個消息隊列中取出消息,并根據消息的類型進行不同的處理。每當有鍵盤動作或鼠標動作的時候,鍵盤與鼠標的中斷處理程序都會構造一條消息,然后把這條消息放到內核的消息隊列中,這樣內核就能知道用戶進行了什么操作,然后根據用戶操作進行處理。比如,如果鼠標消息中指示出用戶按下了鼠標左鍵,那么內核將檢測用戶的鼠標是否處在應用程序圖標所在的范圍內,如果是,則啟動應用程序(這在實驗中就是那個推箱子游戲)。如果你有在windows下編寫windows應用程序的經驗,對此應當是比較好理解的。具體的細節可以參看源程序。另外,有關消息隊列,中斷處理,這部份內容在《編寫操作系統之鍵盤交互的實現》有很詳盡的描述,這里就不多費時間了。/* 系統初始化 */ void system_init(){ // 由于以后可能向 gdt 表中增添項目,因此,此處應重新初始化 gdt 表,以保存 gdt 表位置

system_init_gdt();

// 初始化中斷

interrupt_init();

// 初始化鍵盤 keyboard_init();

// 初始化 鼠標 mouse_init();} 上面一段代碼,就是系統初始化的程序,它在kernel.c的main()函數中被內核調用,以完成系統的一些初始化操作,具體的代碼,可以參看源程序。

注:pyos源代碼中,每個函數或變量的第一個單詞都表明了這個函數存在于哪一個文件中,比如:system_init()中第一個單詞system表明了這個函數存在于system.c這個文件中,希望這種命名方式能有助于你閱讀源程序。

五、進一步實驗的建議

由于pyos或許是更多的著眼于原理性或說基礎性,因此它在很多方面做了一些假定及忽略。比如,在本實驗中,它沒有檢測用戶是否使用了三維鼠標,因此,沒有對三維鼠標提供支持,它也沒檢測用戶使用的到底是不是555格式的真彩BMP圖片文件,而假定用戶就是使用的這種圖片,也沒有對這種圖片文件是否有錯誤進行任何的差錯檢驗與校正。另外,它采用了一種最蝸牛的方式,它的每幅圖,每條線,都是一個點一個點畫上去的,圖形拷貝也是一個點一個點的賦值,因此,pyos運行起來非常的慢,而實際的系統是絕不會像這樣的。你可以針對它進行一系列的優化。比如在拷貝圖片時用memcpy一塊內存一塊內存的拷貝或者在內存中先建一個緩沖區,在緩沖區中把圖都畫好了,再一次性的使用memcpy拷貝到顯卡的內存中進行顯示。知道了基本原理,怎樣優化應當并不是一件高不可及的事。

另外,如果你想對本文中所泛泛描述的東東的細節有較深入的了解,可以閱讀本文的參考文獻,它們中的絕大部分都能在純C論壇上找到。后記

本文是《做一個支持圖形界面的操作系統》的下篇,上篇在純C論壇上貼出之后,收到了不收朋友的反饋意見,大家都對是否應當完成一個圖形化的操作系統,或者pyos是否應當走圖形化的道路,提出了自己非常寶貴的意見,在這里對各位朋友表示由衷的感謝,也想就此機會,談談自己對此問題的看法。

首先,從pyos的角度來說,pyos只是一個實驗性的操作系統,目的是用來驗證所學,因此,pyos追求的是從一種一無所有的原始狀態開始建造,力圖通過這樣一個過程了解較為詳細的實現細節,所以,pyos簡單、慢,但力圖完整。并不打算成為一個真正可以實用并被使用的os,在pyos中,只是驗證可以做到,但并不是在實際的os中,一定要做到。pyos是一個起步,而不會是最終的結果。在本實驗中,pyos刻意的去模擬了windows的圖形界面,原因只在于,想通過這樣的模擬,能些許的揭開長期以來披在windows或其它操作系統上神秘的面紗,讓對此不了解的人,能認識到:只要一步一步的做下去,并不是只有微軟,而我們也有可能做到。從而,讓更多的人有信心也有這個興趣來編寫屬于自己的操作系統。

我總是力度將一個完整的os,切分成若干細節,而每次實驗,都用pyos去實現一個細節,而忽略掉其它的細節,因此,每次實驗的pyos的架構都不一樣,變化非常大,有時甚至沒有多少共通之處,然而,我總認為只要把每個細節都了解清楚了,每個細節我們都可以自己實現了,那么,希望有一天,我們可以將這若干個細節組合起來,像這次的這個圖形界面其實就是前面絕大部份實驗綜合的結果。

其次,從一般意義上講,如果你打算開發一個os,是否開發圖形界面,我的觀點是:如果你是為一個特定的目標開發,那么你需要跟據你的目標進行選擇,你是要開發一個高效的系統,還是一個界面更友好的系統。如果需求不同,我想這結論也應當是不同的,像pyos,定義為一個中文操作系統,要支持中文,圖形模式就是必須的了。

如果你是為學習一種技能或知識,那么我建議你可以嘗識一下圖形界面的開發,它要考慮的問題會比字符界面更復雜,而且更難處理,這樣的一種挑戰顯然是有益的。其實,不論你決定是否選用圖形界面,最關鍵的一點是你有興趣去這樣做。為完成這個實驗,我三天總共只睡了不到15個小時,四頓沒吃飯,逃了三天整整十節大課(幸好老師沒點我名,thank good ness~~:P,當然,也并不是非要這樣,不過一般說來,寫上程序了,一般是很難中途停手的),這一切只有一個支撐,就是興趣。所以,如果你要決定使用圖形界面,或者不使用圖形界面,請先確認你對它有足夠的興趣,that's your own os, just as you like!

Pyos是一個開放的系統,你可以在純C論壇上找到它從創生以來的所有資料,包括所有的實驗報告及所有的源代碼,所有的相關資源。Pyos沒有基于任何現有操作系統,它只是一些原理的實現,因此,Pyos不遵守GPL公約,它也不要求對Pyos進行修改的朋友遵守GPL公約,不過,我非常希望,如果你也在進行類似的開發或者實驗,你也能在可能的情況下,公開你的心得,你的體會,讓更多的朋友了解你的工作,也讓更多的朋友能從中獲得益處。學術需要的是交流,中國古代春秋戰國時期的百家爭鳴,導致了許多古代杰出思想家的出現,你有一個蘋果,我有一個蘋果,我們交換之后,每人還是只有一個蘋果,但如果你有一種思想,我有一種思想,我們交換之后,每人就有兩種思想。pyos最初也是看到國外一位朋友寫的指南(tutorial)而起步的,在網上搜一下,國外有不少朋友在自己寫操作系統,而且有很不錯的成果,最重要的是,這些成果都是開放的,你可以隨意的取得,而且還有大量的教程、指南(tutorial)告訴你應當怎么做,各種資料,相對來說都很豐富,還有不少新聞組、論壇,有不少熱心人在上面討論,我想這一切也正是Linux誕生的根基。

科學研究需要一種氛圍,系統開發也需要一種氛圍,然而相對來說,國內的這種自由交流的氛圍卻要淡很多,至少從我的感覺來說是這樣,我處在一所全國前九所的大學當中,然而所能感受到的學術的氛圍卻不是想象中的那么濃厚,特別是在本科階段,基本上大體處于老師講什么,學生學什么的氛圍中,老師不太指導學生怎么去更深層次的挖掘,怎么去自主的進行實驗,而學生也似乎樂于單方面的接受,并著眼于考試考什么;課余時間,更喜歡追求新興技術,而對于相對底層的支撐技術不太感興趣。曾經一位德高望重的老師也對我說:做一些別人已有的東東,有什么意思?有什么價值?不過,我總認為,別人已有的,是別人的,不是我們自己的,雖然別人已有的東東,我們或許不需要重新再去做,但我們應當知道別人是怎么做的,去不去做與能不能做,是兩個概念。

正是于此,誕生了哈工大純C論壇,它追求一種純粹的計算機科學技術,特別著眼于一些相對底層的支撐技術,現在,我們又打算在每月的28日出版《哈工大·純C論壇·電子雜志》,很高興,找到了不少志同道合者共同來完成此項工作,希望能由此營造一種向往已久的氛圍。

參考文獻

1.《PS/2技術參考》(Adam Chapweske著,Roy Show譯)(網文,純C論壇可以下載)

2.《i8042——控制命令、寄存器、端口、鍵盤和鼠標命令》(好像是中國Linux論壇(http://www.tmdps.cn 編譯原理worldguypurec_compile@126.com 算法理論與數據結構xiongpurec_algorithm@126.com C與C++語言sunpurec_cpp@126.com 匯編語言oggpurec_asm@126.com 數據庫原理pineapplepurec_db@126.com 計算機網絡truepurec_network@126.com 計算機病毒swordleapurec_virus@126.com 人工智能及信息處理carpurec_ai@126.com 操作系統iamxiaohanpurec_os@126.com

從現在開始,本刊面向全校,全國,全網絡公開征集各類稿件,你的投稿將由本刊各欄目的技術顧問進行審校,對于每一份稿件我們都會認真處理,并及時通知您是否選用,或由各位技術顧問對稿件進行點評。所有被本刊選用的稿件,或者暫不適合通過電子雜志發表的稿件,將會在純C論壇網站上同期發表。所有稿件版權完全屬于各作者自己所有,非常歡迎您積極向本刊投搞,讓你的工作被更多的人知道,讓自己同更多的人交流、探討、學習、進步!

為了確保本刊質量,保證本刊的技術含量,本刊對稿件有如下一些基本要求: 1.主要以原創(包括翻譯外文文獻)為主,可以不需要有很強的創新性,但要求有一定的技術含量,描述的問題可以很小但細致,可以很泛但全面,最好圖文并貌,投稿以word格式發往各欄目的投稿信箱,或直接與各欄目技術顧問聯系。本刊對稿件的風格或格式沒有特殊要求,注重質量而非形式,版權歸各作者所有,不限一稿多投但限制重復性投稿(如果稿件沒有在本刊發表,則不算重復性投稿)。2.來稿中如有代碼實現部份,在投稿時最好附帶源代碼及可執行文件,本刊每期發行時,除了一個pdf格式的雜志外,還會附帶一個壓縮文件,其中將包含本期所有的源代碼及相應資源。當然,提不提供源代碼,隨各位作者自便。3.如果稿件是翻譯稿件,請一定附帶英文原文,以便校對。另外本刊在刊發翻譯稿的同時,將盡可能的隨稿刊發英文原文,因此請在投稿前確認好版權問題。4.來稿請明確注明姓名,電子郵箱,以便編輯及時與各位交流,發送改稿意見,選用通知及寄送樣刊等,如果你愿意在發表你稿件的同時,提供一小段的作者簡介,我們非常歡迎。

5.所有來稿的版權歸各作者所有,也由各作者負責,切勿抄襲,如果在文中有直接引用他人觀點結論及成果的地方,請一定在參考文獻中說明。每篇稿件最好提供一個簡介及幾個關鍵詞,以方便讀者閱讀及查詢。由于本刊有可能被一些海外朋友閱讀,所以非常推薦您提供英文摘要。

6.所有來稿,編輯部在處理后,會每稿必復,如果您長時間沒有收到編輯部的消息,請您同本編輯部聯系。7.由于本刊是純公益性質,沒有任何外來經濟支持,所有編輯均是無償勞動,因此,本刊暫時無法向您支付稿籌,但在適當的時候,本刊會向各位優秀的作者贈送《純C論壇資料(光盤版)》,以感謝各位作者對本刊支持!

下面再一次誠懇邀請您加盟本刊,為本刊投稿!

本刊創刊號將于 10.28 日發行,希望能在上面見到您的身影!

最后,祝愿大家中秋節快樂!

《哈工大·純C論壇·電子雜志》編輯部 http://purec.binghua.com purec@126.com 2004.09.28

作者Blog:http://blog.csdn.net/xiaohan13916830/ 相關文章

關于pow()在printf()中用%d輸出的問題

《純C論壇·電子雜志》2004.11(總第2期)

操作系統引導探究(Version 0.02)Pyos 支持的 FAT12 文件系統~~~~ 純C論壇·電子雜志·2004.10期(總第1期)正式發行!

對該文的評論

crabinhit(2005-01-07)呵呵 自己人 支持一個

有空還得向師兄多多請教阿 :)

【評論】 【關閉】 【報告bug】

????????????????????????????????????????????English???????? CSDN??????????????????????????? ??????? ?? ICP ? 020026 ?? CSDN ? 2000-04, CSDN.NET, All Rights Reserved

下載CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的word格式文檔
下載CSDN技術中心 讓你自己的操作系統支持鼠標——做一個支持圖形界面的.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    主站蜘蛛池模板: 亚洲精品爆乳一区二区h| 成人欧美一区二区三区黑人| 无码国产精品一区二区免费16| 欧美黑人与白人精品a片| 国产人妻精品一区二区三首| 日韩~欧美一中文字幕| 亚洲精品少妇一区二区| 2021精品亚洲中文字幕| 国产免费久久久久久无码| 国产精品18久久久| 国产乱人伦精品一区二区在线观看| 最新无码专区视频在线| 亚洲2022国产成人精品无码区| 国产精品久久婷婷六月丁香| 高大丰满熟妇丰满的大白屁股| 亚洲精品国偷拍自产在线| 亚洲国产成人久久一区www| 我的公把我弄高潮了视频| 中国a级毛片免费观看| 国产精品久久久久9999赢消| 国产精品久久久久9999无码| 性大片免费视频观看| 在线a亚洲v天堂网2018| а天堂中文在线官网在线| 青青青国产精品免费观看| 韩国午夜理伦三级在线观看仙踪林| 中文字幕在线日亚洲9| 99久久精品国产一区二区三区| 国产亚洲aⅴ在线电影| 亚洲综合欧美制服丝袜| 日韩一区二区三区射精-百度| 久久夜色撩人精品国产小说| 久久久久99精品成人片牛牛影视| 国内精品一区二区三区在线观看| 久久大香伊蕉在人线观看热| 人人爽久久久噜人人看| 中文字幕av久久激情亚洲精品| 国产精品yy9299在线观看| 美女脱了内裤张开腿让男人桶网站| 国产午夜三级一区二区三| 久久丫精品忘忧草西安产品|