求Linux核心中斷INT 80H詳細

時間 2022-06-24 13:25:02

1樓:weida愛問

int 80中斷是linux系統提供的軟終端呼叫號....

在unix/linux系統中,什麼是使用者態,什麼是核心態

2樓:匿名使用者

究竟什麼是使用者態,什麼是核心態,這兩個基本概念以前一直理解得不是很清楚,根本原因個人覺得是在於因為大部分時候我們在寫程式時關注的重點和著眼的角度放在了實現的功能和**的邏輯性上,先看一個例子:

1)例子

c**1. void testfork()

5. printf(「testfork ok\n」);

6. }

這段**很簡單,從功能的角度來看,就是實際執行了一個fork(),生成一個新的程序,從邏輯的角度看,就是判斷了如果fork()返回的是則列印相關語句,然後函式最後再列印一句表示執行完整個testfork()函式。**的執行邏輯和功能上看就是如此簡單,一共四行**,從上到下一句一句執行而已,完全看不出來**有體現出使用者態和程序態的概念。

如果說前面兩種是靜態觀察的角度看的話,我們還可以從動態的角度來看這段**,即它被轉換成cpu執行的指令後載入執行的過程,這時這段程式就是一個動態執行的指令序列。而究竟載入了哪些**,如何載入就是和作業系統密切相關了。

2)特權級

熟悉unix/linux系統的人都知道,fork的工作實際上是以系統呼叫的方式完成相應功能的,具體的工作是由sys_fork負責實施。其實無論是不是unix或者linux,對於任何作業系統來說,建立一個新的程序都是屬於核心功能,因為它要做很多底層細緻地工作,消耗系統的物理資源,比如分配實體記憶體,從父程序拷貝相關資訊,拷貝設定頁目錄頁表等等,這些顯然不能隨便讓哪個程式就能去做,於是就自然引出特權級別的概念,顯然,最關鍵性的權力必須由高特權級的程式來執行,這樣才可以做到集中管理,減少有限資源的訪問和使用衝突。

特權級顯然是非常有效的管理和控制程式執行的手段,因此在硬體上對特權級做了很多支援,就intel x86架構的cpu來說一共有0~3四個特權級,0級最高,3級最低,硬體上在執行每條指令時都會對指令所具有的特權級做相應的檢查,相關的概念有 cpl、dpl和rpl,這裡不再過多闡述。硬體已經提供了一套特權級使用的相關機制,軟體自然就是好好利用的問題,這屬於作業系統要做的事情,對於 unix/linux來說,只使用了0級特權級和3級特權級。也就是說在unix/linux系統中,一條工作在級特權級的指令具有了cpu能提供的最高權力,而一條工作在3級特權級的指令具有cpu提供的最低或者說最基本權力。

3)使用者態和核心態

現在我們從特權級的排程來理解使用者態和核心態就比較好理解了,當程式執行在3級特權級上時,就可以稱之為執行在使用者態,因為這是最低特權級,是普通的使用者程序執行的特權級,大部分使用者直接面對的程式都是執行在使用者態;反之,當程式執行在級特權級上時,就可以稱之為執行在核心態。

雖然使用者態下和核心態下工作的程式有很多差別,但最重要的差別就在於特權級的不同,即權力的不同。執行在使用者態下的程式不能直接訪問作業系統核心資料結構和程式,比如上面例子中的testfork()就不能直接呼叫 sys_fork(),因為前者是工作在使用者態,屬於使用者態程式,而sys_fork()是工作在核心態,屬於核心態程式。

當我們在系統中執行一個程式時,大部分時間是執行在使用者態下的,在其需要作業系統幫助完成某些它沒有權力和能力完成的工作時就會切換到核心態,比如testfork()最初執行在使用者態程序下,當它呼叫fork()最終觸發 sys_fork()的執行時,就切換到了核心態。

2. 使用者態和核心態的轉換

1)使用者態切換到核心態的3種方式

a. 系統呼叫

這是使用者態程序主動要求切換到核心態的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的服務程式完成工作,比如前例中fork()實際上就是執行了一個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用者特別開放的一箇中斷來實現,例如linux的int 80h中斷。

b. 異常

當cpu在執行執行在使用者態下的程式時,發生了某些事先不可知的異常,這時會觸發由當前執行程序切換到處理此異常的核心相關程式中,也就轉到了核心態,比如缺頁異常。

c. 外圍裝置的中斷

當外圍裝置完成使用者請求的操作後,會向cpu發出相應的中斷訊號,這時cpu會暫停執行下一條即將要執行的指令轉而去執行與中斷訊號對應的處理程式,如果先前執行的指令是使用者態下的程式,那麼這個轉換的過程自然也就發生了由使用者態到核心態的切換。比如硬碟讀寫操作完成,系統會切換到硬碟讀寫的中斷處理程式中執行後續操作等。

這3種方式是系統在執行時由使用者態轉到核心態的最主要方式,其中系統呼叫可以認為是使用者程序主動發起的,異常和外圍裝置中斷則是被動的。

