可执行程序 可执行文件:状态机的描述一个描述了状态机初始状态 + 迁移的数据结构 寄存器:大部分由ABI规定,操作系统负责设置。例如初始化pc。 地址空间:二进制文件+ABI共同决定。例如argv和envp的存储。 其他有用的信息(例如调试和core dump的信息) 可执行文件里面应该有什么?可执行程序描述了状态机重置后的状态,那状态有什么呢? 无非就是寄存器和内存(地址空间) 操作系统上的可执行 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
多处理器编程从入门到放弃 本讲内容:多处理器编程:从入门到放弃: 入门:多线程编程库 放弃:原子性、可见性、顺序 入门每个线程都有自己的堆栈,如何确定各自的堆栈大小? 1234567891011121314151617181920212223242526272829303132#include "thread.h"void * volatile low[64];void * volatile high 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
动态链接和加载(2) 动态链接与加载原理若干要素 编译成位置无关代码 对外部函数的调用是查表的 在运行(加载)的时候填表 我们就发明了GOT(Global Offset Table) 也就是table 有个有趣的问题1extern void foo(); 编译器遇到函数调用,应该翻译成哪种指令? 如果是同一个动态链接库 call foo (因为如果是一个库的,链接的时候相对地址已经确定下来了) 如 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
动态链接和加载(1) 本次课要回答的问题 可执行文件是如何被操作系统加载的 什么是动态链接/动态加载 静态ELF加载器:实现加载器 解析数据结构 + 复制到内存 + 跳转 创建进程运行时的初始状态(argv,envp,…) loader-static.c 可以加载任何静态链接的代码, minimal.S, dfs-fork.c 并可以正确处理参数/环境变量 env.c12345678910111 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
Linux世界中的应用程序(构建最小的Linux) Kernel 加载第一个进程 (init 应用程序) 相当于在操作系统中放置一个位于初始状态的状态机 包含一些进程可以操纵的操作系统对象 然后 Linux 变成一个中断(系统调用)处理程序 systemd为什么是进程树的根 (init 进程并不是 systemd) Linux Kernel 系统调用上的发行版和应用生态 系统工具 coreutils, binutils, systemd 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
代码风格和定制化gdb调试 本讲内容 编程中的一些细节 调试工具的正确使用方法 软件的热更新DSU代码实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include <stdio.h>#include <string.h>#i 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
Linux进程地址空间 Linux进程的地址空间有什么工具可以来查看进程的地址空间 pmap cat /proc/ [pid] / maps gdb readelf objdump 有的程序刚开始执行就结束了(比如打印一个东西就退出),如果要查看这个进程的地址空间。那怎么办? 使用gdb。使用gdb命令 info inferiors得到进程的pid 该命令打印gdb当前管理的inf 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
fork的应用 复习 fork状态机复制,包括持有的所有操作系统对象(如文件描述符) execve重置状态机,但继承持有的所有操作系统的对象 例如在fork之前打开一个管道, 然后就可以把一部分计算的输出管道给另外一个进程的输入 文件描述符1int open(const char *pathname, int flags); RTFM: O_CLOEXEC : execve时文件描述符不应该被继承; O_A 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
C标准库和实现 我们该如何学习 C 标准库? 直接调试 glibc (像我们上课那样) 寻找更好的替代品,一定有为嵌入式设备实现的简化 libc。 选择 muslmusl是一个轻量级的C标准库,它专注于提供高效、可靠和安全的C语言运行时环境。musl库的设计目标是遵循POSIX标准,同时保持代码的简洁和易于维护。它主要用于嵌入式系统、轻量级容器和其他类似的应用程序中,因为它比其他标准库更小、更快、更安全,并且不包 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统
应用视角的操作系统 本讲内容:指令序列和高级语言的状态机模型;回答以下问题: 什么是软件 (程序)? 如何在操作系统上构造最小/一般/图形界面应用程序? 什么是编译器?编译器把一段程序翻译成什么样的指令序列才算 “正确”? 构建一个最小的程序12345#include<stdio.h>int main(){ printf("Hello World\n") 2023-08-02 操作系统 > jyy操作系统 #jyy操作系统 #操作系统