程序以下的那些事兒

2021-09-26 10:06:57 字數 1339 閱讀 3902

硬體驅動程式的最底層是什麼?是直接操作硬體的部分。直接與硬體互動的方法有2大類:

另外一種方式是irq。它是由硬體主動發起,打斷cpu正在執行的程式。cpu會跳到irq號對應的中斷號所對應的中斷服務程式。執行完中斷服務程式再返回到原來的程式。

所以,驅動程式往往包括這麼幾個部分:初始化(設定硬體狀態,安裝中斷服務例程等等)、讀操作、寫操作、中斷服務例程。

中斷服務例程(isr)如果什麼都不做,直接iret,就可以返回到被打斷的程式。(x86有一些中斷會有error code,要先彈出error code,這樣esp才會指向返回位址。)

問題是isr不能什麼都不做啊,還是要做事的。這就需要儲存原程序的上下文,做完事後,恢復上下文,然後iret,原來的程序才能繼續執行。儲存和恢復上下文是作業系統要做的事(硬體也會做一部分,寫os的人要搞清楚硬體做了什麼,還缺什麼)

程序的上下文其實就是程式(cs:eip)、堆疊(esp)、資料(ds),還有當前的cpu狀態(從軟體開發者角度看,主要是通用暫存器的值。其他的硬體負責儲存和恢復)。如果有分頁,就還涉及到頁表的切換。

iret本身只能負責恢復cs和eip,而且前提是執行iret前,esp必須指向返回位址。

作業系統給應用程式提供功能,也是通過中斷服務例程。比如linux的系統呼叫。就是應用程式執行int 80h。cpu就會跳到80號中斷服務例程。這個isr根據eax的值,決定具體呼叫哪個c函式(sys_open、sys_read、sys_write等等)。

stackoverflow: int 80h已經過時了

假如沒有中斷,就沒有併發了。

因為沒有其他辦法可以讓正在執行的程序停下來,除非他自己願意。

而且程序他自己願意停下來,也是用int指令,觸發軟中斷(系統呼叫system call)。機制和硬體中斷類似。

所以,沒有中斷,就沒有併發。

怎麼讓程序在非自願的情況下停下來?要用到時鐘中斷。可程式設計時鐘(intel 8253 - programmable interval timer)是每個pc上都有硬體,作業系統可以設定讓時鐘定時發出中斷。作業系統在時鐘中斷的服務例程裡,就可以切換程序。

多核處理器每個核(或者說每個hyperthread)都有自己的apic timer。

硬體中斷可以路由到指定的乙個或多個核,其他核不受影響。

如果程式要進入critical section,它不希望被非自願地打斷,他可以關中斷。關中斷這只能os使用,不可以給普通程序用,否則os怎麼保持控制權?關中斷只能關1個核的中斷,其他核仍然在運作。

linux早期曾經用軟體實現過關所有cpu的中斷。後來發現這個很慢,就廢棄了。多核同步改用鎖來實現。

所有鎖的實現基礎都是spinlock。需要硬體提供支援,比如使用x86的xchg指令。

(待續)

程序的那些事兒

先來先服務 fcfs,first come first served 最短作業優先 sjf,shortest job first 最高響應比優先法 hrrn,highest response ratio next 最高響應比優先法 hrrn,highest response ratio next 是...

object的那些事兒

昨天和大姐qq。說給我看了,今年找到物件。我就在那裡騙他們。說我找了乙個 人。明年去 以後就沒有多少機會見到他們了。呵呵,大姐就說這樣我不聽話,那樣不聽話,不讓我去,說還借我錢買房子,不能去,去了父母白養這麼大了,我總是騙他們,逗他們。以前還騙他們說我出家。有一段時間,工作不順心,我壓力挺大的。不知...

和 的那些事兒

和 都可以用作邏輯與的運算子,表示邏輯與 and 當運算子兩邊的表示式的結果都為true時,整個運算結果才為true,否則,只要有一方為false,則結果為false。還具有短路的功能,即如果第乙個表示式為false,則不再計算第二個表示式,例如,對於if str null str.equals 表...