2)具體的切換操作

從觸發方式上看,可以認為存在前述3種不同的型別,但是從最終實際完成由使用者態到核心態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了一箇中斷響應的過程,因為系統呼叫實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關於它們的具體區別這裡不再贅述。關於中斷處理機制的細節和步驟這裡也不做過多分析,涉及到由使用者態切換到核心態的步驟主要包括:

[1] 從當前程序的描述符中提取其核心棧的ss0及esp0資訊。

[2] 使用ss0和esp0指向的核心棧將當前程序的cs,eip,eflags,ss,esp資訊儲存起來,這個

過程也完成了由使用者棧到核心棧的切換過程,同時儲存了被暫停執行的程式的下一

條指令。

[3] 將先前由中斷向量檢索得到的中斷處理程式的cs,eip資訊裝入相應的暫存器,開始

執行中斷處理程式,這時就轉到了核心態的程式執行了。

int $0x80是什麼意思(組合語言)

3樓:匿名使用者

int $0x80是一條at&t語法的中斷指令,用於linux的系統呼叫。

linux系統下的組合語言比較喜歡用at&t的語法,如果翻譯成intel的語法那就是:int 80h

就像我們在intel的語法下的dos彙編中經常用int 21h呼叫dos中斷,同樣如果,換成at&t的語法就是int $0x80。

不過無論那一種語法,int $0x80或者int 80h都是針對linux的,在dos或者windows下都是起不到相應功能的。同理 int 21h或int $0x21也是都只能在dos或者一些windows下起作用,無法在linux下起作用的。

4樓:

執行80中斷。linux使用0x80號中斷。

什麼是中斷系統呼叫?

5樓:匿名使用者

中斷、異常和系統呼叫

所謂中斷是指cpu對系統發生的某個事件做出的一種反應,cpu暫停正在執行的程式,保留現場後自動地轉去執行相應的處理程式,處理完該事件後再返回斷點繼續執行被「打斷」的程式。

中斷可分為三類,第一類是由cpu外部引起的,稱作中斷,如i/o中斷、時鐘中斷、控制檯中斷等。第二類是來自cpu的內部事件或程式執行中的事件引起的過程,稱作異常,如由於cpu本身故障(電源電壓低於105v或頻率在47~63hz之外)、程式故障(非法操作碼、地址越界、浮點溢位等)等引起的過程。

第三類由於在程式中使用了請求系統服務的系統呼叫而引發的過程,稱作「陷入」(trap,或者陷阱)。前兩類通常都稱作中斷,它們的產生往往是無意、被動的,而陷入是有意和主動的。

1.中斷處理

中斷處理一般分為中斷響應和中斷處理兩個步驟。中斷響應由硬體實施,中斷處理主要由軟體實施。

(1)中斷響應

對中斷請求的整個處理過程是由硬體和軟體結合起來而形成的一套中斷機構實施的。發生中斷時,cpu暫停執行當前的程式,而轉去處理中斷。這個由硬體對中斷請求作出反應的過程,稱為中斷響應。

一般說來,中斷響應順序執行下述三步動作:

◆中止當前程式的執行;

◆儲存原程式的斷點資訊(主要是程式計數器pc和程式狀態暫存器ps的內容);

◆從中斷控制器取出中斷向量,轉到相應的處理程式。

通常cpu在執行完一條指令後,立即檢查有無中斷請求,如果有,則立即做出響應。

當發生中斷時,系統作出響應,不管它們是來自硬體(如來自時鐘或者外部裝置)、程式性中斷(執行指令導致「軟體中斷」—software interrupts),或者來自意外事件(如訪問頁面不在記憶體)。

如果當前cpu的執行優先順序低於中斷的優先順序,那麼它就中止對當前程式下條指令的執行,接受該中斷,並提升處理機的執行級別(一般與中斷優先順序相同),以便在cpu處理當前中斷時,能遮蔽其它同級的或低階的中斷,然後儲存斷點現場資訊,通過取得的中斷向量轉到相應的中斷處理程式的入口。

(2)中斷處理

cpu從中斷控制器取得中斷向量,然後根據具體的中斷向量從中斷向量表idt中找到相應的表項,該表項應是一箇中斷門。於是,cpu就根據中斷門的設定而到達了該通道的總服務程式的入口。

核心對中斷處理的順序主要由以下動作完成:

◆儲存正在執行程序的各暫存器的內容,把它們放入核心棧的新幀面中。

◆確定「中斷源」或核查中斷髮生,識別中斷的型別(如時鐘中斷或盤中斷)和中斷的裝置號(如哪個磁碟引起的中斷)。系統接到中斷後,就從機器那裡得到一箇中斷號,它是檢索中斷向量表的位移。中斷向量因機器而異,但通常都包括相應中斷處理程式入口地址和中斷處理時處理機的狀態字。

◆核心呼叫中斷處理程式,對中斷進行處理。

◆中斷處理完成並返回。中斷處理程式執行完以後,核心便執行與機器相關的特定指令序列,恢復中斷時暫存器內容和執行核心棧退棧,程序回到使用者態。如果設定了重排程標誌,則在本程序返回到使用者態時做程序排程。

