欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

整個(gè)操作系統(tǒng)就是一個(gè)中斷驅(qū)動(dòng)的死循環(huán)

Linux愛(ài)好者 ? 來(lái)源:低并發(fā)編程 ? 作者:閃客sun ? 2021-11-22 09:36 ? 次閱讀
本來(lái)想寫(xiě)內(nèi)核如何接收一個(gè)網(wǎng)絡(luò)包這個(gè)過(guò)程,但發(fā)現(xiàn)把整個(gè)過(guò)程捋順了,還是很難的。推導(dǎo)整個(gè)過(guò)程的起點(diǎn)是中斷,包括硬中斷軟中斷而這個(gè)過(guò)程要是講清楚吧,感覺(jué)在整個(gè)網(wǎng)絡(luò)包接收原理的大流程中有點(diǎn)喧賓奪主。但要是一筆帶過(guò)吧,那對(duì)于這塊有困惑的人就很難受,一切的起點(diǎn)沒(méi)整明白在心里總是個(gè)疙瘩。所以,單拎出來(lái)一個(gè)主題中斷,給大家把這個(gè)問(wèn)題搞明白了。另外,整個(gè)操作系統(tǒng)就是一個(gè)中斷驅(qū)動(dòng)的死循環(huán),操作系統(tǒng)原理如果用一行代碼解釋?zhuān)旅孢@樣再合適不過(guò)了。
while(true){
doNothing();
}
其他所有事情都是由操作系統(tǒng)提前注冊(cè)的中斷機(jī)制和其對(duì)應(yīng)的中斷處理函數(shù)完成,我們點(diǎn)擊一下鼠標(biāo),敲擊一下鍵盤(pán),執(zhí)行一個(gè)程序,都是用中斷的方式來(lái)通知操作系統(tǒng)幫我們處理這些事件,當(dāng)沒(méi)有任何需要操作系統(tǒng)處理的事件時(shí),它就乖乖停在死循環(huán)里不出來(lái)。所以,中斷,非常重要,它也是理解整個(gè)操作系統(tǒng)的根基,掌握它,不虧!那我們開(kāi)始吧。

五花八門(mén)的中斷分類(lèi)

