MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么?做什么?

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎樣練成的?

user/_sleep 是什么?

book-riscv-rev3.pdf 3.8節有對Xv6 binary文件的格式描述

Xv6 binaries are formatted in the widely-used ELF format, defined in (kernel/elf.h). An ELF binary
consists of an ELF header, struct elfhdr (kernel/elf.h:6), followed by a sequence of program
section headers, struct proghdr (kernel/elf.h:25). Each progvhdr describes a section of the
application that must be loaded into memory; xv6 programs have two program section headers:
one for instructions and one for data.

  • 讓我們驗證一下他的文件格式
    riscv64-unknown-elf-readelf -h user/_sleep  
    ELF Header:                                 Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00          # ELF 文件的魔數,用于標識文件類型Class:                             ELF64                          # 64 位 ELF 文件Data:                              2's complement, little endian  # 使用 2 的補碼表示數字,小端序存儲Version:                           1 (current)                    # ELF 格式的當前版本OS/ABI:                            UNIX - System V                # 目標操作系統為 UNIX System VABI Version:                       0                              # ABI 版本號Type:                              EXEC (Executable file)         # 這是一個可執行文件Machine:                           RISC-V                         # 目標架構為 RISC-VVersion:                           0x1                            # ELF 文件版本Entry point address:               0x64                           # 程序入口點的虛擬地址Start of program headers:          64 (bytes into file)           # 程序頭表在文件中的偏移量Start of section headers:          31008 (bytes into file)        # 節頭表在文件中的偏移量Flags:                             0x5, RVC, double-float ABI     # 標志位:RISC-V 壓縮指令集,雙精度浮點數 ABISize of this header:               64 (bytes)                     # ELF 頭的大小Size of program headers:           56 (bytes)                     # 每個程序頭的大小Number of program headers:         4                              # 程序頭的數量Size of section headers:           64 (bytes)                     # 每個節頭的大小Number of section headers:         18                             # 節頭的數量Section header string table index: 17                             # 節頭字符串表的索引
    

我們知道,在Unix系統中,一個新進程的誕生是通過forkexec配合得來的,通過fork創建一個副本,然后通過exec將指定的binary加載進內存空間中并開始執行,教材中也對此有所講解,依然是book-riscv-rev3.pdf 3.8節,簡單看一眼

