Linux筆記-用戶態與內核態


參考資料:
Linux探秘之用戶態與內核態 https://www.cnblogs.com/bakari/p/5520860.html
什么是用戶態?什么是內核態?如何區分? https://blog.csdn.net/hahachenchen789/article/details/79934208
linux系統調用表 https://www.jianshu.com/p/3e7be6febc5c
inux系統調用表(system call table) https://blog.csdn.net/sinat_26227857/article/details/44244433

Unix/Linux的體系架構

Unix/Linux的體系架構   如上圖所示,從宏觀上來看,Linux操作系統的體系架構分為`用戶態`和`內核態`(或者用戶空間和內核)。內核從本質上看是一種軟件——控制計算機的硬件資源,並提供上層應用程序運行的環境。用戶態即上層應用程序的活動空間,應用程序的執行必須依托於內核提供的資源,包括CPU資源、存儲資源、I/O資源等。為了使上層應用能夠訪問到這些資源,內核必須為上層應用提供訪問的接口:即`系統調用`。 `系統調用`是操作系統的最小功能單位,這些系統調用根據不同的應用場景可以進行擴展和裁剪,現在各種版本的Unix實現都提供了不同數量的系統調用,如Linux的不同版本提供了240-260個系統調用,FreeBSD大約提供了320個(reference:UNIX環境高級編程)。 `庫函數`實現對系統調用的封裝,將簡單的業務邏輯接口呈現給用戶,方便用戶調用。這樣的一種組成方式極大增強了程序設計的靈活性,對於簡單的操作,我們可以直接調用系統調用來訪問資源,對於復雜操作,我們借助於庫函數來實現。顯然,這樣的庫函數依據不同的標准也可以有不同的實現版本,如ISO C 標准庫,POSIX標准庫等。 `Shell`是一個特殊的應用程序,俗稱命令行,本質上是一個命令解釋器,它下通系統調用,上通各種應用,通常充當着一種“膠水”的角色,來連接各個小功能程序,讓不同程序能夠以一個清晰的接口協同工作,從而增強各個程序的功能。同時,Shell是可編程的,它可以執行符合Shell語法的文本,這樣的文本稱為Shell腳本,通常短短的幾行Shell腳本就可以實現一個非常大的功能,原因就是這些Shell語句通常都對系統調用做了一層封裝。為了方便用戶和系統交互,一般,一個Shell對應一個終端,終端是一個硬件設備,呈現給用戶的是一個圖形化窗口。我們可以通過這個窗口輸入或者輸出文本。這個文本直接傳遞給shell進行分析解釋,然后執行。

 總結一下,用戶態的應用程序可以通過三種方式來訪問內核態的資源:
1)系統調用
2)庫函數
3)Shell腳本

下圖是對上圖的一個細分結構,從這個圖上可以更進一步對內核所做的事有一個“全景式”的印象。
主要表現為:

  1. 向下控制硬件資源
  2. 向內管理操作系統資源:包括進程的調度和管理、內存的管理、文件系統的管理、設備驅動程序的管理以及網絡資源的管理
  3. 向上則向應用程序提供系統調用的接口。
    從整體上來看,整個操作系統分為兩層:用戶態內核態,這種分層的架構極大地提高了資源管理的可擴展性和靈活性,而且方便用戶對資源的調用和集中式的管理,帶來一定的安全性。

附錄:系統調用表

系統調用表(點擊展開)
https://www.jianshu.com/p/3e7be6febc5c 一、進程控制:
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     進程間通信總控制調用
1、信號
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


2、消息
msgctl  消息控制操作
msgget  獲取消息隊列
msgsnd  發消息
msgrcv  取消息


3、管道
pipe    創建管道


4、信號量
semctl  信號量控制
semget  獲取一組信號量
semop   信號量操作


5、共享內存
shmctl  控制共享內存
shmget  獲取共享內存
shmat   連接共享內存
shmdt   拆卸共享內存

系統調用表(含系統調用號)
https://blog.csdn.net/sinat_26227857/article/details/44244433


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM