2009-08-07 175 views
5

被這個問題什麼是INT 21h?

How can I force GDB to disassemble?

我想知道的INT 21H作爲一個概念的啓發。現在,我對內部有一些非常生疏的知識,但沒有那麼多細節。我記得在C64中,你有定期的中斷和非屏蔽中斷,但我的知識在這裏停止。你能給我一些線索嗎?這是與DOS相關的策略嗎?

+0

你鏈接到的其他文章與INT 21h沒有多大關係 - 除非你搞亂了16位DOS代碼,否則它不會碰到什麼東西。其他操作系統也使用中斷進行系統調用,但不是21h - 而非古老的OS + CPU則使用新的SYSCALL指令。 – snemarch 2010-09-23 21:51:34

回答

12

here: 多用途DOS中斷用於各種功能,包括讀取鍵盤和寫入控制檯和打印機。它也用於使用較早的文件控制塊(FCB)方法讀取和寫入磁盤。

3

INT指令是一個軟件中斷。它會導致跳轉到由中斷向量指向的例程,該中斷向量是內存中的固定位置。 INT指令的優點是隻有2個字節長,對JMP來說可能是6個字節,並且可以通過修改中斷向量的內容輕鬆地重定向。

1

(幾乎)整個DOS界面都可以作爲INT21h命令使用,其參數在各個寄存器中。這是一個小技巧,使用內置的硬件表格跳轉到正確的代碼。此外INT 33h是爲鼠標。

2

這是偉大的The Art of Assembly Language Programming有關中斷:

80x86的,有三種類型的俗稱 中斷的事件:陷阱,異常和中斷(硬件中斷)。 本章將描述這些表格中的每一種,並討論它們在80x86 CPU和PC兼容機器上的支持。

儘管術語陷阱和異常經常被同義使用,但我們使用術語陷阱來表示程序員發起並期望將控制轉移到特殊處理程序例程。在許多方面, 陷阱只不過是一個專門的子程序調用。許多文本 將陷阱稱爲軟件中斷。 80x86 int指令是 執行陷阱的主要工具。請注意,無條件陷阱通常是 ;也就是說,當您執行一條int指令時,控制 將始終轉移到與陷阱關聯的過程。由於 陷阱通過明確的指令執行,所以很容易確定程序中的哪些指令將調用陷阱處理 例程的 。

Chapter 17 - Interrupt Structure and Interrupt Service Routines

2

詮釋爲0x21是一個x86軟件中斷 - 基本上,這意味着有中斷表在存儲器中的固定點上市軟件中斷函數的地址。當x86 CPU接收到中斷操作碼(或以其他方式決定應執行特定軟件中斷)時,它會引用該表來執行對該點的調用(該功能必須使用iret而不是ret才能返回)。

有可能重新映射詮釋爲0x21和其他軟件中斷(即使裏面DOS雖然這可能有負面影響)。映射或鏈接的一個有趣的軟件中斷是Int 0x1C(如果您小心,則爲0x08),這是系統時鐘中斷,每秒調用18.2次。即使在單線程實模式下(真實模式過程每秒會中斷18.2次以調用您的中斷函數),也可以用它來創建「背景」過程。

在DOS操作系統(或者是提供一些DOS模擬,如Windows控制檯的系統)詮釋爲0x21被映射到什麼是有效的DOS操作系統主要「API」。通過向AH寄存器提供不同的值,可以執行不同的DOS功能,例如打開文件(AH = 0x3D)或打印到屏幕(AH = 0x09)。

+1

Windows控制檯不執行DOS模擬 - 控制檯模式應用程序是完全成熟的32位Windows應用程序。 'command.com!= cmd.exe' :) - 32位Windows版本有NTVDM,但它提供DOS模擬。 – snemarch 2010-09-23 21:49:25

1

這是一個「軟件中斷」;所以根本不是硬件中斷。

當應用程序調用軟件中斷時,除了(不像子例程調用)那樣,它不需要知道它調用的代碼的確切內存地址,它本質上與其調用子例程相同。

系統軟件(例如DOS和BIOS)將其API作爲軟件中斷公開給應用程序。

軟件中斷因此是一種動態鏈接。

9

DOS可以被認爲是一個庫用於提供PC中的文件/目錄抽象( - 和多一點)。 int 21h是一個簡單的硬件「技巧」,可以很容易地從這個庫中調用代碼,而不必事先知道它將在存儲器中的位置。或者,您可以將其視爲使用DOS API的方式。

