什麼是system call ?

System Call(系統呼叫)

    1. Def:

作為user program執行時與OS之間的溝通介面,當user program需要OS提供服務時,藉由呼叫system call(伴隨trap to monitor mode)通知OS,OS可依據system call ID查表,啟動service routine執行,得到結果,再傳回給user program,完成服務請求

    1. System Call種類:(P3-8~3-9)
      1. Process Control
      2. File Management
      3. Device Management
      4. Information Maintenance
      5. Communication
    2. system call的參數傳遞

有三種方法:

    1. 法一:利用registers儲存參數
      • 優:快速
      • 缺:不適用於參數多時。
        ∵register數目有限,參數不能太多
    2. 法二:將參數存在memory中的某個表格或Block,同時將此表格的起始位址存在一個register中,將此register傳給OS:
      • 優:適用於參數多時
        ∵ 可存參數較多
      • 缺:速度較慢
        ∵不限制參數的數目與長度
    3. 法三:利用system stack保存參數
      • push(保存)參數
      • OS利用POP取出參數
      • 不限制參數的數目及長度

 

Linux 驅動程式的大架構中,system call 是屬於第一層的架構;本文以一個 Linux 範例程式來展示 user application 與 Linux 驅動程式的關係。

作者/陳俊宏
www.jollen.org

System Call 與驅動程式的關係

System call 是 user application 與 Linux device driver 的溝通介面。

User application 透過呼叫 system call 來「叫起」driver 的 task,user application 要呼叫 system call 必須呼叫 GNU C 所提供的「wrapper function」,每個 system call 都會對應到 driver 內的一個 task,此 task 即是 file_operation 函數指標所指的函數。

 

Linux 驅動程式與 user application 間的溝通方式是透過 system call,實際上 user application 是以 device file 與裝置驅動程式溝通。要達成此目的,驅動程式必須建構在此「file」之上,因此 Linux 驅動程式必須透過 VFS(virtual file system)層來實作 system call。

一個簡單的範例

/dev目錄下的檔案稱為device file,是 user application 用來與硬體裝置溝通的介面。以下是一個簡單的範例:

當我們打開/dev/debug檔案時,範例所呼叫open()函數會叫起支援/dev/debug驅動程式的對應函數;同理,我們對/dev/debug執行ioctl()函數時,也會叫起驅動程式的相對應函數。

範例中的open()與ioctl()函數皆是GLIBC裡的函數,「叫起」驅動程式函數的動作涉及user space與kernel space的切換,此動作藉由system call介面來完成。設計一個支援”/dev/debug”裝置的驅動程式則是Linux驅動程式設計師所要負責的工作。

–jollen

發表迴響