在這里插入圖片描述

  • 讓我們看看我們的 user/_sleep

    riscv64-unknown-elf-objdump -p user/_sleep user/_sleep:     file format elf64-littleriscvProgram Header:
    0x70000003 off    0x0000000000006af8 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0filesz 0x000000000000005a memsz 0x0000000000000000 flags r--
    LOAD off    0x0000000000001000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**12filesz 0x0000000000001000 memsz 0x0000000000001000 flags r-x
    LOAD off    0x0000000000002000 vaddr 0x0000000000001000 paddr 0x0000000000001000 align 2**12filesz 0x0000000000000000 memsz 0x0000000000000020 flags rw-
    STACK off    0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**4filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
    
  • 讓我們來看看AI是怎么解釋的
    在這里插入圖片描述

  • 當然我們的 user/_sleep 里面還有更多東西

    riscv64-unknown-elf-objdump -h user/_sleep  
    Sections:                                                                        
    Idx Name          Size      VMA               LMA               File off  Algn   # 列標題:索引、名稱、大小、虛擬地址、加載地址、文件偏移、對齊0 .text         0000082a  0000000000000000  0000000000000000  00001000  2**1   # 代碼段:包含可執行指令CONTENTS, ALLOC, LOAD, READONLY, CODE                           # 屬性:有內容、已分配、可加載、只讀、代碼1 .rodata       000007d0  0000000000000830  0000000000000830  00001830  2**3   # 只讀數據段:包含常量數據(如字符串常量)CONTENTS, ALLOC, LOAD, READONLY, DATA                           # 屬性:有內容、已分配、可加載、只讀、數據2 .data         00000000  0000000000001000  0000000000001000  00002000  2**0   # 數據段:包含已初始化的全局變量CONTENTS, ALLOC, LOAD, DATA                                      # 屬性:有內容、已分配、可加載、數據3 .bss          00000020  0000000000001000  0000000000001000  00002000  2**3   # BSS段:包含未初始化的全局變量ALLOC                                                           # 屬性:已分配4 .debug_info   00000ff8  0000000000000000  0000000000000000  00002000  2**0   # 調試信息段:包含DWARF調試信息CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據5 .debug_abbrev 00000643  0000000000000000  0000000000000000  00002ff8  2**0   # 調試縮寫表:DWARF調試信息的縮寫表CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據6 .debug_loc    00001f21  0000000000000000  0000000000000000  0000363b  2**0   # 調試位置信息:變量位置信息CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據7 .debug_aranges 000000f0  0000000000000000  0000000000000000  00005560  2**4  # 調試地址范圍:用于快速定位調試信息CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據8 .debug_line   000011ab  0000000000000000  0000000000000000  00005650  2**0   # 調試行號信息:源代碼行號映射CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據9 .debug_str    000002e4  0000000000000000  0000000000000000  000067fb  2**0   # 調試字符串表:調試信息中的字符串CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據
    10 .comment      00000019  0000000000000000  0000000000000000  00006adf  2**0   # 注釋段:包含編譯器版本等信息CONTENTS, READONLY                                              # 屬性:有內容、只讀
    11 .riscv.attributes 0000005a  0000000000000000  0000000000000000  00006af8  2**0 # RISC-V特定屬性段CONTENTS, READONLY                                              # 屬性:有內容、只讀
    12 .debug_frame  000004e0  0000000000000000  0000000000000000  00006b58  2**3   # 調試幀信息:用于棧回溯CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據
    13 .debug_ranges 00000050  0000000000000000  0000000000000000  00007038  2**0   # 調試范圍信息:用于描述變量范圍CONTENTS, READONLY, DEBUGGING, OCTETS                           # 屬性:有內容、只讀、調試用、字節數據
    

    我就不解釋了,這個東西給我一天也解釋不清楚,解釋不完全(是真的不清楚)

user/_sleep 做什么?