關(guān)于中斷的分類(lèi),教科書(shū)上和網(wǎng)上有很多"標(biāo)準(zhǔn)"答案了,如果你用搜索引擎去尋找答案,可能會(huì)找出很多不一樣的分類(lèi)結(jié)果。所以我打算直接在 Intel 手冊(cè)上找個(gè)最官方的標(biāo)準(zhǔn)答案。Intel 手冊(cè) Volume 1 Chapter 6.4 Interrupts and Exception 給出。 翻譯過(guò)來(lái)就是,中斷可以分為中斷和異常,異常又可以分為故障、陷阱、中止。第一句話有點(diǎn)奇怪,啥叫中斷分為中斷和異常呢?你看好多文章的時(shí)候也是這么寫(xiě)的,不知道你有沒(méi)有曾疑惑過(guò)。但其實(shí)原文的意思準(zhǔn)確說(shuō)是,CPU 提供了兩種中斷程序執(zhí)行的機(jī)制,中斷和異常。第一個(gè)中斷是個(gè)動(dòng)詞,第二個(gè)中斷才是真正的機(jī)制種類(lèi)。好吧,我感覺(jué)原文也挺奇怪的,但人家就這么叫,沒(méi)轍。接下來(lái)我只需要翻譯一下就好了,再夾雜點(diǎn)自己的解讀。An interrupt is an asynchronous event that is typically triggered by an I/O device.先說(shuō)第一個(gè)機(jī)制中斷(interrupt),中斷是一個(gè)異步事件,通常由 IO 設(shè)備觸發(fā)。比如點(diǎn)擊一下鼠標(biāo)、敲擊一下鍵盤(pán)等。An exception is a synchronous event that is generated when the processor detects one or more predefined conditions while executing an instruction.再說(shuō)第二個(gè)機(jī)制異常(exception),異常是一個(gè)同步事件,是 CPU 在執(zhí)行指令時(shí)檢測(cè)到的反常條件。比如除法異常、錯(cuò)誤指令異常,缺頁(yè)異常等。這兩個(gè)機(jī)制,殊途同歸,都是讓 CPU 收到一個(gè)中斷號(hào),至于 CPU 收到這個(gè)中斷號(hào)之后干嘛,我們暫且不管。 我們先看看收到中斷號(hào)之前,具體就是中斷和異常到底是怎么做到給 CPU 一個(gè)中斷號(hào)的。先說(shuō)中斷,別眨眼。有一個(gè)設(shè)備叫做編程中斷控制器,它有很多的 IRQ 引腳線,接入了一堆能發(fā)出中斷請(qǐng)求的硬件設(shè)備,當(dāng)這些硬件設(shè)備給 IRQ 引腳線發(fā)一個(gè)信號(hào)時(shí),由于可編程中斷控制器提前被設(shè)置好了 IRQ 與中斷號(hào)的對(duì)應(yīng)關(guān)系,所以就轉(zhuǎn)化成了對(duì)應(yīng)的中斷號(hào),把這個(gè)中斷號(hào)存儲(chǔ)在自己的一個(gè)端口上,然后給 CPU 的 INTR 引腳發(fā)送一個(gè)信號(hào),CPU 收到 INTR 引腳信號(hào)后去剛剛的那個(gè)端口讀取到這個(gè)中斷號(hào)的值。估計(jì)你被繞暈了,但讀我的文章有個(gè)好處,太復(fù)雜就上動(dòng)圖,來(lái)吧。 你看,最終的目標(biāo),就是讓 CPU 知道,有中斷了,并且也知道中斷號(hào)是多少。比如上圖中按下了鍵盤(pán),最終到 CPU 那里的反應(yīng)就是,得到了一個(gè)中斷號(hào) 0x21那異常的機(jī)制就更簡(jiǎn)單了,是 CPU 自己執(zhí)行指令時(shí)檢測(cè)到的一些反常情況,然后自己給自己一個(gè)中斷號(hào)即可,無(wú)需外界給。比如 CPU 執(zhí)行到了一個(gè)無(wú)效的指令,則自己給自己一個(gè)中斷號(hào) 0x06,這個(gè)中斷號(hào)是 Intel 的 CPU 提前就規(guī)定好寫(xiě)死了的硬布線邏輯。好了,到目前為止,我們知道了無(wú)論是中斷還是異常,最終都是通過(guò)各種方式,讓 CPU 得到一個(gè)中斷號(hào)。只不過(guò)中斷是通過(guò)外部設(shè)備給 CPU 的 INTR 引腳發(fā)信號(hào),異常是 CPU 自己執(zhí)行指令的時(shí)候發(fā)現(xiàn)特殊情況觸發(fā)的,自己給自己一個(gè)中斷號(hào)。還有一種方式可以給到 CPU 一個(gè)中斷號(hào),但 Intel 手冊(cè)寫(xiě)在了后面,Chapter 6.4.4 INT n,就是大名鼎鼎的 INT 指令。 INT 指令后面跟一個(gè)數(shù)字,就相當(dāng)于直接用指令的形式,告訴 CPU 一個(gè)中斷號(hào)。比如 INT 0x80,就是告訴 CPU 中斷號(hào)是 0x80。Linux 內(nèi)核提供的系統(tǒng)調(diào)用,就是用了 INT 0x80 這種指令。那我們上面的圖又豐富了起來(lái)。 有的地方喜歡把他們做一些區(qū)分,把 INT n 這種方式叫做軟件中斷,因?yàn)樗怯绍浖绦蛑鲃?dòng)觸發(fā)的。相應(yīng)的把上面的中斷和異常叫做硬件中斷,因?yàn)樗麄兌际怯布詣?dòng)觸發(fā)的。但我覺(jué)得大可不必,一共就這么幾個(gè)分類(lèi),干嘛還要增加一層理解的成本呢,記三個(gè)方式不好么?好了,總結(jié)一下,給 CPU 一個(gè)中斷號(hào)有三種方式,而這也是中斷分類(lèi)的依據(jù)。

1.通過(guò)中斷控制器給 CPU 的 INTR 引腳發(fā)送信號(hào),并且允許 CPU 從中斷控制器的一個(gè)端口上讀取中斷號(hào),比如按下鍵盤(pán)的一個(gè)按鍵,最終會(huì)給到 CPU 一個(gè) 0x21 中斷號(hào)。

