第五章 系統調用

1. 系統調用的作用

  • 爲用戶空間提供了一種硬件的抽象接口。如Linux的“萬物皆文件”的思想,APP讀取文件不用關心磁盤或者文件系統的類型
  • 保證系統的穩定和安全。因爲內核是作爲Hardware跟APP之間的中間人,可以避免APP不正確地使用Hardware,竊取其他進程的資源,或其他危害系統的事情。
  • 實現多任務和虛擬內存的需要

2. 在Linux中,系統調用是除了異常和陷入之外,用戶空間訪問kernel的唯一手段。

3. 系統調用在出現錯誤的時候C庫會把錯誤碼寫入errno全局變量。通過調用perror()庫函數,可以把變量翻譯成用戶可以理解的錯誤字符串。

4. 在include/linux/syscalls.h中列出了一些列定義系統調用時用到的宏,如:

  1. #define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
  2. #define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
  3. #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
  4. #define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
  5. #define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
  6. #define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
  7. #define SYSCALL_DEFINEx(x, sname, ...) \
  8. SYSCALL_METADATA(sname, x, __VA_ARGS__) \
  9. __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)

如open系統調用的定義 (fs/open.c中):

  1. SYSCALL_DEFINE3(open,constchar __user *, filename,int, flags,umode_t, mode)
  2. {
  3. if(force_o_largefile())
  4. flags |= O_LARGEFILE;
  5. return do_sys_open(AT_FDCWD, filename, flags, mode);
  6. }

5. 在定義系統調用是會使用asmlinkage限定詞,目的是告訴編譯器僅從棧中提取該函數的參數。

6. 每一個系統調用都被賦予一個系統調用號,獨一無二。用戶空間的進程執行系統調用時會將系統調用號傳遞給kernel,kernel據此判斷需要執行那個系統調用。

在arm架構的kernel代碼,系統調用表如下,其中在表中的號就是系統調用號。

  1. arch/arm/kernel/entry-common.S中:
  2. .type sys_call_table,#object
  3. ENTRY(sys_call_table)
  4. #include "calls.S"
  5. 在arch/arm/kernel/call.S中:
  6. /*0*/ CALL(sys_restart_syscall)
  7. CALL(sys_exit)
  8. CALL(sys_fork)
  9. CALL(sys_read)
  10. CALL(sys_write)
  11. /*5*/ CALL(sys_open)
  12. CALL(sys_close)
  13. CALL(sys_ni_syscall)/* was sys_waitpid */
  14. CALL(sys_creat)
  15. ......

在arm64架構的kernel代碼中如下:

  1. 在arch/arm64/kernel/sys.c中:
  2. #undef __SYSCALL
  3. #define __SYSCALL(nr, sym) [nr] = sym,
  4. /*
  5. *The sys_call_table array must be 4K aligned to be accessible from
  6. * kernel/entry.S.
  7. */
  8. void *sys_call_table[__NR_syscalls] __aligned(4096)={
  9. [0... __NR_syscalls -1]= sys_ni_syscall,
  10. #include <asm/unistd.h>
  11. };
  12. 在arch/arm64/include/asm/unistd32.h中:
  13. #define __NR_restart_syscall 0
  14. __SYSCALL(__NR_restart_syscall, sys_restart_syscall)
  15. #define __NR_exit 1
  16. __SYSCALL(__NR_exit, sys_exit)
  17. #define __NR_fork 2
  18. __SYSCALL(__NR_fork, sys_fork)
  19. #define __NR_read 3
  20. __SYSCALL(__NR_read, sys_read)
  21. #define __NR_write 4
  22. __SYSCALL(__NR_write, sys_write)
  23. #define __NR_open 5
  24. __SYSCALL(__NR_open, compat_sys_open)
  25. #define __NR_close 6
  26. __SYSCALL(__NR_close, sys_close)
  27. /*7 was sys_waitpid */
  28. __SYSCALL(7, sys_ni_syscall)
  29. #define __NR_creat 8
  30. __SYSCALL(__NR_creat, sys_creat)
  31. ......

7. Linux內核通過軟中斷引發一個異常來促使系統切換到內核態去執行異常處理程序,在該異常處理程序中會或獲得用戶傳給的系統調用號和其他參數,根據系統調用號決定執行那個系統調用處理程序。對於arm架構是通過svc軟中斷指令實現的。

8. copy_to_user()和copy_from_user()

在內核空間接受一個用戶空間的指針的時候,需要做如下檢查:

  • 指針指向的內存區域屬於用戶空間
  • 指針指向額內存區域在進程的地址空間裏
  • 如果是讀,該內存應被標記爲可讀; 如果是寫,該內存應被標記爲可寫; 如果是可執行,該內存應被標記爲可執行;

上述的兩個方法在完成了必須的檢查和內核空間和用戶空間之間數據拷貝 。需要注意的是返回值的含義:

  • 如果執行失敗,返回沒能完成拷貝的數據的字節數
  • 成功的話,返回0
  • 如果在檢查用戶空間指針合法性時出錯,返回 -EFAULT

此外,當包含用戶數據的頁被換出到硬盤上而不是在物理內存上時,這個兩函數都會引起阻塞,此時進程會休眠,知道缺頁處理程序將頁從硬盤重新換回到物理內存。

9. 內核執行系統調用的時候處於進程上下文,current指針指向當前任務,即引發系統調用的那個進程

10. 在進程上下文,內核可以睡眠並且可以被搶佔。

11. 必須保證系統調用是可衝入的。

12. 下面是執行系統調用的連鎖反應:陷入內核,傳遞系統調用號和參數,執行正確的系統調用函數,並把返回值帶回到用戶空間

