<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天內不再提示

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

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

本文我將基于 ARM 體系結構角度,從 Linux 應用層例子到內核系統調用函數的整個過程來梳理一遍,講清楚linux系統調用實現原理,這里我們以open系統調用為例來講解。

在應用層調用 open 系統調用時,實際上調用的是 C 標準庫函數,具體的代碼如下:

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

在 C 標準庫中,open 函數實際上是通過系統調用來完成文件的打開操作。接下來,我們來看一下系統調用的具體實現。

在 ARM 架構的 Linux 內核中,系統調用的處理流程分為以下幾步:

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

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

2.中斷處理程序根據傳遞的系統調用號找到對應的系統調用函數。

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

對于 open 系統調用,在內核中的實現代碼為 sys_open() 函數,其定義在 fs/open.c 文件中。在 ARM 架構中,sys_open() 函數的函數指針存儲在系統調用表的第 5 個位置上。

3.將用戶空間的參數復制到內核空間,并在系統調用函數中進行相應的操作。

在 ARM 架構中,內核將用戶空間和內核空間分開,以確保用戶空間的數據不會被惡意程序修改。因此,在執行系統調用之前,內核需要將用戶空間的數據復制到內核空間。對于 open 系統調用,它的參數包括文件名和標志,這些參數都需要從用戶空間復制到內核空間。

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

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

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

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

最后,當處理完 open 系統調用后,中斷處理程序將 CPU 切換回用戶模式,將處理結果返回給應用程序。

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

    關注

    30

    文章

    5113

    瀏覽量

    118012
  • Linux系統
    +關注

    關注

    4

    文章

    573

    瀏覽量

    26963
  • ARM處理器
    +關注

    關注

    6

    文章

    349

    瀏覽量

    41361
  • 觸發中斷
    +關注

    關注

    0

    文章

    11

    瀏覽量

    6539
  • 函數指針
    +關注

    關注

    2

    文章

    53

    瀏覽量

    3741
收藏 人收藏

    評論

    相關推薦

    Linux系統調用實現與應用

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

    Linux內核中系統調用詳解

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

    添加Linux系統調用與利用QEMU測試

    添加Linux系統調用與利用QEMU測試
    發表于 10-01 12:19 ?240次閱讀
    添加<b class='flag-5'>Linux</b><b class='flag-5'>系統</b><b class='flag-5'>調用</b>與利用QEMU測試

    什么是Linux系統調用,包括哪些內容

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

    ARM linux系統調用實現原理

    大家都知道linux的應用程序要想訪問內核必須使用系統調用從而實現從usr模式轉到svc模式。下面咱們看看它的實現過程。
    發表于 05-30 11:24 ?2189次閱讀

    基于linux系統實現的vivado調用VCS仿真教程

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

    透了解系統調用助你成為Linux下編程高手

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

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

    實際上,很多已經被我們習以為常的C語言標準函數,在Linux平臺上的實現都是靠系統調用完成的,所以如果想對系統底層的原理作深入的了解,掌握各
    的頭像 發表于 06-01 08:44 ?1.5w次閱讀
    什么是<b class='flag-5'>系統</b><b class='flag-5'>調用</b>?為什么要用<b class='flag-5'>系統</b><b class='flag-5'>調用</b>?

    Linux系統調用的技巧

    1.linux系統調用的基本原理  linux系統調用形式與POSIX兼容,也
    發表于 04-02 14:36 ?307次閱讀

    以源代碼為例,講解ARM Linux系統調用實現原理

    大家都知道linux的應用程序要想訪問內核必須使用系統調用從而實現從usr模式轉到svc模式。下面咱們看看它的實現過程。
    發表于 08-12 10:42 ?948次閱讀

    系統調用是如何實現的?

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

    系統調用具體是如何實現

    返回給應用程序。如此才能保證系統的穩定和安全。本文采用 的實例來講解系統調用具體是如何實現的。 系統調用
    的頭像 發表于 09-29 11:10 ?3438次閱讀

    如何區分xenomai、linux系統調用/服務

    對于同一個POSIX接口應用程序,可能既需要xenomai內核提供服務(xenomai 系統調用),又需要調用linux內核提供服務(linux
    的頭像 發表于 05-10 10:28 ?1731次閱讀

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

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

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

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