2.CPU 執(zhí)行某條指令發(fā)現(xiàn)了異常,會(huì)自己觸發(fā)并給自己一個(gè)中斷號(hào),比如執(zhí)行到了無(wú)效指令,CPU 會(huì)給自己一個(gè) 0x06 的中斷號(hào)。

3.執(zhí)行 INT n 指令,會(huì)直接給 CPU 一個(gè)中斷號(hào) n,比如觸發(fā)了 Linux 的系統(tǒng)調(diào)用,實(shí)際上就是執(zhí)行了 INT 0x80 指令,那么 CPU 收到的就是一個(gè) 0x80 中斷號(hào)。

再往后,CPU 以各種不同的方式收到的這些 0x21 0x06 0x80,都會(huì)一視同仁,做同樣的后續(xù)處理流程,所以從現(xiàn)在開(kāi)始,前面的事情就不用再管了,這也體現(xiàn)了分層的好處。

收到中斷號(hào)之后 CPU 干嘛?

那 CPU 收到中斷號(hào)后,如何處理呢?先用一句不太準(zhǔn)確的話總結(jié),CPU 收到一個(gè)中斷號(hào) n 后,會(huì)去中斷向量表中尋找第 n 個(gè)中斷描述符,從中斷描述符中找到中斷處理程序的地址,然后跳過(guò)去執(zhí)行。為什么說(shuō)不準(zhǔn)確呢?因?yàn)閺闹袛嗝枋龇姓业降?,并不直接是程序的地址,而?/span>段選擇子段內(nèi)偏移地址。然后段選擇子又會(huì)去全局描述符表中尋找段描述符,從中取出段基址。之后段基址 + 段內(nèi)偏移地址,才是最終處理程序的入口地址。

當(dāng)然這個(gè)入口地址,還不是最終的物理地址,如果開(kāi)啟了分頁(yè),又要經(jīng)歷分頁(yè)機(jī)制的轉(zhuǎn)換,就像下面這樣。

不過(guò)不要擔(dān)心,這不是中斷的主流程,因?yàn)榉侄螜C(jī)制和分頁(yè)機(jī)制是所有地址轉(zhuǎn)換過(guò)程的必經(jīng)之路,并不是中斷這個(gè)流程所特有的。所以我們簡(jiǎn)單的把中斷描述符表中存儲(chǔ)的地址,直接當(dāng)做 CPU 可以跳過(guò)去執(zhí)行的中斷處理程序的入口地址,就好了,不影響理解他們。你看,這是不是簡(jiǎn)單很多。那接下來(lái)的問(wèn)題就很簡(jiǎn)單了,這里出現(xiàn)了兩個(gè)名詞,那就分別對(duì)他們進(jìn)行發(fā)問(wèn)。

1. 中斷描述符表是啥?

2.中斷描述符是啥?

3. 去哪里找他們?

分別回答即可

中斷描述符表是啥?

就是一個(gè)在內(nèi)存中的數(shù)組而已,操作系統(tǒng)初始化過(guò)程中,有很多結(jié)構(gòu)都稱之為 XXX 表,其實(shí)就是個(gè)數(shù)組罷了。以 linux-2.6.0 源碼為例,就很直觀了。
structdesc_structidt_table[256]={{0,0},};
你看,是一個(gè)大小為 256 的數(shù)組。idt_table 這個(gè)名字就是 Interrupt Descriptor Table,逐字翻譯過(guò)來(lái)確實(shí)就是中斷描述符表

中斷描述符是啥?

就是中斷描述符表這個(gè)數(shù)組里的存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),通過(guò)剛剛的源碼也可以看出來(lái),是一個(gè)叫 desc_struct 的結(jié)構(gòu)。
structdesc_struct{
unsignedlonga,b;
};
好家伙,Linux 源碼里就這么簡(jiǎn)單粗暴表示,一個(gè)中斷描述符的大小為 64 位,也就是 8 個(gè)字節(jié),具體里面存的啥通過(guò)這個(gè)源碼看不出來(lái)。翻一下 Intel 手冊(cè),在 Volumn 3 Chapter 5.11 IDT Descriptors 中找到了一張圖。 可以看到,中斷描述符具體還分成好幾個(gè)種類(lèi),有:

Task Gate:任務(wù)門(mén)描述符

