使用者態切換到核心態(May 22)

2021-06-22 04:03:22 字數 1729 閱讀 8498

一般來講,從使用者態切換到核心態主要通過以下方式:

1. 系統呼叫(windows:int 0x2e, linux: int $0x80)

2. 中斷

3. 異常

4. **裡直接int 0x3(除錯斷點)

5. 彙編指令 sysenter/sy***it

1. 系統呼叫:

windows:

ntstatus stdcall ntreadfile(..........)--9個引數

__declspec(naked) __stdcall ntreadfile(int dummy0, int dummy1, int dummy2)

__asm{

move ebp, esp //ebp =esp, esp+4指向返回值位址, esp+8指向引數塊的起始位址

move eax, 152 //系統呼叫號是152

lea edx,8[ebp] //ebp+4 是返回值的位址,ebp+8是引數塊的起始位址,因為stacall是表示從右向左通過堆疊傳遞引數,所以ebp+8是第乙個引數, ebp+12是第二個引數...

int 0x2e //進入核心

pop ebp //ebp出棧

ret 9

×××__stacall是表示引數從右向左壓入堆疊, 同時函式本身清理堆疊;函式名自動加前導的下劃線,後面緊跟乙個@符號,其後緊跟著引數的尺寸

×××__cdecl是表示引數從右向左壓入堆疊, 同時函式本身不清理堆疊,呼叫者清理堆疊

***__fastcall約定將函式的從左邊開始的兩個4個位元組(dword)的引數分別放在ecx和edx暫存器,其餘的引數仍舊自右向左壓棧傳送,被呼叫的函式在返回前清理傳送引數的堆疊

linux:

int sethostname(cost char *name, size_t len);  //2個引數

36 sethostname.o: file format elf32i386

3738 disassembly of section .text:

3940 00000000 : //esp指向函式返回位址, esp+4指向第乙個函式引數(name)的位址, esp+8指向第二個函式引數(len)的位址

41 0: 89 da mov %ebx,%edx             //將ebx的內容移到edx中

42 2: 8b 4c 24 08 mov 0x8(%esp,1),%ecx  //將第二個函式引數的位址賦給ecx暫存器

43 6: 8b 5c 24 04 mov 0x4(%esp,1),%ebx //將第二個函式引數的位址賦給ebx暫存器

44 a: b8 4a 00 00 00 mov $0x4a,%eax       //0x4a是sethostname的系統呼叫號, 將它存入eax暫存器

45 f: cd 80 int $0x80                    //中斷指令, 進入核心執行系統呼叫

46 11: 89 d3 mov %edx,%ebx   //恢復edx的內容

47 13: 3d 01 f0 ff ff cmp $0xfffff001,%eax //eax中儲存系統呼叫的返回值, 如果eax的內容實在0xfffff001-0xffffffff(-1~ -4095)之間則出錯

48 18: 0f 83 fc ff ff ff jae 1a //轉向__syscall_error

49 1e: c3 ret

*** linux核心在系統呼叫時是通過暫存器而不是堆疊傳遞引數的

從使用者態切換到核心態

在linux系統中,每個系統呼叫被賦予乙個系統呼叫號。這樣通過這個系統呼叫號就可以關聯系統呼叫。當使用者空間執行的程序執行乙個系統呼叫的時候,這個系統呼叫號就告訴核心需要呼叫哪個。核心記錄了系統調表中所有已註冊過的系統呼叫的列表,這個表為每乙個有效的系統呼叫指定了唯一的系統呼叫號。使用者空間程式無法...

使用者態切換到核心態 補充

剛剛看了別的博文,才知道不是只有系統呼叫才切換到核心態,還有別的操作可以切換到核心 這是使用者態程序主動要求切換到核心的一種方式,使用者態程序通過系統呼叫申請使用作業系統提供的的服務完成工程的過程,比如fork 實際上就是執行了乙個建立新程序的系統呼叫。而系統呼叫的機制其核心還是使用了作業系統為使用...

init程序如何從核心態切換到使用者態

大家都知道如何產生乙個新的程序。通過sys fork,之後再呼叫 sys execve 系統初啟後 核心態 的第乙個使用者態程序是init。這要涉及到內層 特權級高 向外層 特權級低 轉移的問題。通常情況下,核心是不會呼叫使用者層的 要想實現這逆向的轉移,一般做法是在使用者程序的核心棧 tss es...