2.系統呼叫

在unix/linux系統中,系統呼叫像普通c函式呼叫那樣出現在c程式中。但是一般的函式呼叫序列並不能把程序的狀態從使用者態變為核心態,而系統呼叫卻可以做到。

c語言編譯程式利用一個預先確定的函式庫(一般稱為c庫),其中有各系統呼叫的名字。c庫中的函式都專門使用一條指令,把程序的執行狀態改為核心態。linux的系統呼叫是通過中斷指令「int 0x80」實現的。

每個系統呼叫都有惟一的號碼,稱作系統呼叫號。所有的系統呼叫都集中在系統呼叫入口表中統一管理。

系統呼叫入口表是一個函式指標陣列,以系統呼叫號為下標在該陣列中找到相應的函式指標,進而就能確定使用者使用的是哪一個系統呼叫。不同系統中系統呼叫的個數是不同的,目前linux系統中共定義了221個系統呼叫。

另外,系統呼叫表中還留有一些餘項,可供使用者自行新增。

當cpu執行到中斷指令「int 0x80」時,硬體就做出一系列響應,其動作與上述的中斷響應相同。cpu穿過陷阱門,從使用者空間進入系統空間。相應地,程序的上下文從使用者堆疊切換到系統堆疊。

接著執行核心函式system_call()。首先,進一步儲存各暫存器的內容;接著呼叫syscall_trace( ),以系統呼叫號為下標檢索系統呼叫入口表sys_call_table,從中找到相應的函式;然後轉去執行該函式,完成具體的服務。

執行完服務程式,核心檢查是否發生錯誤,並作相應處理。如果本程序收到訊號,則對訊號作相應處理。最後程序從系統空間返回到使用者空間。

上面兩講簡要介紹了linux核心的主要資料結構和相應的演算法。linux核心包含了豐富的內容,這裡僅是其中的一點點,以求起到「拋磚引玉」的作用。

訊號的中斷與系統呼叫的重起

#include int sigaction(ints signo, const struct sigaction *act, struct sigaction *oact) ;struct sigaction ; 當更改訊號動作時,如果sa _handler指向一個訊號捕捉函式(不是常數sig_ign或sig_dfl),則sa_mask欄位說明了一個訊號集,在呼叫訊號捕捉函式之前,該訊號集要加到程序的訊號遮蔽字中。僅當從訊號捕捉函式返回時再將程序的訊號遮蔽字恢復為原先值。這樣,在呼叫訊號處理程式時就能阻塞某些訊號。

在訊號處理程式被呼叫時,系統建立的新訊號遮蔽字會自動包括正被遞送的訊號。因此保證了在處理一個給定的訊號時,如果這種訊號再次發生,那麼它會被阻塞到對前一個訊號的處理結束為止。a.

可自動重起的signal()的實現< 0) return (sig_err); return (oact.sa_handler);}注:

在if語句中,我們檢查是否為sigalrm訊號,如果是,且系統定義了 sa_interrupt(sunos),即為sunos,該系統預設的系統呼叫是自 動重起的,我們阻止該訊號中斷的系統呼叫重起,因為我們要用該訊號 中斷i/o操作,實現定時的功能. 接著的else語句中的訊號為sigalrm之外的其他訊號,且系統定義了 sa_restart,即為svr4或4.3+bsd類系統,該類系統中預設的系統 呼叫是不可重起的,所以應該加上sa_restart標誌,使由這些訊號中 斷的系統呼叫自動重起.

b. 不可重起的signal_intr()實現: sigfunc *signal_intr(int signo, sigfunc *func)

注: 只有sunos為自動重起的,其他為不自動重起的,所以只要將sunos標 志為非自動重起即可.如上.

linux核心和作業系統問題,Linux核心和作業系統問題

從本質上來說作業系統應該就是指核心,因為作業系統的主要任務就是隱藏處理硬體的細節,而這均是由核心去實現的。那為啥說不是完整的呢?核心加上什麼才是完整的呢?這個要先從計算機結構分析自底向上依次是 硬體 驅動程式 核心 使用者介面程式 應用程式。主要是介面程式,它是啥?為什麼需要?如果讓使用者直接和作業...

linux核心有沒有hook機制

有啊,一切順序邏輯,都有被hook的可能。下面是一個linux上的hook的例項 截獲write系統呼叫 ifndef module define module endif ifndef kernel define kernel endif include include include inclu...

求教怎麼學習linux核心驅動,求教 linux下哪個檔案是核心配置方案 在哪裡

1.首先要了解為什麼要學習核心?下圖已表明,如果要從事驅動開發或系統研究,就要學習核心。2.核心的知識就像下面的繩結一樣,一環扣一環,我們要解開它們,就必須要先找到線頭也就是核心中的函式介面。初學階段,我們一般不深入的研究核心 會使用核心的介面函式就不錯了。3.下面提供瞭如何學習這些核心函式的方法,...