打造自己的計算機 程式設計模型

2022-02-26 19:24:39 字數 2300 閱讀 6491

【打造自己的虛擬機器】程式設計模型

學習《作業系統概念》這本書很久了,但其實寫乙個cpu一直是我的夢想,在學硬體電路設計的時候,我們的課程設計就是設計乙個簡易的cpu,8條指令。而我自己也用verilog設計乙個簡單的cpu,29條指令。但是感覺要想深入了解計算機,還是要知道當今cpu所提供的程式設計模型。所以我準備寫乙個虛擬機器,來看看這個cpu到底是怎麼和外界合作執行的。

在編寫這個cpu模型的時候我主要參考了三本書。

《作業系統概念》

《鏈結與載入》

《計算機組成與設計-硬體/軟體介面》

由於hennessy的影響,我在設計指令的時候參照一下幾點:

簡單來自規整

越少越快

優秀的設計需要適當的折中。

然後我自己考慮了幾點:

不考慮相容

不考慮效能

不考慮移植

僅僅要求邏輯上可行,簡潔。

在我們巨集觀觀察乙個cpu的執行流程的時候,我們看到乙個cpu和一塊記憶體,當cpu啟動或者重啟的時候,它從某乙個固定位址取出一條指令,然後翻譯它,然後執行。所以我們的cpu採用簡易的取值-執行模型,對虛擬機器來說,這是足夠的。

然後再微觀一些我們看到,我們在設計一套指令的時候實際上要考慮下面幾個東西。

l  程式跳轉

l  程式呼叫

l  中斷和異常

l  程序切換

為了支援現代的cpu的執行,我們支援程序切換,當然支援虛擬記憶體的模型。我們首先考慮程式的跳轉,程式跳轉的標準說法是分支,所以分為條件分支和無條分支。

程式跳轉

條件分支採用小於轉移,大於轉移,無符號小於轉移,無符號大於轉移,等於轉移,不等於轉移,我認為這六條指令已經足夠,所以沒有提供小於等於轉移和大於等於轉移。

無條件分支採用簡單的暫存器跳轉指令,拋棄了立即數跳轉,只是因為我們用軟體模擬,不必要考慮效能,而這樣以來,程式設計人員的壓力大大減輕。所以乙個無條件分支指令看起來是這個樣子。

load $s0, 32位立即數。

jump $s0

load指令看起來已經超過了4位元組也就是32位大小,因而不能放到一條指令裡,所以load指令實際是偽指令,它由兩條指令組成:lui和roi,以後會討論。

最重要的是,我們知道,當程式分支的時候,我們僅僅修改的是pc指,不進行堆疊儲存。

程式呼叫

程式呼叫,程式呼叫有兩條指令,一條是call,一條是ret,現在我們來想一想當程式呼叫時儲存了什麼,僅僅儲存返回位址。對了,就是這樣。

無論任何時候我們不考慮乙個呼叫是否是葉呼叫,因為我們不考慮效能。呼叫call的指令形式和jump類似,我在設計的時候就決定了這是乙個全域性的跳轉,所以我們不再關心區域性跳轉和遠端跳轉,那是intel的事。

中斷和異常

我們當然知道中斷的形式和異常是怎麼回事,在考慮中斷和異常的時候,我們要考慮兩件事,一是提供哪些中斷和異常,二是中斷呼叫的形式。中斷向量號支援0-255,其中0-15留著系統使用,但是並不是每個都被使用了。

0除以0故障

預設終止執行。

1單步除錯斷點2

不可遮蔽中斷

3設定斷點

4缺頁異常

中斷向量表的基位址放到乙個暫存器裡。中斷向量放在標誌位中,now。

程序切換

程序切換使用專用的指令,tss表基址存放在乙個暫存器中,每個表項參照80386的結構。

綜上所述,我們需要乙個pc暫存器,乙個中斷表基址暫存器,乙個任務表基址暫存器,乙個程式狀態暫存器。

第一我不想設計什麼專用的指令用來載入中斷表基址或者任務表基址。

第二我完全想不通模擬的cpu要什麼狀態暫存器,所以設計如下。

zero暫存器,任何時候讀取都是0,任何時候寫它都無效,任何時候用它間接定址產生錯誤。

中斷表基址暫存器

任務表基址暫存器

程式狀態暫存器,只放置三個狀態,tf,中斷許可,和中斷發生,高八位存放中斷發生時中斷向量,再八位存放優先級數。

bp 幀暫存器

sp 堆疊指標暫存器

pc頁目錄基址暫存器

缺頁位址暫存器

【9-31】剩下的暫存器在僅僅設計匯程式設計序的時候,應該是不需要約定的,也就是從$0-$22全部是通用暫存器。

另有4個double型浮點數暫存器。

在我們剛剛設計乙個新的cpu的時候,毫無疑問,什麼都要從新的開始。我們要給它一些東西。

l  乙個螢幕

l  一塊記憶體

l  乙個鍵盤

l  乙個交叉編譯器

螢幕的緩衝區對映到記憶體的0xb8000處(為什麼?)採用80x25模型,每行80個,共25行。所以需要80位元組x25=2000位元組。最終為b8d70-1。

鍵盤的緩衝區對映到記憶體的0xb8d70處的16位元組。接外部中斷16。

計算機視覺自己收藏

機器視覺 1.peter kovesi 主頁有用於影象處理的matlab工具包,主要包含特徵提取,各項異性濾波,灰度轉換 影象去噪等 2.南開大學 計算實驗室 程明明 global contrast based salient region detection 主頁有實驗原始碼和相關資料 3.視覺與...

計算機的程式語言

參考 0.簡述 在計算機體系中,指令就是指揮計算機工作的指示和命令。不管是哪種計算機語言編寫的程式,在執行時最終都會轉化為計算機能識別的01二進位制指令序列。本文簡單講講計算機程式語言。下面一張圖是c語言 組合語言以及翻譯過的機器語言 1.機器語言 是用二進位制 表示的計算機能直接識別和執行的一種機...

計算機程式設計書單

1.c primer 全面學習c 的必備書籍 2.thinking in c 了解c 背後的一些機制 3.深度探索c 物件模型 深入了解c 也是學習com的必經之路 1.windows程式設計 這本書主要講的是windows api的使用,是windows程式設計入門書籍。上冊涉及到的知識基本上就夠...