關於APIC的一些概念

2021-06-17 21:35:24 字數 1576 閱讀 5767

關於apic的一些概念,很早以前某個大神通過studyos機制,研究出來的apic的工作模式,特摘錄部分概念。

事實上,老久的pic在很早以前就被淘汰了,取而代之的是apic。由於apic可以相容pic,所以在很多單處理器系統上我們看到的pic實際是apic的相容pic模式。apic主要應用於多處理器作業系統,是為了解決irq太少和處理器間中斷而產生的,當然,單處理器作業系統也可以使用apic(不是模擬pic)。apic的hal和pic的hal有很大的不同,很突出的乙個特點就是apic的hal不用再象pic的hal那樣虛擬乙個中斷控制器,irql的概念已經可以通過中斷向量的形式被apic支援。事實上,因為被apic所支援,所以在apic hal裡irql的實現比pic hal那樣虛擬乙個中斷控制器要簡單得多了。

現在來簡單介紹一下apic的結構(關於apic詳細的描述請參考《ia-32 inel architecture software developer's manual volume 3 chapter 8》)。整個apic系統由本地apic、io apic和apic序列匯流排組成(在pentium 4和xeon以後,apic匯流排放到了系統匯流排中)組成。每個處理器中整合了乙個本地apic,而io apic是系統晶元組中一部分,apic匯流排負責連線io apic和各個本地apic。本地apic接收該處理器產生的本地中斷比如時鐘中斷,以及由該處理器產生的處理器間中斷,並從apic序列匯流排接收來自io apic的訊息;io apic負責接收所有外部的硬體中斷,並翻譯成訊息選擇發給接收中斷的處理器,以及從本地apic接收處理器間中斷訊息。

和pic一樣,控制本地apic和io apic的方法是通過讀寫該單元中的相關暫存器。不過和pic不一樣的是,intel把本地apic和io apic的暫存器都對映到了實體地址空間,本地apic預設對映到實體地址0xffe00000,io apic預設對映到實體地址0xfec00000。windows hal再進一步把本地apic對映到虛擬位址0xfffe0000,把io apic對映到虛擬位址0xffd06000,也就是說對該位址的讀寫實際就是對暫存器的讀寫,本地apic裡幾個重要的寄存有eoi暫存器,任務優先順序暫存器(tpr),處理器優先順序暫存器(ppr),中斷命令暫存器(icr,64位),中斷請求暫存器(irr,256位,對應每個向量一位),中斷在服務暫存器(isr,256位)等。io apic裡幾個重要的暫存器有版本暫存器,i/o暫存器選擇暫存器、i/o視窗暫存器(用要訪問的i/o apic暫存器的索引設定位址i/o暫存器選擇暫存器,此時訪問i/o視窗暫存器就是訪問被選定的暫存器)還有很重要的是乙個io重定向表,每乙個表項是乙個64位暫存器,包括向量和目標模式、傳輸模式等相關位,每乙個表項連線一條irq線,表項的數目隨處理器的版本而不一樣,在pentium 4上為24個表項。表項的數目儲存在io apic版本暫存器的[16:23]位。apic系統支援255個中斷向量,但intel保留了0-15向量,可用的向量是16-255。並引進乙個概念叫做任務優先順序=中斷向量/16,因為保留了16個向量,所以可用的優先順序是2-15。當用乙個指定的優先順序設定本地apic中的任務優先順序暫存器tpr後,所有優先順序低於tpr中優先順序的中斷都被遮蔽,是不是很象irql的機制?事實上,apic hal裡的irql機制也就是靠著這個任務優先順序暫存器得以實現。同乙個任務優先順序包括了16個中斷向量,可以進一步細粒度地區分中斷的優先順序。

關於KVM一些概念

kvm kernel virtual machine核心虛擬機器 是乙個linux核心模組,可以用modprobe去載入kvm模組。載入模組後,才能進一步通過其他工具建立虛擬機器。但僅有kvm模組是不行的,因為使用者無法直接控制核心模組去作事情,所以還要有乙個使用者空間的工具才行。這個使用者空間的工...

關於uboot一些概念

u boot的環境變數值得注意的有兩個 bootcmd和bootargs。bootcm bootargs bootargs是環境變數中的重中之重,甚至可以說整個環境變數都是圍繞著bootargs來設定的。bootargs的種類非常非常的多,我們平常只是使用了幾種而已.bootargs非常的靈活,核心...

關於Socket的一些概念

對於 tcp ip 我們還知道 tcp和 udp,前者可以保證資料的正確和可靠性,後者則允許資料丟失。最後,我們還知道,在建立連線前,必須知道對方的 ip位址和埠號。除此,普通的程式設計師就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程式的時候,會使用多執行緒來處理併發訪問。我們還知道如...