<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是系統調用?為什么要用系統調用?

m3eY_edn_china ? 來源:未知 ? 作者:李倩 ? 2018-06-01 08:44 ? 次閱讀

什么是系統調用?

Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中調用它們。從某種角度來看,系統調用和普通的函數調用非常相似。區別僅僅在于,系統調用由操作系統核心提供,運行于核心態;而普通的函數調用由函數庫或用戶自己提供,運行于用戶態。

隨Linux核心還提供了一些C語言函數庫,這些庫對系統調用進行了一些包裝和擴展,因為這些庫函數與系統調用的關系非常緊密,所以習慣上把這些函數也稱為系統調用。

為什么要用系統調用?

實際上,很多已經被我們習以為常的C語言標準函數,在Linux平臺上的實現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各種系統調用是初步的要求。進一步,若想成為一名Linux下編程高手,也就是我們常說的Hacker,其標志之一也是能對各種系統調用有透徹的了解。

即使除去上面的原因,在平常的編程中你也會發現,在很多情況下,系統調用是實現你的想法的簡潔有效的途徑,所以有可能的話應該盡量多掌握一些系統調用,這會對你的程序設計過程帶來意想不到的幫助。

系統調用是怎么工作的?

一般的,進程是不能訪問內核的。它不能訪問內核所占內存空間也不能調用內核函數。CPU硬件決定了這些(這就是為什么它被稱作"保護模式")。系統調用是這些規則的一個例外。其原理是進程先用適當的值填充寄存器,然后調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置(當然,這個位置是用戶進程可讀但是不可寫的)。在Intel CPU中,這個由中斷0x80實現。硬件知道一旦你跳到這個位置,你就不是在限制模式下運行的用戶,而是作為操作系統的內核--所以你就可以為所欲為。

進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接著,就調用函數,等返回后,做一些系統檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。

具體過程如下圖所示:

如何使用系統調用?

先來看一個例子:

這是因為在time.h中實際上已經用庫函數的形式實現了time這個系統調用,替我們省掉了調用_syscall1宏展開得到函數原型這一步。

大多數系統調用都在各種C語言函數庫中有所實現,所以在一般情況下,我們都可以像調用普通的庫函數那樣調用系統調用,只在極個別的情況下,我們才有機會用到_syscall*()這幾個宏。

調用性能問題

系統調用需要從用戶空間陷入內核空間,處理完后,又需要返回用戶空間。其中除了系統調用服務例程的實際耗時外,陷入/返回過程和系統調用處理程序(查系統調用表、存儲\恢復用戶現場)也需要花銷一些時間,這些時間加起來就是一個系統調用的響應速度。系統調用不比別的用戶程序,它對性能要求很苛刻,因為它需要陷入內核執行,所以和其他內核程序一樣要求代碼簡潔、執行迅速。幸好Linux具有令人難以置信的上下文切換速度,使得其進出內核都被優化得簡潔高效;同時所有Linux系統調用處理程序和每個系統調用本身也都非常簡潔。

絕大多數情況下,Linux系統調用性能是可以接受的,但是對于一些對性能要求非常高的應用來說,它們雖然希望利用系統調用的服務,但卻希望加快相應速度,避免陷入/返回和系統調用處理程序帶來的花銷,因此采用由內核直接調用系統調用服務例程,最好的例子就HTTPD——它為了避免上述開銷,從內核調用socket等系統調用服務例程。

Linux系統調用列表

· 進程控制

fork 創建一個新進程

clone 按指定條件創建子進程

execve 運行可執行文件

exit 中止進程

_exit 立即中止當前進程

getdtablesize 進程所能打開的最大文件數

getpgid 獲取指定進程組標識號

setpgid 設置指定進程組標志號

getpgrp 獲取當前進程組標識號

setpgrp 設置當前進程組標志號

getpid 獲取進程標識號

getppid 獲取父進程標識號

getpriority 獲取調度優先級

setpriority 設置調度優先級

modify_ldt 讀寫進程的本地描述表

nanosleep 使進程睡眠指定的時間

nice 改變分時進程的優先級

pause 掛起進程,等待信號

personality 設置進程運行域

prctl 對進程進行特定操作

ptrace 進程跟蹤

sched_get_priority_max 取得靜態優先級的上限