Interrupt Gate:中斷門(mén)描述符

Trap Gate:陷阱門(mén)描述符

不要慌,其中任務(wù)門(mén)描述符 Linux 中幾乎沒(méi)有用到。中斷門(mén)描述符和陷阱門(mén)描述符的區(qū)別僅僅是是否允許中斷嵌套,實(shí)現(xiàn)方式非常簡(jiǎn)單粗暴,就是 CPU 如果收到的中斷號(hào)對(duì)應(yīng)的是一個(gè)中斷門(mén)描述符,就修改 IF 標(biāo)志位(就是一個(gè)寄存器中一位的值),修改了這個(gè)值后就屏蔽了中斷,也就防止了中斷的嵌套。而陷阱門(mén)沒(méi)有改這個(gè)標(biāo)志位,也就允許了中斷的嵌套。所以簡(jiǎn)單理解的話,你把他們當(dāng)做同樣一個(gè)描述符就好了,先別管這些細(xì)節(jié),他們的結(jié)構(gòu)幾乎完全一樣,只是差了一個(gè)類(lèi)型標(biāo)識(shí)罷了。那這個(gè)中斷描述符的結(jié)構(gòu)長(zhǎng)什么樣呢?我們可以清晰地看到,里面有段選擇子段內(nèi)偏移地址 回顧下剛剛說(shuō)的中斷處理流程。

沒(méi)騙你吧。

但以上這些如果你都搞不明白,還是那句話,記這個(gè)最簡(jiǎn)單的流程就好了,不影響理解。

好了,現(xiàn)在我們直觀地看到了中斷描述符表這個(gè) 256 大小的數(shù)組,以及它里面存的中斷描述符長(zhǎng)什么樣子,最終的目的,還是幫助 CPU 找到一個(gè)程序的入口地址,然后跳轉(zhuǎn)過(guò)去。OK,下一個(gè)問(wèn)題,就是 CPU 怎么尋找到這個(gè)中斷描述符表的位置呢?它是在內(nèi)存中一個(gè)固定的位置么?

CPU 怎么找到中斷描述符表

答案是否定的,中斷描述符表在哪里,全憑各個(gè)操作系統(tǒng)的喜好,想放在哪里就放在哪里,但需要通過(guò)某種方式告訴 CPU,即可。怎么告訴呢?CPU 提前預(yù)留了一個(gè)寄存器叫 IDTR 寄存器,這里面存放的就是中斷描述符表的起始地址,以及中斷描述符表的大小。Volumn 3 Chapter 5.10 Interrupt Descriptor Table 中告訴了我們 IDTR 寄存器的結(jié)構(gòu)。 操作系統(tǒng)的代碼可以通過(guò) LIDT 指令,將中斷描述符表的地址放在這個(gè)寄存器里。還記得剛剛看的源碼么?中斷描述符表就是這個(gè)。
structdesc_structidt_table[256]={{0,0},};
然后操作系統(tǒng)把這個(gè)的地址用 LIDT 指令放在 IDTR 寄存器就行了。IDTR 寄存器里的值一共 48 位,前 16 位是中斷描述符表大小(字節(jié)數(shù)),后 32 位是中斷描述符表的起始內(nèi)存地址,就是這個(gè) idt_table 的位置。

Linux-2.6.0 源碼中是這樣構(gòu)造這個(gè)結(jié)構(gòu)的,簡(jiǎn)單粗暴。

idt_descr:
.word256*8-1
.longidt_table

緊接著,一個(gè) LIDT 指令把這個(gè)結(jié)構(gòu)放到 IDTR 寄存器中。

lidtidt_descr

整個(gè)過(guò)程一氣呵成,呵得我連代碼格式都懶得調(diào)了,是不是很清晰明了。

這樣,CPU 收到一個(gè)中斷號(hào)后,中斷描述符表的起始位置從 IDTR 寄存器中可以知道,而且里面的每個(gè)中斷描述符都是 64 位大小,也就是 8 個(gè)字節(jié),那自然就可以找到這個(gè)中斷號(hào)對(duì)應(yīng)的中斷描述符。接下來(lái)的問(wèn)題就是,這個(gè)中斷描述符表是誰(shuí)來(lái)提前寫(xiě)好的?又是怎么寫(xiě)的?

