系統調用入口機制:多架構對比理解(以 ARM64 為主)


📖 推薦閱讀:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
🎥 更多學習視頻請關注 B 站:嵌入式Jerry


系統調用入口機制:多架構對比理解(以 ARM64 為主)

本篇內容聚焦于系統調用的入口實現機制,重點以 ARM64 架構為例,同時對比 x86RISC-V 架構的實現方式,從多角度幫助構建系統調用的總體認知體系。


在這里插入圖片描述

一、系統調用的核心概念

  • 定義:系統調用是用戶態程序請求內核服務的一種受控方式。
  • 目的:實現從用戶態到內核態的“安全切換”,如文件訪問、進程創建、內存管理等。
  • 典型例子open(), read(), write(), fork() 等。

二、系統調用的觸發方式對比

架構觸發指令注釋觸發入口源文件位置
ARM64svc #0使用 SVC(Supervisor Call)陷入內核arch/arm64/kernel/entry.S
x86int $0x80 / syscall前者為老方式,后者為現代 CPU 使用方式arch/x86/entry/entry_64.S
RISC-Vecall通過環境調用指令陷入內核arch/riscv/kernel/entry.S

三、以 ARM64 為例的系統調用執行流程

🔹 1. 用戶態觸發

int fd = open("/etc/passwd", O_RDONLY);
  • glibc 中 open()syscall(SYS_open, ...)
  • 執行 svc #0 指令,觸發異常

🔹 2. 異常向量入口

// arch/arm64/kernel/entry.S
el0_sync:bl el0_svc

說明:el0_sync 是從 EL0(用戶態)同步異常進入 EL1(內核態)的處理入口。

🔹 3. C 語言調用鏈

el0_sync└── el0_svc (arch/arm64/kernel/entry-common.c)└── do_el0_svc() (arch/arm64/kernel/syscall.c)└── syscall_trace_enter() + invoke_syscall()
  • invoke_syscall() 中執行:

    • 讀取 x8(系統調用號)
    • 查表:sys_call_table[x8]
    • 執行對應系統調用實現函數,如 __arm64_sys_open()

四、系統調用參數與返回值對比

架構參數傳遞寄存器系統調用號寄存器返回值寄存器
ARM64x0~x5x8x0
x86eax, ebx, ecxeaxeax
RISC-Va0~a5a7a0

五、系統調用表與綁定機制

系統調用表是 syscall number 與實際內核函數之間的映射橋梁,實現“按號調用”的機制。

🔹 syscall 表文件位置

架構系統調用表路徑
ARM64arch/arm64/kernel/syscall_table.S
x86arch/x86/entry/syscalls/syscall_64.tbl
RISC-Varch/riscv/kernel/syscall_table.c