sched_get_priority_min 取得靜態優先級的下限

sched_getparam 取得進程的調度參數

sched_getscheduler 取得指定進程的調度策略

sched_rr_get_interval 取得按RR算法調度的實時進程的時間片長度

sched_setparam 設置進程的調度參數

sched_setscheduler 設置指定進程的調度策略和參數

sched_yield 進程主動讓出處理器,并將自己等候調度隊列隊尾

vfork 創建一個子進程,以供執行新程序,常與execve等同時使用

wait 等待子進程終止

wait3 參見wait

waitpid 等待指定子進程終止

wait4 參見waitpid

capget 獲取進程權限

capset 設置進程權限

getsid 獲取會晤標識號

setsid 設置會晤標識號

· 文件系統控制

1.文件讀寫操作

fcntl 文件控制

open 打開文件

creat 創建新文件

close 關閉文件描述字

read 讀文件

write 寫文件

readv 從文件讀入數據到緩沖數組中

writev 將緩沖數組里的數據寫入文件

pread 對文件隨機讀

pwrite 對文件隨機寫

lseek 移動文件指針

_llseek 在64位地址空間里移動文件指針

dup 復制已打開的文件描述字

dup2 按指定條件復制文件描述字

flock 文件加/解鎖

poll I/O多路轉換

truncate 截斷文件

ftruncate 參見truncate

umask 設置文件權限掩碼

fsync 把文件在內存中的部分寫回磁盤

2.文件系統操作

access 確定文件的可存取性

chdir 改變當前工作目錄

fchdir 參見chdir

chmod 改變文件方式

fchmod 參見chmod

chown 改變文件的屬主或用戶組

fchown 參見chown

lchown 參見chown

chroot 改變根目錄

stat 取文件狀態信息

lstat 參見stat

fstat 參見stat

statfs 取文件系統信息

fstatfs 參見statfs

readdir 讀取目錄項

getdents 讀取目錄項

mkdir 創建目錄

mknod 創建索引節點

rmdir 刪除目錄

rename 文件改名

link 創建鏈接

symlink 創建符號鏈接

unlink 刪除鏈接

readlink 讀符號鏈接的值

mount 安裝文件系統

umount 卸下文件系統

ustat 取文件系統信息

utime 改變文件的訪問修改時間

utimes 參見utime

quotactl 控制磁盤配額

· 系統控制

ioctl I/O總控制函數

_sysctl 讀/寫系統參數

acct 啟用或禁止進程記賬

getrlimit 獲取系統資源上限

setrlimit 設置系統資源上限

getrusage 獲取系統資源使用情況

uselib 選擇要使用的二進制函數庫

ioperm 設置端口I/O權限

iopl 改變進程I/O權限級別

outb 低級端口操作

reboot 重新啟動

swapon 打開交換文件和設備

swapoff 關閉交換文件和設備

bdflush 控制bdflush守護進程

sysfs 取核心支持的文件系統類型

sysinfo 取得系統信息

adjtimex 調整系統時鐘

alarm 設置進程的鬧鐘

getitimer 獲取計時器值

setitimer 設置計時器值

gettimeofday 取時間和時區

settimeofday 設置時間和時區

stime 設置系統日期和時間

time 取得系統時間

times 取進程運行時間

uname 獲取當前UNIX系統的名稱、版本和主機等信息

vhangup 掛起當前終端

nfsservctl 對NFS守護進程進行控制

vm86 進入模擬8086模式

create_module 創建可裝載的模塊項

delete_module 刪除可裝載的模塊項

init_module 初始化模塊

query_module 查詢模塊信息

*get_kernel_syms 取得核心符號,已被query_module代替

· 內存管理

brk 改變數據段空間的分配

sbrk 參見brk

mlock 內存頁面加鎖

munlock 內存頁面解鎖

mlockall 調用進程所有內存頁面加鎖

munlockall 調用進程所有內存頁面解鎖

mmap 映射虛擬內存頁

munmap 去除內存頁映射

mremap 重新映射虛擬內存地址

msync 將映射內存中的數據寫回磁盤

mprotect 設置內存映像保護

getpagesize 獲取頁面大小

sync 將內存緩沖區數據寫回硬盤

cacheflush 將指定緩沖區中的內容寫回磁盤

