進入保護模式(十七)簡單的系統函數調用

維基百科

1、系統函數和普通函數

      他們倆之間的區別是什麼? linux

      舉個例子 進入編程的第一個demo是hello world! 編程

                                             咱們看到的:咱們調用了一個輸出函數實現的 函數

                                          咱們沒看到的:若是函數的操做涉及到了權限在內核態的要求時,就要涉及系統 spa

      程序是運行在用戶態的,可是有些是用戶態權限沒法操做的例如端口讀寫 rest

                                                                                     特權指令 code

2、簡單的實現

      個人輸出函數是經過端口的讀寫操做實現的,這樣我用戶態的函數不能調用個人輸出函數進行顯示了。權限不夠。 進程

      我應該實現一個系統函數提供給個人用戶態程序使用。 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);
 }



     2.這個中斷的實現

        這裏可能有幾個地方疑惑,看於淵書上的時候

       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]	 
;==========================================================



     3.簡陋的系統表

#define _NR_PUT_STRING  0   //輸出函數
#define _NR_EXIT        1   //程序終止

void sys_put_string();//系統輸出函數別的地方不用

unsigned int sys_call_table[]={
                         (unsigned int)sys_put_string//函數輸出
                        };



      4.真正的實現

         由於我以前實現過輸出的函數這裏也懶得改了直接用了,因此又多了一層

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



  3、最後       

            總體的大流程
            1.對中斷說我要找誰誰誰
            2.中斷保存環境
            3.尋找誰誰誰
            4.根據剛保存的環境當作任務切換回去了

相關文章
相關標籤/搜索