(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.mzph.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…