(2021) 18 [代碼講解] 可執行文件

(2021) 18 [代碼講解] 可執行文件

南京大學操作系統課蔣炎巖老師網絡課程筆記。

視頻:https://www.bilibili.com/video/BV1HN41197Ko?p=18
講義:http://jyywiki.cn/OS/2021/slides/C8.slides#/

背景

回顧

程序 = 狀態機

  • 狀態機執行 = 狀態機上的路徑
  • 狀態機管理API:
    • fork - 復制
    • execve - 重置
    • exit - 終止

狀態機 = 可執行文件

一直以來 “最神秘” 的一種文件,雙擊即可打開,這時為什么?

本次課的內容與目標

理解靜態鏈接的可執行文件

  • 可執行文件的加載
  • xv6加載器

可執行文件的加載

小知識:可執行文件 不等同于 ELF文件

考慮腳本文件,它也是可執行文件:

#!/bin/bash -x
echo Hello
#!/usr/bin/env python3
print('Hello')
#!./a.out

為什么是/usr/bin/env

  • 因為 #! 需要絕對路徑 (背后是 execve)

  • Shebang 究竟發生了什么?

    • 不妨 strace 一下!

可以參考筆者的這篇博客:Linux中的二進制可執行文件和腳本可執行文件及Shebang。

進程(ELF)初始化

虛假的進程(ELF)初始化

execve(path, argc, envp):重置一個狀態機,為它傳入參數argvenvp,概念好理解,但究竟什么叫 傳入

我們知道程序(狀態機)的狀態無非就是保存在寄存器或者內存中(M,G),傳入參數肯定是傳到了內存的某個地方,但究竟是哪里呢?

一定要能靜下心來讀手冊,多嘗試去靜下心來去手冊,很快就能適應它了。 RTFM

