他們倆之間的區別是什麼? linux
舉個例子 進入編程的第一個demo是hello world! 編程
咱們看到的:咱們調用了一個輸出函數實現的 函數
咱們沒看到的:若是函數的操做涉及到了權限在內核態的要求時,就要涉及系統 spa
程序是運行在用戶態的,可是有些是用戶態權限沒法操做的例如端口讀寫 rest
特權指令 code
個人輸出函數是經過端口的讀寫操做實現的,這樣我用戶態的函數不能調用個人輸出函數進行顯示了。權限不夠。 進程
我應該實現一個系統函數提供給個人用戶態程序使用。 ip
參考上面連接的典型實現過程。 內存
這裏複習下爲何可以經過中斷實現這一個偉大的任務,由於中斷,門一類的,有這個神奇的做用對權限的跨越,例如最近了解的linux的su命令。 字符串
1.安裝了0x80號中斷來進行系統函數服務
/** *安裝實例化0x80號服務 *用戶態的級別 */ void init_sys_call(){ put_str("Sys call interrupt init is start!\r\n"); make_idt_description((unsigned int)system_interrupt,(unsigned int)0x0028,(unsigned int)0xEE00,(unsigned int)0x80); }
這裏可能有幾個地方疑惑,看於淵書上的時候
1.save的地方直接放內存,由於前面是call調用因此放了一個地址進去了
2.總段竟然用ret,你會發如今save的時候他保存了返回進程的地址,因此又算是切換原進程
;========================================================== system_interrupt: cli call save call [sys_call_table+eax*4] sti ret ;========================================================== ;寄存器信息保存 ;由於是調用的因此有個如入棧了,這裏只有系統函數使用才調用 save: pushad push ds push es push fs push gs ;堆棧用內核的堆棧 mov esi,esp mov esp,StackTop ;這裏程序的基本用內核級別的了 ;放一個進程的入口地址 push restart ;跳轉回剛進來的位置 jmp [esi+12*4] ;==========================================================
#define _NR_PUT_STRING 0 //輸出函數 #define _NR_EXIT 1 //程序終止 void sys_put_string();//系統輸出函數別的地方不用 unsigned int sys_call_table[]={ (unsigned int)sys_put_string//函數輸出 };
由於我以前實現過輸出的函數這裏也懶得改了直接用了,因此又多了一層
extern put_string [bits 32] global sys_put_str global sys_put_string ;======================================================================== sys_put_string: ;顯示0終止的字符串並移動光標 push ebx call put_string add esp,4 ret ;段間返回 ;--------------------------------------------------------------- ;系統輸出函數使用 sys_put_str: mov eax,0x00 mov ebx,[esp+4] int 0x80 ret
總體的大流程
1.對中斷說我要找誰誰誰
2.中斷保存環境
3.尋找誰誰誰
4.根據剛保存的環境當作任務切換回去了