讓我們打開 user/sleep.asm 看一下匯編代碼

   0:	1141                	addi	sp,sp,-162:	e406                	sd	ra,8(sp)4:	e022                	sd	s0,0(sp)6:	0800                	addi	s0,sp,16if (argc != 2)8:	4789                	li	a5,2a:	02f50063          	beq	a0,a5,2a <main+0x2a>{fprintf(2, "Usage: sleep <seconds>\n");e:	00001597          	auipc	a1,0x112:	82258593          	addi	a1,a1,-2014 # 830 <malloc+0x100>16:	853e                	mv	a0,a518:	00000097          	auipc	ra,0x01c:	62e080e7          	jalr	1582(ra) # 646 <fprintf>exit(1);20:	4505                	li	a0,122:	00000097          	auipc	ra,0x026:	2fc080e7          	jalr	764(ra) # 31e <exit>}if (sleep(atoi(argv[1])) != 0)2a:	6588                	ld	a0,8(a1)2c:	00000097          	auipc	ra,0x030:	1ec080e7          	jalr	492(ra) # 218 <atoi>34:	00000097          	auipc	ra,0x038:	37a080e7          	jalr	890(ra) # 3ae <sleep>3c:	cd19                	beqz	a0,5a <main+0x5a>{fprintf(2, "sleep: failed to sleep\n");3e:	00001597          	auipc	a1,0x142:	80a58593          	addi	a1,a1,-2038 # 848 <malloc+0x118>46:	4509                	li	a0,248:	00000097          	auipc	ra,0x04c:	5fe080e7          	jalr	1534(ra) # 646 <fprintf>exit(1);50:	4505                	li	a0,152:	00000097          	auipc	ra,0x056:	2cc080e7          	jalr	716(ra) # 31e <exit>}exit(0);5a:	4501                	li	a0,05c:	00000097          	auipc	ra,0x060:	2c2080e7          	jalr	706(ra) # 31e <exit>

注意這一條指令

  38:	37a080e7          	jalr	890(ra) # 3ae <sleep>

這是一條跳轉指令,地址是 3ae,經過搜索可以看到 sleep 函數的匯編代碼

00000000000003ae <sleep>:                      # 函數入口點,地址為 0x3ae
.global sleep                                  # 聲明 sleep 為全局符號
sleep:                                         # 函數標簽li a7, SYS_sleep                              # 將系統調用號 13 (SYS_sleep) 加載到寄存器 a73ae:	48b5                li	a7,13          # 機器碼:48b5 表示 li a7,13ecall                                         # 執行系統調用指令3b0:	00000073          	ecall              # 機器碼:00000073 表示 ecallret                                           # 從函數返回3b4:	8082                ret                # 機器碼:8082 表示 ret

我們忽略其他各種分支判斷以及錯誤碼打印,exit調用等等, 可以看到sleep.c的核心就是在條件達成時,調用函數sleep,而 sleep函數內的實現就是利用 ecall 指令觸發系統調用,當系統調用完成后,函數返回。

瞎談

有大佬說過 Algorithms + Data Structures = Programs

那么從操作系統的角度來看,是不是 Data + SysCall = Programs 也是成立的?因為程序的一切的一切最終都是要把你想做的事情組織成一條條數據,通過系統調用的方式來達成目的?比如播放音樂、播放視頻、玩video game,畢竟系統調用應該是應用程序控制硬件資源的唯一途徑(吧?)。

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

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

相關文章

【AI科技】AMD ROCm 6.4 新功能:突破性推理、即插即用容器和模塊化部署,可在 AMD Instinct GPU 上實現可擴展 AI

AMD ROCm 6.4 新功能&#xff1a;突破性推理、即插即用容器和模塊化部署&#xff0c;可在 AMD Instinct GPU 上實現可擴展 AI 現代 AI 工作負載的規模和復雜性不斷增長&#xff0c;而人們對性能和部署便捷性的期望也日益提升。對于在 AMD Instinct? GPU 上構建 AI 和 HPC 未來…

【含文檔+PPT+源碼】基于微信小程序連鎖藥店商城

項目介紹 本課程演示的是一款基于微信小程序連鎖藥店商城&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該項目附帶的…

node.js模塊化步驟(各標準區別)CommonJS規范、AMD規范、UMD規范、ES Modules (ESM)

前后端建議統一使用ESM 文章目錄 Node.js模塊化發展歷程與標準對比一、模塊化的意義1.1 解決的核心問題1.2 沒有模塊化的問題 二、CommonJS規范2.1 核心特征2.2 實現示例 三、AMD (Asynchronous Module Definition)3.1 特點3.2 代碼示例 四、UMD (Universal Module Definition)…

人工智能與智能合約:如何用AI優化區塊鏈技術中的合約執行?

引言&#xff1a;科技融合的新風口 區塊鏈和人工智能&#xff0c;是當前最受矚目的兩大前沿技術。一個以去中心化、可溯源的機制重構信任體系&#xff0c;另一個以智能學習與決策能力重塑數據的價值。當這兩項技術相遇&#xff0c;會碰撞出什么樣的火花&#xff1f; 智能合約作…

RabbitMQ-api開發

前言 MQ就是接收并轉發消息 核心概念 admin是用戶 每個虛擬機上都有多個交換機 快速入門 引入依賴 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependen…

PostgreSQL Patroni集群組件作用介紹:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 簡介 1.1 核心作用 ? 主節點故障檢測 Watchdog 會定時檢測數據庫主節點&#xff08;或 Pgpool 主節點&#xff09;的運行狀態。 一旦主節點宕機&#xff0c;它會發起故障切換請求。 ? 協調主備切換 多個 Pgpool 節點時&#xff0c;Watchdog 保證只有一個 Pg…

【多種不同提交方式】通過springboot實現與前端網頁數據交互(非常簡潔快速)

【多種不同提交方式】通過springboot實現與前端網頁數據交互 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是springboot的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&am…

使用 AI 如何高效解析視頻內容?生成思維導圖或分時段概括總結

一、前言 AI 發展的如此迅速&#xff0c;有人想通過 AI 提效對視頻的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 視頻總結的功能&#xff0c;可以解析bilibili網站上部分視頻&#xff0c;如下圖所示&#xff1a; 但有的視頻解析時提示&#xff1a; 所以呢&#x…

鞅與停時 - 一種特別的概率論問題

討論一個有趣的概率問題&#xff1a; [P3334 ZJOI2013] 拋硬幣 - 洛谷 實際上是一個猴子打字問題&#xff0c;考慮一直無規律隨即打字的猴子&#xff0c;鍵盤上只有A-Z一共26個字母&#xff0c;對于一個特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何將數據輸出為tif

一、arcgis中轉換為tif 右鍵圖層&#xff1a; Data -> Export Data, 按照圖示進行選擇&#xff0c;選擇tiff格式導出即可&#xff0c;還可以選擇其他類型的格式&#xff0c;比如envi。 二、 ENVI中轉換為tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判斷一個exe是不是c#wpf開發的

在powershell下執行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路徑") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-華為機考第三題300分

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 城市緊急救援隊伍協同規劃 問題描述 智慧城市建設中,盧小姐負責設計一套緊急救援隊伍協同系統。城市被規劃為一個 n n n \times n

深入理解Redis SDS:高性能字符串的終極設計指南

&#x1f4cd; 文章提示 10分鐘掌握Redis核心字符串設計 | 從底層結構到源碼實現&#xff0c;揭秘SDS如何解決C字符串七大缺陷&#xff0c;通過20手繪圖示與可運行的C代碼案例&#xff0c;助你徹底理解二進制安全、自動擴容等核心機制&#xff0c;文末附實戰優化技巧&#xff…

jupyter notebook漢化教程

本章教程記錄&#xff0c;jupyter notebook漢化步驟&#xff0c;如果對漢化有需求的小伙伴可以看看。 一、安裝jupyter 如果你是安裝的anaconda的那么默認是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基礎python&#xff0c;默認是不包含的jupyter組件的&#x…

模擬設計中如何減小失配

Xx 芯片測試結果顯示&#xff0c;offset 指標偏高&#xff0c;不符合指標要求。所以查看了資料&#xff0c;溫習了減小的失配的方法。 注意點一&#xff1a; 將所有offet折算到輸入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;閾值電壓失配直接折算成輸…

C++ 與 Lua 聯合編程

在軟件開發的廣闊天地里&#xff0c;不同編程語言各有所長。C 以其卓越的性能、強大的功能和對硬件的直接操控能力&#xff0c;在系統開發、游戲引擎、服務器等底層領域占據重要地位&#xff0c;但c編寫的程序需要編譯&#xff0c;這往往是一個耗時操作&#xff0c;特別對于大型…

烤箱面包烘焙狀態圖詳解:從UML設計到PlantUML實現

題目&#xff1a;假設你正著手設計一個烤箱。建立一個跟蹤烤箱中面包狀態的狀態圖。要包括必要的觸發器事件、動作和監視條件。 一、狀態圖概述 狀態圖是UML&#xff08;統一建模語言&#xff09;中的一種行為圖&#xff0c;它用于描述系統中對象的狀態變化以及觸發這些變化的…

三款實用工具推薦:配音軟件+Windows暫停更新+音視頻下載!

各位打工人請注意&#xff01;今天李師傅掏出的三件套&#xff0c;都是經過實戰檢驗的效率放大器。先收藏再劃走&#xff0c;說不定哪天就能救命&#xff01; 一.祈風TTS-配音大師 做短視頻的朋友肯定深有體會——配個音比寫腳本還費勁&#xff01;要么付費買聲音&#xff0c…

物流無人機結構與載貨設計分析!

一、物流無人機的結構與載貨設計模塊運行方式 1.結構設計特點 垂直起降與固定翼結合&#xff1a;針對復雜地形&#xff08;如山區、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;與固定翼結合的復合布局&#xff0c;例如“天馬”H型無人機&am…

Decode rpc invocation failed: null -> DecodeableRpcInvocation

DecodeableRpcInvocation 異常情況解決方法 錯誤警告官方FAQ 異常情況 記錄一下Dubbo調用異常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…