系統呼叫:作業系統分為使用者態和核心態,當使用者呼叫使用者態函式的時候,需要進行使用者態到核心態的切換,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...