現在,軟件中斷的話題是一個複雜的,一方面是因爲概念隨着時間而演變爲英特爾增值功能的x86系列,同時努力保持與老軟件兼容。一個正確的解釋需要幾頁,但我會盡量簡短。

主要問題是您是否在實模式保護模式

實模式是x86處理器的簡單「原始」操作模式。這是DOS運行的模式(當你在Windows下運行DOS程序時,實模式處理器是虛擬化的,因此在它內部應用相同的規則)。當前正在運行的程序可以完全控制處理器。

在實模式下,有一個向量表告訴處理器從0到255的每個中斷跳轉到哪個地址。該表由BIOS和DOS以及設備驅動程序填充,有時使用程序特殊需求。其中一些中斷可以由硬件產生(例如通過按鍵)。其他是由某些軟件條件(例如,除以0)產生的。 它們中的任何可以通過執行int n指令來產生。

程序可以設置/清除「啓用中斷」標誌;此標誌僅影響硬件中斷,不會影響int說明。

的DOS設計者選擇使用中斷號21H處理DOS請求 - 數是沒有實質意義:它當時只是一個未使用的條目。還有很多其他的(例如,編號10h是一個BIOS安裝的中斷例程,用於處理圖形)。另請注意,所有這些僅適用於IBM PC兼容機。在嵌入式系統中,x86處理器的軟件和中斷表可能會有很大的不同!

保護模式是複雜的,「安全意識」這是在286處理器中引入和擴展多在386提供了多種權限級別模式。操作系統必須配置所有這些(如果操作系統出現問題,則可能會有潛在的安全漏洞)。用戶程序通常被限制在一個「最小特權」操作模式中,試圖訪問硬件端口,更改中斷標誌或訪問某些內存區域,暫停程序並允許操作系統決定如何操作該程序或給程序什麼似乎想要的)。

中斷處理變得更加複雜。一般情況下,如果用戶程序執行軟件中斷,則中斷號爲而不是用作中斷表中的向量。而是生成一般性保護異常,並且所述異常的操作系統處理程序可能(如果操作系統是以這種方式設計的話)確定該過程需要什麼併爲請求提供服務。我非常確定Linux和Windows在過去(如果不是現在的話)在他們的系統調用中使用了這種機制。但還有其他方法可以實現這一點,比如SYSENTER指令。

0

其實,這裏還有很多的概念。讓我們從基礎開始。

中斷是指,從CPU的要求注意力,中斷當前的程序流程,跳轉到中斷處理程序(ISR - 中斷服務程序),做了一些工作(通常由OS內核或設備驅動程序),然後返回。

哪些中斷一些典型用途?

  • 硬件中斷:設備通過發出中斷請求來引起CPU的注意。
  • CPU例外:如果一些不正常的CPU狀況發生,如由零一個部門,一個頁面錯誤,......的CPU跳轉到相應的中斷處理程序,以便操作系統可以做任何事必須做(發送信號一個進程,從交換頁面加載頁面並更新TLB /頁表,...)。
  • 軟件中斷:由於中斷最終調用操作系統內核,實現系統調用是使用中斷的簡單方法。但是你不需要,在x86中,你可以使用調用指令來訪問某些結構(某種TSS IIRC),而在較新的x86上則有SYSCALL/SYSENTER函數。

CPU決定跳轉到查看錶的位置(異常向量,中斷向量,x86實模式下的IVT,x86保護模式下的IDT ...)。一些CPU有一個用於硬件中斷的單一矢量,另一個用於異常等等,ISR必須做一些工作來確定中斷的發起者。其他人有很多向量,並直接跳轉到非常具體的ISR。

x86有256箇中斷向量。在原來的電腦,這些被分成幾組:

  • 00-04 CPU例外,包括NMI。隨着更高版本的CPU(80186,286,...),此範圍擴展,與以下範圍重疊。
  • 08-0F這些是硬件中斷,通常稱爲IRQ0-7。 PC-AT添加IRQ8-15
  • 10-1F BIOS調用。從概念上講,這些可以被認爲是系統調用,因爲BIOS是依賴於具體機器的DOS的一部分(這就是它在CP/M中定義的方式)。
  • 20-2F DOS調用。其中一些是多路複用的,並提供多種功能。主要的是INT 21h,它提供大部分的DOS服務。
  • 30-FF其餘的,由外部驅動程序和用戶程序使用。