0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

Linux系統(tǒng)調(diào)用的具體實現(xiàn)原理

冬至子 ? 來源:曉亮Albert ? 作者:曉亮Albert ? 2023-09-05 17:16 ? 次閱讀

本文我將基于 ARM 體系結(jié)構角度,從 Linux 應用層例子到內(nèi)核系統(tǒng)調(diào)用函數(shù)的整個過程來梳理一遍,講清楚linux系統(tǒng)調(diào)用實現(xiàn)原理,這里我們以open系統(tǒng)調(diào)用為例來講解。

在應用層調(diào)用 open 系統(tǒng)調(diào)用時,實際上調(diào)用的是 C 標準庫函數(shù),具體的代碼如下:

其中,open 函數(shù)的第一個參數(shù)是要打開的文件路徑,第二個參數(shù)則是打開方式(例如只讀、讀寫等)。在這里我們使用了 O_RDONLY 參數(shù)表示只讀。

在 C 標準庫中,open 函數(shù)實際上是通過系統(tǒng)調(diào)用來完成文件的打開操作。接下來,我們來看一下系統(tǒng)調(diào)用的具體實現(xiàn)。

在 ARM 架構的 Linux 內(nèi)核中,系統(tǒng)調(diào)用的處理流程分為以下幾步:

1.應用程序通過 swi 匯編指令觸發(fā)中斷,將 CPU 切換到特權模式。

在 ARM 架構中,每一個系統(tǒng)調(diào)用都對應有一個系統(tǒng)調(diào)用號,比如open系統(tǒng)調(diào)用的號碼就是5,應用程序通過 swi 指令從用戶態(tài)切換到內(nèi)核態(tài),CPU進入特權模式,通過R7寄存器將中系統(tǒng)調(diào)用號傳遞給內(nèi)核。下面是 open 系統(tǒng)調(diào)用的匯編代碼示例:

2.中斷處理程序根據(jù)傳遞的系統(tǒng)調(diào)用號找到對應的系統(tǒng)調(diào)用函數(shù)。

內(nèi)核中的系統(tǒng)調(diào)用處理程序是通過一張系統(tǒng)調(diào)用表來實現(xiàn)的,該表包含了所有系統(tǒng)調(diào)用的函數(shù)指針。當中斷處理程序接收到一個系統(tǒng)調(diào)用請求時,它會根據(jù)系統(tǒng)調(diào)用號查找該表,并跳轉(zhuǎn)到相應的系統(tǒng)調(diào)用函數(shù)。在 ARM 架構中,系統(tǒng)調(diào)用表存儲在地址為 0x9000 的內(nèi)存位置上。

對于 open 系統(tǒng)調(diào)用,在內(nèi)核中的實現(xiàn)代碼為 sys_open() 函數(shù),其定義在 fs/open.c 文件中。在 ARM 架構中,sys_open() 函數(shù)的函數(shù)指針存儲在系統(tǒng)調(diào)用表的第 5 個位置上。

3.將用戶空間的參數(shù)復制到內(nèi)核空間,并在系統(tǒng)調(diào)用函數(shù)中進行相應的操作。

在 ARM 架構中,內(nèi)核將用戶空間和內(nèi)核空間分開,以確保用戶空間的數(shù)據(jù)不會被惡意程序修改。因此,在執(zhí)行系統(tǒng)調(diào)用之前,內(nèi)核需要將用戶空間的數(shù)據(jù)復制到內(nèi)核空間。對于 open 系統(tǒng)調(diào)用,它的參數(shù)包括文件名和標志,這些參數(shù)都需要從用戶空間復制到內(nèi)核空間。

在內(nèi)核中,copy_from_user() 和 copy_to_user() 函數(shù)用于從用戶空間復制數(shù)據(jù)到內(nèi)核空間和從內(nèi)核空間復制數(shù)據(jù)到用戶空間。對于 open 系統(tǒng)調(diào)用,它需要從用戶空間復制文件名和標志,并將它們傳遞給 sys_open() 函數(shù)進行處理。下面是 sys_open() 函數(shù)的代碼示例:

4.將處理結(jié)果返回給用戶空間,并將 CPU 切換回用戶模式。

在 ARM 架構中,系統(tǒng)調(diào)用的返回值通過 r0 寄存器傳遞給應用程序。對于 open 系統(tǒng)調(diào)用,它的返回值為文件描述符,即打開文件的句柄。如果打開文件成功,則返回一個非負整數(shù),表示新的文件描述符;否則,返回一個負數(shù),表示錯誤代碼。

在 sys_open() 函數(shù)中,如果成功打開文件,則將文件描述符安裝到當前進程的文件描述符表中,并返回該文件描述符。否則,返回錯誤代碼。下面是 open 系統(tǒng)調(diào)用的匯編代碼示例:

最后,當處理完 open 系統(tǒng)調(diào)用后,中斷處理程序?qū)?CPU 切換回用戶模式,將處理結(jié)果返回給應用程序。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5294

    瀏覽量

    119814
  • Linux系統(tǒng)

    關注

    4

    文章

    590

    瀏覽量

    27315
  • ARM處理器
    +關注

    關注

    6

    文章

    360

    瀏覽量

    41632
  • 觸發(fā)中斷

    關注

    0

    文章

    11

    瀏覽量

    6556
  • 函數(shù)指針

    關注

    2

    文章

    56

    瀏覽量

    3770