来自为知笔记(Wiz)

时间: 2024-08-25 02:41:50

第五章 系統調用的相关文章

第四章 進程調度

可以參考<深入Linux內核架構>第二章閱讀筆記. 1. 調度程序的職責 負責決定那個進程投入運行,何時運行以及運行多長時間 在一組處於可運行狀態的進程中選擇一個來執行,這是調度程序的基本工作 2. 多任務操作系統就是能同時併發地交互執行多個進程的操作系統 3. 多任務系統分類 非搶佔式多任務:除非進程自己主動停止運行,否則它會一直執行.進程主動掛起自己的操作稱爲讓步(yielding). 搶佔式多任務:Linux採用了這種.搶佔的含義:由調度程序來決定什麼時候停止一個進程運行,以便其他進程能

操作系統3-處理機調度與死鎖(死鎖)

操作系統-處理機調度與死鎖3(死鎖) 7.死鎖問題 死鎖是指多個進程等待其它進程佔有的資源,因而無限期等待下去的局面. 系統發生死鎖時,一定具備以下四個條件: 互斥條件.對於一個排他性資源,某一時刻最多允許一個進程佔有. 佔有且申請條件.進程至少已佔有一個資源,又要申請新的資源.此時該進程阻塞,且在等待過程中不釋放已經佔有的資源. 不可搶佔條件.進程獲得的資源在未使用之前,其他進程不得搶佔該資源. 環路條件.若干個進程相互要佔有彼此的資源,形成一個環路. 8.死鎖的避免 要避免死鎖,分為靜態策略

用FineReport報表系統構建重慶江津區疾病預防控制信息系統

前言 一場自下而上的改革嘗試 這篇文章剛開始動筆的時候,恰逢剛接到衛生部專家即將來津對我區基本公共衛生服務以及一系中轉項目的工作現況.資金使用情況進行檢查的通知.誠然我區的工作現況不便在此進行評說,但是,做為迎檢的大頭戲――「國家基本公共衛生服務項目」 ――也是我國公共衛生制度建設的重要組成部分,卻一直以來都是困繞各級衛生行政部門和基層醫療機構老大難問題:各種讓人眼花潦亂的考核指標.紛繁複雜的業務流程,再加上沒有可以參考的工作模式以及各自為戰的軟體.平台,工作的開展難度和進展可見一斑. 雖然今年

用FineReport報表系統構建財政資金和公共資金監管系統

一.應用背景 在電子化的社會,政府作為國家的權力中心和社會管理機構,在加入WTO後,將實現從管理型到管理服務型的轉變.政府機構在管理和規範國家政治經濟活動之外,將藉助強大的網路技術,把更多的時間和精力,投入到社會公眾服務中去.社會信息資源和各種政策法規不再會塵封庫中或者層層傳達,而將通過網路在第一時間與公眾會面,通過網路,政府可以廣納賢言,迅速了解社會政治經濟的發展動態,甚至是來自社會最底層的信息,並以此做出及時準確的決策,這對更好的促進經濟建設和社會穩定,好處不言而喻.按照地方政府機關提出推進

Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

he Linux-PAM 系统管理员指南作者:Andrew G. Morgan, [email protected]翻译:孙国清(Thomas Sun),[email protected]DRAFT v0.71 1999/11/8 这个文档所涉的是系统管理员须知的关于Linux-PAM库的知识. 它涉及了设置PAM的正确语法并讨论维护一个可靠系统的正确的策略.1. 介绍 Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户. 换句话说

個人資料管理的網頁系統

需求: 第一階段. 動態生成網頁,此網頁中顯示當前目錄下的文件結構,並可以瀏覽文本文檔以及內建圖片. 第一階段. 建立新的文本文檔,並用富文本的方式,可標記某一段文字顏色以及添加圖片,可以加載其他更多的文件類型,如excel, word, rtf, pdf 操作流程: 用java程式執行dos語句,生成文件目錄資料.整理目錄資料成樹形結構(此檔案留做備份,比對新的目錄有無變化). 用java寫出網頁 ============================== 利用批處理生成網頁 @echo o

算法导论基础(第一~五章)

插入排序 最好情况输入数组开始时候就是满足要求的排好序的,时间代价为θ(n): 最坏情况输入数组是按逆序排序的,时间代价为θ(n^2). 归并排序 归并排序采用了算法设计中的分治法,分治法的思想是将原问题分解成n个规模较小而结构与原问题相似的小问题,递归的解决这些子问题,然后再去合并其结果,得到原问题的解. 分治模式在每一层递归上有三个步骤: 分解(divide):将原问题分解成一系列子问题. 解决(conquer):递归地解答各子问题,若子问题足够小,则直接求解. 合并(combine):将子

java掉系統进程

/** * 調系統命令 */ try { Process process = Runtime.getRuntime().exec("ipconfig"); Scanner scanner = new Scanner(process.getInputStream(),"gbk"); while (scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.println(str); } sca

Linux系統SUDO的使用定義及設定

什麼是sudo?Sudo是可以讓某個用户不需要擁有(管理員)的賬號密碼,可以執行管理員的權限的.作為管理員可以指派某些用户可以執行某些 特定命令. Sudo的特點 它的特性主要有这样幾點: Sudo能够限制用户只在某台主機上運行某些命令 Sudo提供了豐富的日志,詳细地記錄了每個用户幹了什麼. 它能够將日記傳到中心主機或者日記服務器 Sudo使用時間戳文件來執行類似的"檢票"系统.當用户調用 sudo并且输入它的密碼時, 用户获得了一张存活期为5分钟的票 (这个值可以在编译的时候改变)