· 網絡管理

getdomainname 取域名

setdomainname 設置域名

gethostid 獲取主機標識號

sethostid 設置主機標識號

gethostname 獲取本主機名稱

sethostname 設置主機名稱

· socket控制

socketcall socket系統調用

socket 建立socket

bind 綁定socket到端口

connect 連接遠程主機

accept 響應socket連接請求

send 通過socket發送信息

sendto 發送UDP信息

sendmsg 參見send

recv 通過socket接收信息

recvfrom 接收UDP信息

recvmsg 參見recv

listen 監聽socket端口

select 對多路同步I/O進行輪詢

shutdown 關閉socket上的連接

getsockname 取得本地socket名字

getpeername 獲取通信對方的socket名字

getsockopt 取端口設置

setsockopt 設置端口參數

sendfile 在文件或端口間傳輸數據

socketpair 創建一對已聯接的無名socket

· 用戶管理

getuid 獲取用戶標識號

setuid 設置用戶標志號

getgid 獲取組標識號

setgid 設置組標志號

getegid 獲取有效組標識號

setegid 設置有效組標識號

geteuid 獲取有效用戶標識號

seteuid 設置有效用戶標識號

setregid 分別設置真實和有效的的組標識號

setreuid 分別設置真實和有效的用戶標識號

getresgid 分別獲取真實的,有效的和保存過的組標識號

setresgid 分別設置真實的,有效的和保存過的組標識號

getresuid 分別獲取真實的,有效的和保存過的用戶標識號

setresuid 分別設置真實的,有效的和保存過的用戶標識號

setfsgid 設置文件系統檢查時使用的組標識號

setfsuid 設置文件系統檢查時使用的用戶標識號

getgroups 獲取后補組標志清單

setgroups 設置后補組標志清單

· 進程間通信

ipc 進程間通信總控制調用

信號

sigaction 設置對指定信號的處理方法

sigprocmask 根據參數對信號集中的信號執行阻塞/解除阻塞等操作

sigpending 為指定的被阻塞信號設置隊列

sigsuspend 掛起進程等待特定信號

signal 參見signal

kill 向進程或進程組發信號

*sigblock 向被阻塞信號掩碼中添加信號,已被sigprocmask代替

*siggetmask 取得現有阻塞信號掩碼,已被sigprocmask代替

*sigsetmask 用給定信號掩碼替換現有阻塞信號掩碼,已被sigprocmask代替

*sigmask 將給定的信號轉化為掩碼,已被sigprocmask代替

*sigpause 作用同sigsuspend,已被sigsuspend代替

sigvec 為兼容BSD而設的信號處理函數,作用類似sigaction

ssetmask ANSI C的信號處理函數,作用類似sigaction

消息

msgctl 消息控制操作

msgget 獲取消息隊列

msgsnd 發消息

msgrcv 取消息

管道

pipe 創建管道

信號量

semctl 信號量控制

semget 獲取一組信號量

semop 信號量操作

共享內存

shmctl 控制共享內存

shmget 獲取共享內存

shmat 連接共享內存

shmdt 拆卸共享內存

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11006

    瀏覽量

    206893
  • 系統調用
    +關注

    關注

    0

    文章

    27

    瀏覽量

    8296

原文標題:若想成為一名Linux下編程高手,必須能對各種系統調用有透徹的了解