🔹 syscall 映射機制

  1. 用戶態設置 syscall number(如 ARM64 用 x8
  2. 內核讀取 syscall number,從 syscall 表中查找對應函數指針
  3. 執行綁定的系統調用函數(如 __arm64_sys_open()

🔸 例子(ARM64 的 syscall_table.S):

.long __arm64_sys_open        // 對應 __NR_open
.long __arm64_sys_read        // 對應 __NR_read

🔹 SYSCALL_DEFINE 展開示意

SYSCALL_DEFINE3(open, const char __user *filename, int flags, umode_t mode)
  • 宏展開后生成 __arm64_sys_open()
  • 并作為 syscall 表的一項注冊

六、完整調用路徑梳理(ARM64)

用戶態↓
svc #0 (用戶態發起陷入)↓
el0_sync (arch/arm64/kernel/entry.S)↓
el0_svc (arch/arm64/kernel/entry-common.c)↓
do_el0_svc (arch/arm64/kernel/syscall.c)↓
syscall_trace_enter → invoke_syscall()↓
sys_call_table[x8] → __arm64_sys_open()

七、調試與分析工具推薦

工具用途
strace跟蹤用戶態發起的系統調用
ftrace跟蹤內核態 syscall 調用鏈
gdb可調試匯編入口與寄存器設置
objdump / readelf查看符號表與 ELF 結構

八、常見問題總結

問題答案
系統調用是中斷嗎?是一種同步異常(軟中斷),可類比中斷處理但不同于 IRQ。
為什么每種架構入口不一樣?不同指令集的陷入方式、特權級切換方式、寄存器約定不一樣。
系統調用號在哪設置?通常在用戶態庫中寫入指定寄存器(如 ARM64 的 x8)。
怎么找到系統調用函數?查 syscall 表,通過 syscall number 定位函數指針。
參數怎么傳?不同架構采用不同寄存器(x0x5, a0a5, eax+ebx…)。
syscall 表作用是什么?它是內核中系統調用號和函數之間的查找映射表,按號定位函數地址執行。

📌 本文重點理解系統調用的“陷入路徑”,構建從用戶態到內核態的調用跳轉邏輯。后續配合“系統調用如何連接內核子系統”篇章,深入剖析 syscall 如何與 VFS、進程管理等模塊協作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java MultipartFile初始化

在Java中,MultipartFile 是Spring框架中用于處理文件上傳的接口。?開發者通常不會直接初始化MultipartFile對象,而是通過Spring MVC的控制器方法參數接收上傳的文件。如果需要在測試或模擬場景中創建其實例,可以使用Spring的MockMultipartFi…

Linux C IO多路復用

在上一節利用管道實現了一個簡單的聊天室,但這個聊天室有一個很明顯的問題就是,當A處于讀阻塞情況下是不能向B發送消息的,只有收到B的消息才能發送。如何實現同時既能接受B的消息,又能向其發送消息?很遺憾,…

day21——特殊文件:XML、Properties、以及日志框架

文章目錄一、特殊文件概述二、Properties屬性文件2.1 文件特點2.2 Properties類解析2.3 寫入屬性文件三、XML文件詳解3.1 XML核心特性3.2 XML解析(Dom4J)3.3 XML寫入3.4 XML約束(了解)四、日志技術(Logback&#xff09…

經典VB與現代VB(VB.NET)

Visual Basic(VB)目前其發展狀態可以分為經典VB(VB6及之前)?和現代VB(VB.NET)?兩個階段。經典VB誕生于1991年,憑借?“快速開發(Rapid Application Development, RAD)”…

iOS UI視圖面試相關

iOS UI視圖面試相關 UITableVIew相關 重用機制 cell [tableView dequeueReusableCellWillIdentifier:identifer];其中A2、A3、A4、A5是完全顯示在屏幕,A2、A6顯示部分,A1和A7不在顯示范圍內,假如現在是從下滑時的結果,在A1消失時…

網絡編程-tcp連接:服務器與客戶端

使用服務器和客戶端的代碼&#xff0c;實現服務器和客戶端的互相聊天功能 實現兩臺電腦之間互相聊天 方案一&#xff1a;服務器代碼&#xff08;server.c&#xff09;#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h>…

跨平臺移動開發技術深度分析:uni-app、React Native與Flutter的遷移成本、性能、場景與前景

1. 引言 跨平臺移動開發技術已成為提升開發效率、降低成本的戰略性選擇。uni-app、React Native&#xff08;RN&#xff09;和Flutter作為主流方案&#xff0c;在遷移成本、應用性能、適用場景及未來發展上呈現顯著差異。本報告基于最新行業數據與技術演進&#xff08;2025年&…

詳解低速容錯CAN(附與高速CAN對比表)

文章目錄前言一、低速容錯CAN-低速二、低速容錯CAN-容錯2.1 信號電平2.2 終端電阻2.3 容錯機制前言 在ISO 11898-3 Low-speed, fault-tolerant, medium-dependent interface部分描述了低速CAN的容錯行為及其物理層內容。既然稱為低速容錯CAN&#xff0c;主要需要搞清楚的兩個核…

維基框架發布 1.0.11 至中央倉,深化國產化 DevOps 生態整合

一、核心事件&#xff1a;維基框架 1.0.11 正式入駐中央倉庫? ?維基框架&#xff08;Wiki-Framework&#xff09;?? 作為國產全場景 Java 企業級開發框架&#xff0c;于 7 月 9 日正式發布 ?v1.0.11 版本? 至中央軟件倉庫&#xff08;Maven Central&#xff09;&#xf…

vscode 打開c++文件注釋亂碼

之前一直都主要用vscode編輯lua和python腳本語言&#xff0c;沒怎么編輯過c文件&#xff0c;今天想打開一個文件看一個東西&#xff0c;但是注釋全部亂碼了&#xff0c;我也知道是文件編碼的問題&#xff0c;但沒找到修改編碼格式的地方&#xff0c;好了廢話不多說&#xff0c;…

波動回升正當時!期權合成多頭:震蕩市攻守兼備利器

上周&#xff0c;A股喜提關鍵突破&#xff01;上證指數自21年初以來首次穩穩站上3500點大關&#xff0c;市場整體震蕩上行。尐程序&#xff1a;期權匯不過&#xff0c;熱鬧之下也藏有隱憂&#xff1a;雖然日均成交維持在1.4萬億加&#xff0c;但周五放量沖高&#xff08;成交達…

Python 基礎(十四): 錯誤和異常

目錄 1 錯誤2 異常 2.1 內置異常2.2 異常處理2.3 拋出異常2.4 自定義異常 程序中的錯誤我們通常稱為 bug &#xff0c;工作中我們不僅需要改自己程序中的 bug &#xff0c;還需要改別人程序中的 bug &#xff0c;新項目有 bug 要改&#xff0c;老項目也有 bug 要改&#xff…

OpenCV-Python Tutorial : A Candy from Official Main Page(三)

3.11傅立葉變換3.11.1Fourier Transform in OpenCV-cv.dft、cv.magnitude、cv.idft這兩個函數是圖像頻域處理&#xff08;如去噪、邊緣增強、紋理分析&#xff09;的基礎工具。1.cv.dft() —— 離散傅里葉變換功能&#xff1a; 將圖像從空間域&#xff08;像素強度&#xff09;…

移動端字體適配

一、移動端圖片適配1、使用 <img> 的 srcset<img src"logo.png"srcset"logo2x.png 2x,logo3x.png 3x"alt"Logo">優點&#xff1a;原生支持&#xff0c;瀏覽器自動選擇最合適的圖片。2、使用媒體查詢切換背景圖.logo {background-ima…

git起步

git官網&#xff1a;https://git-scm.com git使用手冊&#xff1a;https://git-scm.com/book/zh/v2 一、Git 是什么&#xff1f; 1、版本控制 版本控制是一種記錄一個或若干文件內容變化&#xff0c;以便將來查閱特定版本修訂情況的系統。我們經常是用的是保存軟件源代碼的…

SSL與HTTP概述

一、概念1.SSL概念SSL&#xff08;Secure Sockets Layer&#xff09;是一種網絡安全協議&#xff0c;用于在互聯網通信中建立加密鏈接&#xff0c;保護在網絡中傳輸的敏感數據免遭竊取或篡改。2.TLS概念雖然現在更先進的 TLS&#xff08;Transport Layer Security&#xff09; …

前端報錯:“Uncaught SyntaxError: missing ) after argument list

問題描述&#xff1a;前端報錯&#xff1a;“Uncaught SyntaxError: missing ) after argument list在 JavaScript 中遇到“SyntaxError: missing ) after argument list”這個錯誤通常意味著在函數調用或者聲明中&#xff0c;參數列表的括號沒有正確閉合。錯誤代碼&#xff1a…

廣州郵科光纖交換機的應用:網絡世界中的幕后核心

你知道嗎&#xff1f;在我們每天暢游互聯網&#xff0c;發送郵件、看視頻、打游戲時&#xff0c;背后支撐這一切流暢體驗的關鍵設備之一就是光纖交換機。它像一個幕后英雄&#xff0c;默默地確保信息傳輸高效、穩定。那么&#xff0c;究竟郵科光纖交換機有哪些不可或缺的應用領…

C++內存布局、構造函數規則和優化策略解析

一、類對象內存布局深度解析 1.1 核心內存占用規則 ?非靜態成員變量?&#xff1a;每個對象獨立存儲&#xff0c;按聲明順序排列&#xff08;含內存對齊填充&#xff09; 示例&#xff1a;class A{int x; char y;}; → 實際占用8字節&#xff08;413填充&#xff09;4?靜態…

Fastapi框架總覽與核心架構

Fastapi框架總覽與核心架構 FastAPI 是一個基于 Python 的現代 Web 框架&#xff0c;專注于 高性能、高并發 和 開發效率&#xff0c;特別適合構建 異步 API 服務、微服務接口&#xff0c;同時在大模型接口封裝中也廣泛應用。它基于 Starlette&#xff08;異步 Web 框架&#x…