收藏 人收藏

    評論

    相關推薦

    Linux系統(tǒng)調(diào)用實現(xiàn)與應用

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

    Linux內(nèi)核中系統(tǒng)調(diào)用詳解

    Linux內(nèi)核中設置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用。用戶可以通過系統(tǒng)
    發(fā)表于 08-23 10:37 ?756次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核中<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>詳解

    添加Linux系統(tǒng)調(diào)用與利用QEMU測試

    添加Linux系統(tǒng)調(diào)用與利用QEMU測試
    發(fā)表于 10-01 12:19 ?619次閱讀
    添加<b class='flag-5'>Linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>與利用QEMU測試

    什么是Linux系統(tǒng)調(diào)用,包括哪些內(nèi)容

    所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口獲得操作系統(tǒng)內(nèi)核提供的服務。例如,用戶可以通過
    發(fā)表于 08-23 11:55

    ARM linux系統(tǒng)調(diào)用實現(xiàn)原理

    大家都知道linux的應用程序要想訪問內(nèi)核必須使用系統(tǒng)調(diào)用從而實現(xiàn)從usr模式轉(zhuǎn)到svc模式。下面咱們看看它的實現(xiàn)過程。
    發(fā)表于 05-30 11:24 ?2231次閱讀

    基于linux系統(tǒng)實現(xiàn)的vivado調(diào)用VCS仿真教程

    linux系統(tǒng)實現(xiàn)vivado調(diào)用VCS仿真教程 作用:vivado調(diào)用VCS仿真可以加快工程的仿真和調(diào)試,提高效率。 前期準備:確認安
    的頭像 發(fā)表于 07-05 03:30 ?1.1w次閱讀
    基于<b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>實現(xiàn)</b>的vivado<b class='flag-5'>調(diào)用</b>VCS仿真教程

    透了解系統(tǒng)調(diào)用助你成為Linux下編程高手

    Linux內(nèi)核中設置了一組用于實現(xiàn)各種系統(tǒng)功能的子程序,稱為系統(tǒng)調(diào)用。用戶可以通過系統(tǒng)
    的頭像 發(fā)表于 05-11 11:27 ?3407次閱讀
    透了解<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>助你成為<b class='flag-5'>Linux</b>下編程高手

    Linux系統(tǒng)調(diào)用的技巧

    1.linux系統(tǒng)調(diào)用的基本原理  linux系統(tǒng)調(diào)用形式與POSIX兼容,也
    發(fā)表于 04-02 14:36 ?380次閱讀

    Linux系統(tǒng)調(diào)用是什么

    所謂系統(tǒng)調(diào)用是指操作系統(tǒng)提供給用戶程序調(diào)用的一組“特殊”接口,用戶程序可以通過這組“特殊”接口獲得操作系統(tǒng)內(nèi)核提供的服務。例如,用戶可以通過
    發(fā)表于 06-11 09:33 ?2334次閱讀

    以源代碼為例,講解ARM Linux系統(tǒng)調(diào)用實現(xiàn)原理

    大家都知道linux的應用程序要想訪問內(nèi)核必須使用系統(tǒng)調(diào)用從而實現(xiàn)從usr模式轉(zhuǎn)到svc模式。下面咱們看看它的實現(xiàn)過程。
    發(fā)表于 08-12 10:42 ?1044次閱讀

    系統(tǒng)調(diào)用是如何實現(xiàn)的?

    這張圖畫了挺久的,主要是想讓大家可以從全局角度,看下linux內(nèi)核中系統(tǒng)調(diào)用實現(xiàn)。 在講具體的細節(jié)之前,我們先根據(jù)上圖,從整體上看一下
    的頭像 發(fā)表于 02-20 16:46 ?3938次閱讀
    <b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>是如何<b class='flag-5'>實現(xiàn)</b>的?

    系統(tǒng)調(diào)用具體是如何實現(xiàn)

    返回給應用程序。如此才能保證系統(tǒng)的穩(wěn)定和安全。本文采用 的實例來講解系統(tǒng)調(diào)用具體是如何實現(xiàn)的。 系統(tǒng)調(diào)用
    的頭像 發(fā)表于 09-29 11:10 ?3660次閱讀

    如何區(qū)分xenomai、linux系統(tǒng)調(diào)用/服務

    對于同一個POSIX接口應用程序,可能既需要xenomai內(nèi)核提供服務(xenomai 系統(tǒng)調(diào)用),又需要調(diào)用linux內(nèi)核提供服務(linux
    的頭像 發(fā)表于 05-10 10:28 ?1984次閱讀

    Linux內(nèi)核系統(tǒng)調(diào)用概述及實現(xiàn)原理

    本文介紹了系統(tǒng)調(diào)用的一些實現(xiàn)細節(jié)。首先分析了系統(tǒng)調(diào)用的意義,它們與庫函數(shù)和應用程序接口(API)有怎樣的關系。然后,我們考察了
    的頭像 發(fā)表于 05-14 14:11 ?2166次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>概述及<b class='flag-5'>實現(xiàn)</b>原理

    Linux中的系統(tǒng)調(diào)用是怎樣實現(xiàn)

    系統(tǒng)調(diào)用和普通的函數(shù)調(diào)用沒有本質(zhì)區(qū)別,普通的函數(shù)調(diào)用一般調(diào)用的是我們自己編寫的函數(shù)或者其它庫函數(shù),而系統(tǒng)
    的頭像 發(fā)表于 02-15 11:40 ?1195次閱讀
    <b class='flag-5'>Linux</b>中的<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>調(diào)用</b>是怎樣<b class='flag-5'>實現(xiàn)</b>