文章出處:【微信號:edn-china,微信公眾號:EDN電子技術設計】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    怎么在C語言調用系統指令

    如果需要在C語言調用系統指令,經常使用system函數,操作簡單方便,很容易理解。
    發表于 09-06 14:50 ?443次閱讀

    Linux系統調用的實現與應用

    在計算機科學中,系統調用(System Call)是一種操作系統提供的服務,它允許應用程序通過軟件中斷的方式訪問操作系統內核中的函數。這些函數提供了一系列與硬件相關的服務,例如文件
    發表于 06-14 11:46 ?377次閱讀

    Linux內核中系統調用詳解

    Linux內核中設置了一組用于實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中
    發表于 08-23 10:37 ?635次閱讀
    Linux內核中<b class='flag-5'>系統</b><b class='flag-5'>調用</b>詳解

    系統調用函數庫分析及實例

    作為用戶我們極少接觸系統調用,但是我們熟悉C 語言,對庫函數的調用并不陌生。C語言支持一系列庫函數的調用,而事實上,庫函數的調用是C 語言在
    發表于 06-23 16:46 ?46次下載
    <b class='flag-5'>系統</b><b class='flag-5'>調用</b>函數庫分析及實例

    你知道Arm Linux系統調用流程?

    系統調用是操作系統提供的服務,用戶程序通過各種系統調用,來引用內核提供的各種服務,系統
    發表于 05-15 16:19 ?2191次閱讀
    你知道Arm Linux<b class='flag-5'>系統</b><b class='flag-5'>調用</b>流程?

    你知道Linux系統調用的原理

    系統調用是應用程序與操作系統內核之間的接口,它決定了程序如何與內核打交道的。無論程序是直接進行系統調用,還是通過運行庫,最終還是會到達
    發表于 05-16 16:21 ?1330次閱讀
    你知道Linux<b class='flag-5'>系統</b><b class='flag-5'>調用</b>的原理

    Linux下系統調用的技巧

    1.linux系統調用的基本原理  linux的系統調用形式與POSIX兼容,也是一套C語言函數名的集合。然而,linux系統
    發表于 04-02 14:36 ?305次閱讀

    Linux的系統調用是什么

    所謂系統調用是指操作系統提供給用戶程序調用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口獲得操作系統內核提供的服務。例如,用戶可以通過
    發表于 06-11 09:33 ?2204次閱讀

    系統調用是如何實現的?

    這張圖畫了挺久的,主要是想讓大家可以從全局角度,看下linux內核中系統調用的實現。 在講具體的細節之前,我們先根據上圖,從整體上看一下系統調用的實現。
    的頭像 發表于 02-20 16:46 ?3669次閱讀
    <b class='flag-5'>系統</b><b class='flag-5'>調用</b>是如何實現的?

    系統調用具體是如何實現的

    系統調用就是調用操作系統提供的一系列內核功能函數,因為內核總是對用戶程序持不信任的態度,一些核心功能不能直接交由用戶程序來實現執行。用戶程序只能發出請求,然后內核
    的頭像 發表于 09-29 11:10 ?3418次閱讀

    Linux內核系統調用概述及實現原理

    本文介紹了系統調用的一些實現細節。首先分析了系統調用的意義,它們與庫函數和應用程序接口(API)有怎樣的關系。然后,我們考察了Linux內核如何實現
    的頭像 發表于 05-14 14:11 ?1942次閱讀
    Linux內核<b class='flag-5'>系統</b><b class='flag-5'>調用</b>概述及實現原理

    Linux中的系統調用是怎樣實現

    系統調用和普通的函數調用沒有本質區別,普通的函數調用一般調用的是我們自己編寫的函數或者其它庫函數,而系統
    的頭像 發表于 02-15 11:40 ?1030次閱讀
    Linux中的<b class='flag-5'>系統</b><b class='flag-5'>調用</b>是怎樣實現

    系統調用:用戶棧與內核棧的切換(上)

    當發生系統調用、產生異常,外設發生中斷等事件時,會發生用戶棧和內核棧之間的切換, 本文從系統調用角度分析用戶棧與內核棧的切換。 系統
    的頭像 發表于 07-31 11:27 ?623次閱讀
    <b class='flag-5'>系統</b><b class='flag-5'>調用</b>:用戶棧與內核棧的切換(上)

    Linux系統調用的具體實現原理

    文我將基于 ARM 體系結構角度,從 Linux 應用層例子到內核系統調用函數的整個過程來梳理一遍,講清楚linux系統調用實現原理,這里我們以open
    的頭像 發表于 09-05 17:16 ?779次閱讀
    Linux<b class='flag-5'>系統</b><b class='flag-5'>調用</b>的具體實現原理

    Linux系統調用概述

    系統調用概述 計算機系統的各種硬件資源是有限的,在現代多任務操作系統上同時運行的多個進程都需要訪問這些資源,為了更好的管理這些資源進程是不允許直接操作的,所有對這些資源的訪問都必須有操
    的頭像 發表于 11-09 10:27 ?269次閱讀
    Linux<b class='flag-5'>系統</b><b class='flag-5'>調用</b>概述
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>