中斷向量為什麼叫中斷向量?

中斷向量是中斷服務程序的入口地址。請問它的名稱是怎麼來的?和向量有什麼關係?


向量啊,就是一維張量,或者說,n*1或者1*n矩陣

所以,顯然,在STL之前,數學家和物理學家們早就把一維數組叫做向量了

……當然還有無窮維向量這種奇葩

而中斷向量呢,就是

vector&


向量就是數組呀,說的是中斷了之後可以根據上下文,從數組裡面挑選一個陷阱,然後踩進去的這麼個過程。

有很多人九曲十八彎的說vector是用來形容指針的,這純屬無稽之談,這麼多年來從來沒有過什麼流行的說法是這樣子講的。

後面還有人說intel的FS:[0]叫exception vector,但實際上vector在這裡解釋為鏈表,所以還是一樣的,不可能是指針的(逃。以前我還用彙編親自弄過try-catch,印象深刻(JIT腳本引擎:使用彙編實現__try和__catch - λ-calculus(驚愕到手了歐耶,GetBlogPostIds.aspx) - C++博客)。


別贊這個答案了,我的觀點是錯誤的,拖了一個月沒有回來修改這個答案。這幾vector不是數組的意思,而是指針的意思,就是能夠指引程序流程轉移到中斷常式的一個箭頭。

---------------以下是錯誤觀點-----------

@vczh 說的沒毛病

中斷向量(表不表都無所謂,加個表是為了使中文翻譯更形象,向量Vecter就是數組,也是表結構)

這裡向量就是中斷函數地址的所組成的數組的意思。

中斷向量(表)裡面的每一個元素都是一個中斷服務程序(interrupt service procedure)的地址。

一台計算機有若干個層次的中斷處理系統。

裸機無任何操作系統,只要有BIOS,就有BIOS中斷向量表,也叫硬體中斷向量表,這是IBM PC體系中最最低層,最接近硬體的中斷系統了,裸機編程可以用彙編來調用BIOS中斷。BIOS中斷系統的中斷向量表是BIOS上電以後BIOS ROM中的程序初始化的,初始化過程中主要是確定向量表的首地址,數組長度,以及數組中的內容,數組中的內容都是內存地址,但是實際上這些內存地址所指向的服務程序代碼都是在BIOS的ROM中的,至於為什麼可以通過內存地址訪問BIOS ROM代碼,是因為

北橋晶元(後改為MCH內存控制中心)做了內存地址映射。具體過程可以看這個簡單OS開發前奏(二)BIOS啟動過程-硬體檢測及初始化淺析

雖然是硬體中斷,但是也為程序員提供了可編程能力,就是你可以替換中斷向量表中的地址,典型應用是BIOS 80H 中斷,這個中斷是主板時鐘晶元組每隔1/18.2秒硬體自動觸發,然後調用你設置的中斷程序(這個應該是現在高級編程中的回調函數的鼻祖了),可以看看這個彙編語言裸機實現時鐘程序-BCD轉ASCII,修改中斷向量表

DOS操作系統,除了底層的BIOS中斷系統,DOS也自己實現了一套中斷系統,所以在DOS中編程,既可以調用DOS中斷,也可以調用BIOS中斷,而DOS中斷系統中的大部分中斷服務程序都會調用底層的BIOS中斷。而且DOS中斷向量表在內存中緊挨著BIOS中斷向量表的,初始化過程是在DOS系統的boot階段。

到了80x86CPU以後,出現了保護模式,在這一層級上又提供了更加龐大複雜的中斷系統,同時也提供了任務系統,什麼中斷門,選擇子,任務門,任務段一系列底層術語。但是都是換湯不換藥,仍然是表驅動,仍然是存儲中斷服務程序的地址。詳細可以看這裡

Windows系統調用架構分析-也談KiFastCallEntry函數地址的獲取

說白了,中斷向量表裡面存的僅僅是一個內存地址,中斷髮生時候,CPU執行流程立刻跳轉到目標地址,開始取址-解碼-執行流水線。這裡可不是什麼函數指針,因為沒有任何調用約定,參數全部通過寄存器傳遞,至於怎麼傳,完全是根據中斷服務程序怎麼使用寄存器來傳的。


學習最怕的就是不知輕重,糾纏一些無所謂的東西,名詞細究就是這麼一個很典型的例子,其他典型的例子比如前端研究閉包非同步,天天高呼這震驚那的

須知這些東西都是人搞出來的,漏洞缺點都是滿天飛,你用完美病心態去對待這些東西,會很容易溺斃在糞坑裡

就像你玩遊戲,固執地認為遊戲是平衡的(因為你覺得並且製作方告訴你(主要是你覺得……)遊戲是平衡的),然後玩一些垃圾角色被遊戲玩,死都不知道自己怎麼死的


我的看法跟 @vczh 不一樣呢。

「中斷向量」(interrupt vector)是放在「中斷向量表」(interrupt vector table)里的。我覺得這裡的「表」才是「數組」的意思,而每個「中斷向量」是數組中的元素,是指向中斷服務程序的指針。之所以把這個「指針」叫作「向量」,是因為「向量」可以看成是「有方向的量」,所以具有「指向」的功能。

如果要問為什麼叫「中斷向量」而不叫「中斷指針」,我猜測可能是因為「中斷向量」產生的時候,「指針」這個詞還沒有通行。另外,我覺得「向量」一詞用於指「可變長數組」,可能也是在「中斷向量」產生之後的事情。不過我並不擅長考證歷史,如果有誰能夠考證出「指針」「中斷向量」「(指可變長數組的)向量」三個詞的產生年代,歡迎告訴我。


我在學習KL25嵌入式開發時,學到的中斷服務註冊是這樣的:

#ifdef VECTOR_029
#undef VECTOR_029
extern void isr_uart1_re(void);
#define VECTOR_029 isr_uart1_re
#endif

首先將在其他地方定義為NULL的中斷向量解定義,然後聲明實際應用的中斷函數,並將中斷函數綁定到中斷向量上。

軟體上,中斷向量就是在系統中預定義的函數指針。


中斷向量就是interrupt vector的翻譯,vector就是個一維數組,想想std::vector。

中斷向量表:中斷向量表_百度百科

中文維基這裡寫得少,英文維基我覺得你提問這個應該也不會去看,湊合看看百度吧。善用搜索。


不同意 @vczh 的觀點,贊同 @王贇 Maigo 的觀點。

首先上 Jack Ganssle 和 Michael Barr 在 Embedded Systems Dictionary 中對 IV 和 IVT 的定義:

interrupt vector n.

The address of an interrupt service routine.

USAGE: This term is sometimes used incorrectly to refer to either the interrupt type or the address of the interrupt vector.

interrupt vector table n.

A table containing interrupt vectors, indexed by interrupt type, that maps interrupts and interrupt service routines. The interrupt vector table must be initialized before interrupts are enabled.

很明顯 Interrupt Vector(中斷向量)指的是中斷服務程序的地址,它不是一個集合,那是 IVT 的意思。而 IBM 7090 (1961年)就已經有了 Interrupt 的概念,可以推斷 Interrupt Vector 可能出現的比指針概念開始流行的時間要早,所以這可能是沒有叫 Interrupt Pointer 的原因。

單詞 vector 的演化過程

而線性代數上,vector 就是有方向有長度的箭頭(姑且這麼說),而從英語發展的角度講,vector 一開始從拉丁語演化的時候,就是從 convey 的意思演化到 carrier 再演化到 vector 的,所以 vector 本身可以認為有 「從某個地方轉移到另外一個地方」 的意思,所以取 Interrupt Vector 之名。

針對 C++ 中的 Vector,我大膽猜測一下,一開始它的意思就是線性代數上的意思,不過不強調 「方向」 而是強調 「長度」,所以 vector 就被設計成可以自由伸縮的東西,只不過後面人發現用它來當伸縮數組用非常好,所以就當成數組用了。


可以理解為中斷向量表是中斷向量的表格,之所以叫向量可能是x86每一項中斷向量由(cs,ip)組成,相當於(x,y),這裡vector應該不是cpp里vector的意思,而是類似物理學裡向量的意思


覺得 @vczh 向量==數組 的說法 很有道理,但是覺得 @王贇 Maigo 的答案更科學。說點別的。這個讓很多人一臉蒙蔽的結果都是翻譯的鍋。

非語言專業,強答一發。

interrupt vector里的vector不管應該當做STL的的類似數組的數據結構講,還是取這個詞本來就有的能指向目的地的「航線」、「載體」的意思,都不應該被翻譯成向量。

數學/物理學一開始僅僅用vector表示的是有方向的量(這個詞還有航線、載體之類的意思)。然後向量的意思在數學中引申成(或者形式化地表述為?)了一行不能打亂順序的數字,計算機科學借用了這個東西,用vector來表示一行變數,即一維數組。

到國內翻譯的時候,數學物理把vector翻譯成向量(矢量)是根據字面原意翻譯的,沒毛病,然而計算機科學翻譯的時候,直接照搬了其他學科的譯名,本該用其形式化定義(一行有序變數)翻譯實際卻使用了字面直譯,所以搞出「向量」這麼個讓人一臉懵逼的詞。而

類似的還有function這個東西。剛開始學編程聽到「函數」這個概念時,我完全無法理解void類型的「函數」。函數本質上是一種映射,任何自變數都映射到什麼都沒有的void,怎麼能有這樣的映射呢?後來看到function這個名字,我才了解了這玩意到底是什麼。它不是一個有映射關係的「函數」,而是執行一定的「功能」。計算機翻譯function時直接照搬其他學科的譯名,坑了一批初學者。

再扯遠一點還有有理數rational number。翻譯時只想到rational是「有道理的」,卻沒想起來ratio這個詞,把「可比數」翻譯成了「有理數」。

這算是中文見詞識意特性這一優勢伴隨著的一個劣勢吧


51單片機程序存儲器,自0000H地址開始儲存有中斷向量,不同中斷可使得PC指針指向不同地址並開始執行。比如上電複位後pc指針指向0000H。我們一般在0000H到0003H之間寫一個LJMP跳轉,使得程序進入正常運行狀態。0003H地址寫跳轉,使得程序進入外部中斷0的中斷程序。

我個人傾向於認為「指針」和「向量」同意。

就是說中斷向量表存儲的中斷向量是用於PC指針跳轉到程序存儲器的不同位置,從而執行不同的功能。

確定的中斷向量有著確定的中斷入口地址,這樣在硬體上易於實現。

不管是PC機,arm內核晶元,還是簡單的51晶元,大致遵循同一套規則。

不過在寫pc端c語言程序的時候,null指針是不可訪問的。因為被系統保護。


很簡單,對於CPU來說,所有中斷就是一個向量表。這個向量表像一個數組一樣存儲所有中斷的服務函數的地址,觸發就查詢地址跳轉。說白了中斷向量就是個函數指針,所以叫這個名字沒什麼毛病啊。


中斷向量表是函數指針數組。。中斷向量是函數指針數組裡面的元素。只不過這個數組的地址比較特殊罷了。各家晶元不一樣。

例如,對於PowerPC E200Z0架構的MCU來說其中斷向量表的地址保存在INTC_IACKR寄存器當中:

INTC_IACKR(i) = (uint32_t)_vectors;

中斷向量:

.section .vectors, "axv"
_VLE
.align 4
.globl _vectors
_vectors:
.long vector0, vector1, vector2, vector3
.long vector4, vector5, vector6, vector7
.long vector8, vector9, vector10, vector11
.long vector12, vector13, vector14, vector15
.......

對於ARM Cortex-M系列的MCU,中斷向量表的地址保存在VTOR寄存器當中:

SCB-&>VTOR = FLASH_BASE | VECT_TAB_OFFSET;

中斷向量:

; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size

__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler

........


vector這個詞可以翻譯成矢量。一個矢量既包含數值,又包含方向。可以形象的理解為它是一個路牌指向某個地方。每次中斷,程序都要去看這個路牌。根據路牌指的方向到指定的中斷服務程序里。


不太認同輪子哥的說法。

在我玩ARM裸機的時候,「中斷向量表」才是一個地址(指針)數組,裡面儲存的每一個地址才是一個「中斷向量」。

當觸發中斷的時候,程序根據此中斷在「中斷向量表」中對應的地址,跳轉到中斷函數的代碼段,這個地址其實就是一個指針。我覺得因為這個地址是代碼跳轉的「方向」(跳轉指向),因此被稱之為「向量」,和「中斷」合起來就是「中斷向量」了。


我們要習慣於理解中國的計算機前輩。他們當時條件不好,小時候放養,長了才對計算機感興趣,只顧著學習計算機,往往從小到大都沒有較高的漢語言文學造詣。所以他們留下來的詞語,許多需要回爐。什麼預設,套接字。最直接的辦法就是推動漢字對計算機科學造字。詳見現在新事物越來越多,漢字是否應該加字加偏旁部首了? - 知乎


分頁阅读: 1 2