Linux通過0x80進行系統呼叫

2021-04-20 01:40:10 字數 1622 閱讀 8668

系統呼叫:作業系統分為使用者態和核心態,當使用者呼叫使用者態函式的時候,需要進行使用者態到核心態的切換,cpu

需要對現場進行儲存。如果使用者直接呼叫系統呼叫,就不需要進行二態切換,提高**執行效率。並且編譯鏈結後生成的可執行的elf

體積小,執行效率高。使用者可以通過系統提供的c

語言api

進行系統呼叫,同時也可以通過0x80

中斷進行呼叫。下面介紹通過中斷進行呼叫的方法。

引數傳遞:功能號和返回值通過%eax

來傳遞,引數一般在5

個以下的通過暫存器%ebx,%ecx.%edx,%esi,%edi

來傳遞,如果引數個數大於5

個,則要通過堆疊來傳遞,按照c

語言的引數傳遞方式,最後乙個引數最先進棧。同時,把%esp

傳遞給%ebx

。linux

系統呼叫個數:319

個。例子:

.data

filename:.fill 256

filecontent:.string "hello world!"

len:.int 12

fd:.int -1

.text

.global _start

_start:

movl $3 , %eax #

系統呼叫read

,從標準輸入讀入檔名

movl $0 , %ebx

movl $filename , %ecx

movl $1024 , %edx

int $0x80

movl $filename , %ebx #

將檔名儲存

movl %eax , %ecx

xorb %al , %al

movl $filename , %ebx

movb %al , -1(%ebx , %ecx)

movl $5 , %eax #

呼叫系統呼叫open

建立檔案

movl $filename , %ebx

xorl %ecx , %ecx

orl $20 , %ecx

orl $100 , %ecx

orl $10 , %ecx

movl $0x0080, %edx

int $0x80

movl $fd , %ebx #

將檔案描述符儲存

movl %eax , (%ebx)            

movl $4 , %eax #

呼叫系統呼叫write

,向檔案中寫字串

movl $fd , %ebx

movl (%ebx) , %ebx

movl $filecontent , %ecx

movl $len , %edx

movl (%edx) , %edx

int $0x80

movl $6, %eax #

呼叫系統呼叫close

,關閉檔案

movl $fd , %ebx

movl (%ebx) , %ebx

int $0x80        

movl $1 , %eax

movl $0 , %ebx

int $0x80

int 0x80系統呼叫的idea

1 基礎知識 使用者態和核心態 一般現代cpu都有幾種不同的指令執行級別,linux總共劃分為4個指令執行級別 核心執行在0級別上,1,2級別預設不執行,使用者程式執行在3級別上。在核心指令執行級別上,可以執行特權指令,訪問任意的實體地址。在使用者指令執行級別上,的掌控範圍會受到限制。只能在對應級別...

Linux下接收串列埠資料0x0d變0X0a問題

許多流行的linux串列埠程式設計的版本中都沒對c iflag termios成員變數 這個變數進行有效的設定,這樣傳送ascii碼時沒什麼問題,但傳送二進位制資料時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字元,被用作特殊控制了。關掉icrnl和ixon選項即可解決...

演算法競賽高階指南 0x11 (棧)火車進棧

兩個操作圖中1操作是火車進棧,2是火車出棧,因為要按照字典序輸出,應該先執行操作2,執行操作1來保證字典序正確 直接用dfs來暴力模擬過程,即可輸出答案 include using namespace std int n,cnt 20 vector int state1 stack int stat...