誰(shuí)把中斷描述符表這個(gè)結(jié)構(gòu)寫(xiě)在內(nèi)存的

很簡(jiǎn)單,操作系統(tǒng)唄。在 Linux-2.6.0 內(nèi)核源碼的 traps.c 文件中,有這樣一段代碼。
void__inittrap_init(void){
set_trap_gate(0,÷_error);
...
set_trap_gate(6,&invalid_op);
...
set_intr_gate(14,&page_fault);
...
set_system_gate(0x80,&system_call);
}
你看,我們剛剛提到的除法異常、非法指令異常、缺頁(yè)異常,以及之后可能通過(guò) INT 0x80 觸發(fā)系統(tǒng)調(diào)用的中斷處理函數(shù) system_call,就是這樣被寫(xiě)到了中斷描述符表里。 經(jīng)過(guò)這樣一番操作后,我們的中斷描述符表里的值就豐富了起來(lái)。好了,現(xiàn)在只剩下最后一個(gè)問(wèn)題了,CPU 在找到一個(gè)中斷描述符后,如何跳過(guò)去執(zhí)行?

找到中斷描述符后,干嘛

現(xiàn)在這個(gè)問(wèn)題可以再問(wèn)得大一些了,就是 CPU 在收到一個(gè)中斷號(hào)并且找到了中斷描述符之后,究竟做了哪些事?當(dāng)然,最簡(jiǎn)單的辦法就是,直接把中斷描述符里的中斷程序地址取出來(lái),放在自己的 CS:IP 寄存器中,因?yàn)檫@里存的值就是下一跳指令的地址,只要放進(jìn)去了,到下一個(gè) CPU 指令周期時(shí),就會(huì)去那里繼續(xù)執(zhí)行了。但 CPU 并沒(méi)有這樣簡(jiǎn)單粗暴,而是幫助我們程序員做了好多額外的事情,這增加了我們的學(xué)習(xí)和理解成本,但方便了寫(xiě)操作系統(tǒng)的程序員,拿到一些中斷的信息,以及中斷程序結(jié)束后的返回工作。但其實(shí),就是做了一些壓棧操作。

1. 如果發(fā)生了特權(quán)級(jí)轉(zhuǎn)移,壓入之前的堆棧段寄存器 SS 及棧頂指針 ESP 保存到棧中,并將堆棧切換為 TSS 中的堆棧。

2. 壓入標(biāo)志寄存器 EFLAGS。

3. 壓入之前的代碼段寄存器 CS 和指令寄存器 EIP,相當(dāng)于壓入返回地址。

4. 如果此中斷有錯(cuò)誤碼的,壓入錯(cuò)誤碼 ERROR_CODE

5. 結(jié)束(之后就跳轉(zhuǎn)到中斷程序了)

壓棧操作結(jié)束后,棧就變成了這個(gè)樣子。

特權(quán)級(jí)的轉(zhuǎn)移需要切換棧,所以提前將之前的棧指針壓入。錯(cuò)誤碼可以方便中斷處理程序做一些工作,如果需要,從棧頂拿到就好了。拋開(kāi)這兩者不說(shuō),剩下的就只有標(biāo)志寄存器中斷發(fā)生前的代碼地址,被壓入了棧,這很好理解,就是方便中斷程序結(jié)束后,返回原來(lái)的代碼嘛~具體的壓棧工作,以及如何利用這些棧的信息達(dá)到結(jié)束中斷并返回原程序的效果,Intel 手冊(cè)中也寫(xiě)得很清楚。

看下面的話,通過(guò)配合 IRET IRETD 指令返回。由于后續(xù)版本的 Linux 自己的玩法比較多,已經(jīng)不用 Intel 提供的現(xiàn)成指令了,所以這回我們從 Linux-0.11 版源碼中尋找答案。比如除法異常的中斷處理函數(shù),在 asm.s 中。
_divide_error:
 push dword ptr _do_divide_error ;
no_error_code: ;
 xchg [esp],eax ;
 push ebx
 push ecx
 push edx
 push edi
 push esi
 push ebp
 push ds ;
 push es
 push fs
 push 0 ;
 lea edx,[esp+44] ;
 push edx
 mov edx,10h ;
 mov ds,dx
 mov es,dx
 mov fs,dx
 call eax ;
 add esp,8 ;
 pop fs
 pop es
 pop ds
 pop ebp
 pop esi
 pop edi
 pop edx
 pop ecx
 pop ebx
 pop eax ;// 彈出原來(lái)eax 中的內(nèi)容。
 iretd