在這里插入圖片描述

  • [System V ABI (x86-64)][http://jyywiki.cn/pages/OS/manuals/sysv-abi.pdf]

    Section 3.4: Process Initialization

    • 之前用 gdb 調試過 “初始狀態”
      • 看到了寄存器的初始值
    • 手冊完整規定了 execve 后的進程狀態
      • libc 會使用它
        • 根據 ABI,你可以開發自己的 libc !
  • Gitlab repo

挑戰:不使用 execve 加載 ELF

理論上把可執行文件 (ELF) 指定的數據搬運到內存,就可以實現二進制文件的加載。

試一試?loader.zip: 加載靜態鏈接的 ELF (glibc)

execve 本質上是 “多余” 的,只要我們能按照手冊,把可執行文件中的內容正確地搬運到內存中,就可以替換掉execve。

  • 可以用 mmap/munmap + 一小段 trampoline code 實現
  • 這個系統調用可以被庫函數 (和其他系統調用) “模擬”

模擬系統調用(1):互相模擬,互相傷害

既然完全可以 “自己加載” 可執行文件。我們也可以在一個操作系統里實現另一個操作系統的 API 啊,只要能夠在本系統內模擬另一個系統的系統調用就行。指令面前系統平等 (Linux, Windows, …)。

WSL (Windows Subsystem for Linux)

  • Windows 執行 ELF64; 在 Windows 中實現 Linux 系統調用

Wine (POSIX Subsystem for Windows 😂)

  • 支持 Windows PE (Portable Executable) 格式
  • 實現 Windows API (Overview)

模擬系統調用(2):把系統調用挪到用戶空間

操作系統可以只提供一組最基本的硬件層的抽象(如mmap)。其他的全都交給應用程序。

“微內核” (Microkernel)

  • 操作系統只提供非常有限的 API 和權限管理
    • 進程/線程創建和通信
    • 內存映射
    • 設備寄存器
  • 其他都實現在用戶程序
    • 例如內核里沒有文件系統
    • 想打開文件?發消息給服務器吧

“外核” (Exokernel)

  • 操作系統 = 庫函數
  • 一個硬件上可以跑多個 libOS

灌雞湯:《操作系統》這門課究竟學什么?

相比知識點本身,獲得知識的方法和對系統的掌控力更重要。

本課程想要帶給大家的:

狀態機視角

  • 程序 = 狀態機
  • 操作系統 = 狀態機的虛擬化

機器永遠是對的

  • 只要按照 spec 實現,就絕對能 work
    • 地址空間里的每一個地址都有解釋 (vdso, vvar, …)
    • CPU: 指令實現對了,仙劍就能跑、操作系統就能跑
    • System-V ABI: 實現對了,不用 execve 也可以加載可執行文件

xv6 加載器

  • TODO

總結

本次課內容與目標

  • 理解靜態鏈接的可執行文件
    • 可執行文件的加載
    • xv6 加載器

Take-away messages

  • RTFM; RTFSC
  • 紙面上的理解都是片面的

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

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

相關文章

如何學習計算機思維,劉康平:為什么我們每個人都應該學習計算思維?

不久前,微軟亞洲研究院資深學術合作經理劉康平應邀在“造就”做了演講,以下為演講節選,由“造就”授權轉載。劉康平 微軟亞洲研究院資深學術合作經理以中國象棋為例,在這樣一個棋局上,你怎么用最快的方式找到「將」和「…

鏈接與加載-NJU-JYY

(2021) 19 [代碼講解] 從零實現動態加載 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1N741177F5?p15 講義:http://jyywiki.cn/OS/2021/slides/C9.slides#/ 背景 回顧: ELF可執行文件 只要能完成…

計算機械功的公式,機械功率計算公式

初中物理公式物理量(單位) 公式 備注 公式的變形速度V(m/S) v S /t (S::路程; t::時間 )重力G(N) Gmg (m:質量;g:9.8N/kg或者10N/kg)密度ρ(kg/m3) ρ m:質量/V:體積 (m:…

饑荒聯機自建服務器有什么用,聯機版饑荒使用專用服務器的好處 | 手游網游頁游攻略大全...

發布時間:2016-02-15存檔保存位置是?很多玩家對此并不是很了解,不過別著急喲,下面99單機小編就為你帶來高玩分享的相關技巧心得攻略,希望大家能喜歡. 聯機版的存檔與單機版是不同的,由于聯機版饑荒建 ...標簽:游戲資訊 攻略秘籍發布時間:201…

(2021) 26 [持久化] 持久數據的可靠性:RAID和journaling

(2021) 26 [持久化] 持久數據的可靠性:RAID和journaling 南京大學操作系統課蔣炎巖老師網絡課程筆記。 視頻:https://www.bilibili.com/video/BV1HN41197Ko?p26 講義:http://jyywiki.cn/OS/2021/slides/16.slides#/ 背景 回顧 文件系統 …

計算機-p命令,OD(電腦命令)_百度百科

od 命令用途是以指定格式顯示文件。常見的文件為文本文件和二進制文件。此命令主要用來查看保存在二進制文件中的值。比如,程序可能輸出大量的數據記錄,每個數據是一個單精度浮點數。這些數據記錄存放在一個文件中,如果想查看下這個數據&…

Linux下編譯、鏈接、加載運行C++ OpenCV的兩種方式及常見問題的解決

Linux下編譯、鏈接、加載運行C OpenCV的兩種方式及常見問題的解決 在Linux下安裝完OpenCV C之后(還沒有安裝的讀者請參考Ubuntu 18.04 安裝OpenCV C),本文將探索Linux下編譯、鏈接C OpenCV的兩種方式,并且給出筆者在初次嘗試時遇…

win10無法檢驗服務器出示的ssl證書,win10系統網站啟用ssL安全證書的操作方法

win10系統網站啟用ssL安全證書的操作方法?很多win10用戶在使用電腦的時候,會發現win10系統網站啟用ssL安全證書的的現象,根據小編的調查并不是所有的朋友都知道win10系統網站啟用ssL安全證書的的問題怎么解決,不會的朋友也不用擔心&#xff…

Linux下構建自己的C++共享庫并配合pkg-config生成鏈接選項

Linux下構建自己的C共享庫并配合pkg-config生成鏈接選項 本文將以C鏈表的新建、打印操作為例構建自己的共享庫,并在實際調試代碼時嘗試使用。我們在做數據結構題時經常需要將鏈表打印出來看一下結果,但是并沒有一種庫函數可以讓我們直接調用來打印自己的…

webkitlineclamp css3,-webkit-line-clamp

無標題文檔static:對象遵循常規流。top,right,bottom,left等屬性不會被應用。 relative: 對象遵循常規流,并且參照自身在常規流中的位置通過top,right,bottom,left屬性進…

Linux內核初探

Linux內核初探 內核的組成部分 kernel:內核核心文件,一般為bzp_w_picpath,經過壓縮處理的鏡像文件;通常內核核心文件保存在/boot/目錄下,名稱為vmlinuz-version-release kernel object(ko):內核對象&…

Nplayer本地文件拷到服務器,手把手教你簡易NAS構建,手機/平板/智能電視隨意調取,家庭存儲云共享,有了自己的網絡云盤后再也不用擔心容量不夠了!...

之前嫌鍵盤俠煩,寫這些也沒意義所以把賬號注銷了文章刪除了,現在想了想我抗吧12級老蛆還噴不過這幫小兔崽子?換了skt.ruo穢土轉生,求噴子和我在各評論對線。特別是匿名dog見一個懟死一個。下面是之前號寫的內容原文 -#簡介NAS全稱…

gdb 入門

gdb 入門 簡介 gdb是GNU開源組織發布的一個強大的Linux下的程序調試工具。 一般來說,GDB主要幫助你完成下面四個方面的功能: 1、啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。 2、可讓被調試的程序在你所指定的調置的斷點…

視頻監控系統中的平臺服務器,【視頻監控主機 網絡視頻集中管理平臺服務器】 - 太平洋安防網...

完善的管理功能管理系統內所有設備的接入及設備權限。設備狀態監視。系統資源及用戶權限分配及系統搶權管理。電子地圖。實現系統內視頻流的管理和轉發控制。可通過WEB遠程管理。強大的報警事件管理功能系統具備完善的報警及處理功能,能根據預先編寫事件 處理預案對…

Linux下的CUDA多版本管理

Linux下的CUDA多版本管理 關于CUDA、cuDNN等的簡介和安裝可參考:顯卡、顯卡驅動、CUDA、CUDA Toolkit、cuDNN 梳理。 CUDA多版本 有時我們會在一臺機器上同時看到多個版本的CUDA,比如nvcc -V和nvidia-smi的輸出就可能會不同: 在我們實驗室…

電腦顯示無法連接sql服務器,他人的電腦為什么無法連接我電腦上的sql sever服務器...

如果SQL2005連接不上,并且服務器上所有與防火相關的東西都關閉了,還是連接不上。進行如下操作:一、為 SQL 啟用遠程連接1. 單擊“開始”,依次指向“程序”、“Microsoft SQL Server 2005”和“配置工具”,然后單擊“SQL Server 外…

ONNX初探

ONNX初探 轉載自:https://blog.csdn.net/just_sort/article/details/112912272 0x0. 背景 最近看了一些ONNX的資料,一個最大的感受就是這些資料太凌亂了。大多數都是在介紹ONNX模型轉換中碰到的坑點以及解決辦法。很少有文章可以系統的介紹ONNX的背景…

服務器修改地址,服務器修改管理地址

服務器修改管理地址 內容精選換一換在彈性云服務器上安裝完成后輸入公網IP,無法連接目的虛擬機,端口無法訪問工具。源端網絡未連通目的端。目的端安全組未開放8084端口。目的端網絡ACL禁用了8084端口。登錄源端服務器后,在源端服務器中ping 目…

ONNX再探

ONNX再探 本文轉自:https://blog.csdn.net/just_sort/article/details/113802330 這篇文章從多個角度探索了ONNX,從ONNX的導出到ONNX和Caffe的對比,以及使用ONNX遭遇的困難以及一些解決辦法,另外還介紹了ONNXRuntime以及如何基于…

圖像卷積及其計算(特征圖尺寸、參數量、計算量)

圖像卷積及其計算(特征圖尺寸、參數量、計算量) 卷積前后特征圖尺寸的計算 定義參數如下: 輸入特征圖尺寸: WWWWWW卷積核尺寸: FFFFFF步長: SSS填充的像素數:PPP 則有輸出特征圖尺寸為 NNNN…