1、基礎知識
使用者態和核心態
一般現代cpu都有幾種不同的指令執行級別,linux總共劃分為4個指令執行級別:核心執行在0級別上,1,2級別預設不執行,使用者程式執行在3級別上。
在核心指令執行級別上,**可以執行特權指令,訪問任意的實體地址。
在使用者指令執行級別上,**的掌控範圍會受到限制。只能在對應級別允許的範圍內活動。
cs暫存器的最低兩位表明了當前**的特權級:cpu每條指令的讀取都是通過cs:eip這兩個暫存器:其中cs是**段選擇暫存器,eip是偏移量暫存器。
上述判斷由硬體完成。
2、int $80彙編指令
i386cpu將使用者空間程式限制在0-3g空間,將核心程式限制在3g~4g空間,這樣就實現了使用者空間和核心空間的隔離;
程式的執行過程需要訪問特定的系統程式以完成相應的功能。而使用者程式執行在使用者態,不能夠訪問特定狀態下的系統程式。而使用者程式又需要執行系統程式,這就促使int $80的產生:
應用程式通過int 0x80(軟中斷)指令實現使用者空間與核心空間的互動。cpu會把軟中斷做為陷阱來處理,所以軟中斷也稱為程式設計異常,其中int 0x80可以用於執行系統呼叫。
3、int $80的執行功能
int $80主要實現對暫存器的壓棧:
儲存:ss:esp,cs:eip,eflag中的內容到程序對應的核心堆疊;
修改:ss:esp內容改為system_call對應的的核心堆疊的基位址,cs:eip:內容改為system_call的第一條指令的位址,eflag內容修改為新的標誌。
總而言之,int $0x80的就是在系統呼叫產生時,完成使用者態到核心態的切換。由於使用者程序在使用者態執行和核心態需要對應不用的核心堆疊,所以再進行系統呼叫時,需要儲存使用者態最後的esp,eip等狀態資訊,以便於系統呼叫結束能夠返回到發生系統呼叫的位址繼續使用者程式的執行,這就是int $0x80完成的對暫存器內容的儲存。
Linux通過0x80進行系統呼叫
系統呼叫 作業系統分為使用者態和核心態,當使用者呼叫使用者態函式的時候,需要進行使用者態到核心態的切換,cpu 需要對現場進行儲存。如果使用者直接呼叫系統呼叫,就不需要進行二態切換,提高 執行效率。並且編譯鏈結後生成的可執行的elf 體積小,執行效率高。使用者可以通過系統提供的c 語言api 進行系...
80x86組合語言 INT 10H 的應用
做而論道以前寫了幾次直接寫屏的程式,比如下面列出的一些。直接寫屏 用寫顯示緩衝區的方法,顯示彩色文字 要過年了,送個福字 直接寫屏的優點是速度快,但是其功能的花樣,遠遠不如 int 10h 那麼多。int 10h 是 bois 中斷,主機板廠家將其燒寫在主機板上的 rom 中。int 10h 的功能...
基於int的Linux的經典系統呼叫實現
先說明兩個概念 中斷和系統呼叫 一 系統呼叫 是應用程式 執行庫也是應用程式的一部分 與作業系統核心之間的介面,它決定了應用程式是如何和核心打交道的。1,linux系統呼叫 2.6.19版核心提供了319個系統呼叫。比如 exit fork read open close 2,對windows來說,...