只看最后一行,確實(shí)用了 iretd 指令。這個(gè)指令會(huì)依次彈出棧頂?shù)娜齻€(gè)元素,把它們分別賦值給 EIP,CS 和 EFLAGS,而棧頂?shù)娜齻€(gè)元素,又恰好是 EIP,CS 和 EFLAGS 這樣的順序,你說(shuō)這巧不巧?當(dāng)然不巧,人家 CPU 執(zhí)行中斷函數(shù)前做了壓棧操作,然后又提供了 iret 指令做彈棧操作,當(dāng)然是給你配套使用的!你看,中斷是如何切到中斷處理程序的?就是靠中斷描述符表中記錄的地址。那中斷又如何回到原來(lái)的代碼繼續(xù)執(zhí)行呢?是通過(guò) CPU 幫我們把中斷發(fā)生前的地址壓入了棧中,然后我們程序自己利用他們?nèi)シ祷?,?dāng)然也可以不返回。這就是 CPU 和操作系統(tǒng)配合的結(jié)果,把中斷這個(gè)事給解決了。

總結(jié)

所以總結(jié)起來(lái)就是,理解中斷,只要回答了這幾個(gè)問(wèn)題就好。如何給 CPU 一個(gè)中斷號(hào)?

外部設(shè)備通過(guò) INTR 引腳,或者 CPU 執(zhí)行指令的過(guò)程中自己觸發(fā),或者由軟件通過(guò) INT n 指令強(qiáng)行觸發(fā)。

同樣中斷也是這樣進(jìn)行分類(lèi)的。

CPU 收到中斷號(hào)后如何尋找到中斷程序的入口地址?

通過(guò) IDTR 寄存器找到中斷描述符表,通過(guò)中斷描述符表和中斷號(hào)定位到中斷描述符,取出中斷描述符表中存儲(chǔ)的程序入口地址。

中斷描述符表是誰(shuí)寫(xiě)的?

操作系統(tǒng)代碼寫(xiě)上去的。

找到程序入口地址之后,CPU 做了什么?

簡(jiǎn)單說(shuō),實(shí)際上做的事情就是壓棧,并跳轉(zhuǎn)到入口地址處執(zhí)行代碼。而壓棧的目的,就是保護(hù)現(xiàn)場(chǎng)(原來(lái)的程序地址、原來(lái)的程序堆棧、原來(lái)的標(biāo)志位)和傳遞信息(錯(cuò)誤碼)

好了,中斷講完了,如果再往后擴(kuò)大一點(diǎn)點(diǎn)概念,以上說(shuō)的中斷,統(tǒng)統(tǒng)都是硬中斷。注意,不叫硬件中斷哦。為什么叫硬中斷呢?因?yàn)檫@是 Intel CPU 這個(gè)硬件實(shí)現(xiàn)的中斷機(jī)制,注意這里是實(shí)現(xiàn)機(jī)制,并不是觸發(fā)機(jī)制,因?yàn)橛|發(fā)可以通過(guò)外部硬件,也可以通過(guò)軟件的 INT 指令。那與硬中斷對(duì)應(yīng)的還有軟中斷,這個(gè)概念網(wǎng)上好多地方都講錯(cuò)了,把軟中斷和 INT 指令這種軟件中斷混淆了,所以我覺(jué)得軟件中斷最好稱其為,由軟件觸發(fā)的中斷,而軟中斷稱其為軟件實(shí)現(xiàn)的中斷。軟中斷是純粹由軟件實(shí)現(xiàn)的一種類(lèi)似中斷的機(jī)制,實(shí)際上它就是模仿硬件,在內(nèi)存中有一個(gè)地方存儲(chǔ)著軟中斷的標(biāo)志位,然后由內(nèi)核的一個(gè)線程不斷輪詢這些標(biāo)志位,如果有哪個(gè)標(biāo)志位有效,則再去另一個(gè)地方尋找這個(gè)軟中斷對(duì)應(yīng)的中斷處理程序。軟中斷是 Linux 實(shí)現(xiàn)中斷的下半部的一種非常常見(jiàn)的方式,之后我講 Linux 內(nèi)核如何接受網(wǎng)絡(luò)包這個(gè)事情的時(shí)候也可以看到,軟中斷是研究整個(gè)過(guò)程的一個(gè)突破口。
責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6900

    瀏覽量

    123814
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7600

    瀏覽量

    89306
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    900

    瀏覽量

    41796

原文標(biāo)題:好家伙!原來(lái)硬中斷就是這樣的

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】- 第5章閱讀有感

    功能,比如如何控制個(gè)傳感器獲取數(shù)據(jù),如何控制顯示屏顯示圖像等。每個(gè)驅(qū)動(dòng)程序都有個(gè)主要的入口點(diǎn)(driver entry),就像
    發(fā)表于 02-02 00:34

    【「鴻蒙操作系統(tǒng)設(shè)計(jì)原理與架構(gòu)」閱讀體驗(yàn)】01-

    操作系統(tǒng)的設(shè)計(jì)假設(shè)和約束,是萬(wàn)物互聯(lián)時(shí)代智能終端操作系統(tǒng)領(lǐng)域的次大膽探索 本書(shū)首先講解了操作系統(tǒng)些歷史以及演進(jìn)的過(guò)程,了解
    發(fā)表于 01-25 11:05

    國(guó)產(chǎn)銀河麒麟操作系統(tǒng)V10和星光麒麟V1.0操作系統(tǒng)如何選擇?

    國(guó)產(chǎn)銀河麒麟操作系統(tǒng)和星光麒麟操作系統(tǒng)都是由中國(guó)電子旗下科技企業(yè)麒麟軟件有限公司(簡(jiǎn)稱“麒麟軟件”)開(kāi)發(fā)的國(guó)產(chǎn)自主可控的操作系統(tǒng)。麒麟軟件介紹:麒麟軟件以安全可信操作系統(tǒng)技術(shù)為核心,面
    的頭像 發(fā)表于 01-24 09:14 ?393次閱讀
    國(guó)產(chǎn)銀河麒麟<b class='flag-5'>操作系統(tǒng)</b>V10和星光麒麟V1.0<b class='flag-5'>操作系統(tǒng)</b>如何選擇?

    deepin操作系統(tǒng)介紹

    希望從自己的能力和對(duì)桌面操作系統(tǒng)的理解,能給 Linux 的用戶與開(kāi)發(fā)者更多的選擇。我們也相信 deepin 能夠得到更多用戶的認(rèn)可與喜愛(ài),成為開(kāi)源世界的最佳選擇。? 、 deepin 操作系統(tǒng) 先說(shuō) Linux
    的頭像 發(fā)表于 12-23 09:08 ?664次閱讀
    deepin<b class='flag-5'>操作系統(tǒng)</b>介紹

    linux操作系統(tǒng)安裝步驟 linux操作系統(tǒng)的特點(diǎn)及組成

    Linux操作系統(tǒng)安裝步驟 Linux操作系統(tǒng)種開(kāi)源的操作系統(tǒng),它以其穩(wěn)定性、安全性和靈活性而聞名。以下是安裝Linux操作系統(tǒng)
    的頭像 發(fā)表于 10-21 11:24 ?686次閱讀

    使用CSL來(lái)補(bǔ)充操作系統(tǒng)調(diào)度程序處理級(jí)聯(lián)中斷

    電子發(fā)燒友網(wǎng)站提供《使用CSL來(lái)補(bǔ)充操作系統(tǒng)調(diào)度程序處理級(jí)聯(lián)中斷.pdf》資料免費(fèi)下載
    發(fā)表于 10-16 10:12 ?0次下載
    使用CSL來(lái)補(bǔ)充<b class='flag-5'>操作系統(tǒng)</b>調(diào)度程序處理級(jí)聯(lián)<b class='flag-5'>中斷</b>

    為了學(xué)習(xí)內(nèi)核開(kāi)發(fā),大佬手搓了個(gè)輕量級(jí)操作系統(tǒng)YiYiYa OS

    作者:evilbinary(鴨佬) YiYiYa操作系統(tǒng)個(gè)樸實(shí)無(wú)華的操作系統(tǒng),追求快速開(kāi)發(fā),最小實(shí)現(xiàn),同時(shí)遵循SOLID原則。編碼簡(jiǎn)潔明了,非常適合學(xué)習(xí)
    發(fā)表于 08-30 14:57

    為了學(xué)習(xí)內(nèi)核開(kāi)發(fā),大佬手搓了個(gè)輕量級(jí)操作系統(tǒng)YiYiYa OS

    YiYiYa操作系統(tǒng)個(gè)樸實(shí)無(wú)華的操作系統(tǒng),追求快速開(kāi)發(fā),最小實(shí)現(xiàn),同時(shí)遵循SOLID原則。編碼簡(jiǎn)潔明了,非常適合學(xué)習(xí)操作系統(tǒng)的同學(xué)。目
    發(fā)表于 08-27 10:08

    嵌入式實(shí)時(shí)操作系統(tǒng):Intewell操作系統(tǒng)與VxWorks操作系統(tǒng)有啥區(qū)別

    Intewell操作系統(tǒng)和VxWorks操作系統(tǒng)都是工業(yè)領(lǐng)域常用的操作系統(tǒng),它們各有特點(diǎn)和優(yōu)勢(shì)。以下是它們之間的些主要區(qū)別:
    的頭像 發(fā)表于 07-08 14:16 ?520次閱讀
    嵌入式實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>:Intewell<b class='flag-5'>操作系統(tǒng)</b>與VxWorks<b class='flag-5'>操作系統(tǒng)</b>有啥區(qū)別

    STM32F107中斷死循環(huán)的原因?

    STM32F107,中斷死循環(huán)
    發(fā)表于 05-11 06:31

    聊聊MCU死循環(huán),用for(;;)還是while(1)?

    首先,問(wèn)大家個(gè)問(wèn)題:你們寫(xiě)單片機(jī)程序【死循環(huán)】時(shí),喜歡用for(;;)還是while(1)?快來(lái)為你喜歡用的【死循環(huán)】打call,評(píng)論區(qū)等你哦~
    的頭像 發(fā)表于 04-29 08:10 ?1474次閱讀
    聊聊MCU<b class='flag-5'>死循環(huán)</b>,用for(;;)還是while(1)?

    帶你認(rèn)識(shí)實(shí)時(shí)操作系統(tǒng)(rtos)

    實(shí)時(shí)操作系統(tǒng)(RTOS)是為嵌入式系統(tǒng)和實(shí)時(shí)應(yīng)用提供個(gè)穩(wěn)定、可預(yù)測(cè)和高效運(yùn)行環(huán)境的操作系統(tǒng)。實(shí)時(shí)操作系
    的頭像 發(fā)表于 04-16 16:30 ?1455次閱讀
    帶你認(rèn)識(shí)實(shí)時(shí)<b class='flag-5'>操作系統(tǒng)</b>(rtos)

    STM32F412RET6串口輪詢發(fā)送阻塞等待TC,導(dǎo)致程序陷入死循環(huán)怎么解決?

    前段時(shí)間在做一個(gè)CAN轉(zhuǎn)USART的網(wǎng)關(guān),使用的是STM32F412RET6,軟件框架使用的是RT-Thread操作系統(tǒng),主要外設(shè)資源使用了CAN1、CAN2、UART2、UART3,在做通信壓力
    發(fā)表于 03-21 07:51

    rt1052如何將整個(gè)中斷程序搬到RAM中運(yùn)行?

    我想將rt1052整個(gè)中斷程序都搬到itcm中運(yùn)行,發(fā)現(xiàn)中斷總有小部分的匯編代碼還是在norflash中運(yùn)行。 如下圖所示,: (注意,startup_MIMXRT1052.S中
    發(fā)表于 03-05 08:01

    個(gè)成熟且可靠的開(kāi)源實(shí)時(shí)操作系統(tǒng)

    市場(chǎng)上有許多專(zhuān)有和開(kāi)源實(shí)時(shí)操作系統(tǒng)(RTOS)。ThreadX已經(jīng)以其對(duì)小代碼大小和高性能的關(guān)注而聞名。然而,它的競(jìng)爭(zhēng)優(yōu)勢(shì)遠(yuǎn)遠(yuǎn)超出了這些屬性。
    的頭像 發(fā)表于 02-20 12:26 ?982次閱讀