NJU OS 2024 南京大学《操作系统:设计与实现》

一些好词佳句

  • Life is short, you need Python!

linux知识

  • echo $status 打印程序返回值
  • 可以通过管道将输出传递给less命令查看输出,同时,可以通过2>&1 |将标准错误输出也输出到less
  • 可以通过strace -f可以记录系统调用和子进程,甚至可以追踪他自己!
  • QEMU, A fast and portable dynamic translator
  • make -nB显示 Makefile 文件中指定的命令的执行情况
  • 可以通过mount挂载文件
  • gcc参数-Wl,--verbose可以详细展示编译过程,-I指定头文字路径
  • vim - 打开一个新的 Vim 编辑器实例,并将其标准输入设置为来自终端的输入,使用管道符号可以很方便编辑程序的输出。
  • sed 是一个流编辑器,用于对文本进行转换、筛选和编辑。
  • Generators/Coroutines在python的作用生成器和协程是python强大的工具
  • 可以使用强大的python配置gdb调试脚本,import gdb,import os引入gdb和标准库模块。
  • :%s/ /\r /g是在Vim编辑器中使用的替换命令,它的作用是将文本中的空格替换为一个换行符(\r),并在每个空格后面添加两个空格。

C语言

assert.h

简介

assert.h 是 C 标准库中的一个头文件,用于程序调试。它提供了一个名为 assert 的宏,可以用来检查程序运行时的状态,并在发现错误时终止程序。

用法

assert 宏接受一个表达式作为参数。如果表达式求值为非零,则宏不执行任何操作。如果表达式求值为零,则宏会打印一条错误信息,并调用 abort() 函数终止程序。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <assert.h>
int main()
{
int *p = NULL;
assert(p != NULL);
printf("程序不能到达此处");
return 0;
}

a.out: test.c:6: main: Assertion `p != NULL' failed.

我们可以通过设置NDEBUG来关闭assert宏以便提高性能。

_end

在C语言中,_end 通常是一个符号,代表程序数据段的结尾。它通常由编译器生成,并用于链接器将程序的所有部分链接在一起。

以下是 _end 的一些常见用法:

  • 标记数据段的结尾: 编译器通常会在数据段的末尾放置一个名为 _end 的符号。链接器会使用此符号来确定数据段的大小和位置。
  • 提供程序大小: 您可以使用 _end 符号来计算程序的大小。例如,您可以使用以下代码来计算程序的代码段大小:
1
size_t code_size = (size_t)_end - (size_t)&_start;
  • 用于调试: 在某些情况下,您可以使用 _end 符号来调试程序。例如,您可以使用它来检查数据段是否被正确初始化。

question:/proc内ns文件与status文件的区别

我们知道,在linux,万物皆文件,我们可以通过终端访问linux的一切software和hardware。

  • 符号链接的工作原理是将一个文件或目录的路径关联到另一个文件或目录上。当系统尝试访问符号链接时,实际上是通过符号链接所指向的路径来访问目标文件或目录。
  • 命名空间是 Linux 内核提供的一种机制,用于将一组系统资源隔离到独立的命名空间中。通过命名空间,可以创建一种虚拟化的环境,每个环境都拥有自己独立的一组资源,包括进程、网络、文件系统、用户等,使得在同一系统上运行的进程能够共享系统的硬件资源,但彼此之间是隔离的。类似于虚拟化。
  1. /proc/[pid]/ns 文件:

    这个文件夹包含了一个进程的命名空间相关的符号链接,主要用于隔离不同进程。通过读取这些符号链接,可以了解进程所在的各种命名空间,从而实现对命名空间的管理和隔离。

  2. /proc/[pid]/status 文件:

    这个文件提供了有关进程的详细信息,包括进程的状态、内存使用情况、线程数、进程ID等, 文件中的信息是由内核动态生成的,反映了进程的当前状态和资源使用情况。

不同视角的操作系统

Everything is State Machine 都是状态机

状态机是一种抽象的数学模型,用于描述有限个状态以及在这些状态之间的转移和动作等行为。

  • 状态: 状态是系统在某个时刻的具体情况。例如,交通信号灯有三个状态:红灯、黄灯和绿灯。
  • 转移: 转移是指系统从一个状态到另一个状态的变化。例如,交通信号灯由红灯变为绿灯是一个转移。
  • 动作: 动作是指在状态转移时发生的事件。例如,交通信号灯由红灯变为绿灯时,会发出通行的声音

应用视角的操作系统

操作系统的职责:提供令应用程序舒适的抽象 (对象 + API)

编译器优化“三板斧”

  • 函数内联:将函数调用替换为函数体本身的内容
  • 常量传播:在编译时计算常量表达式的值并替换
  • 死代码消除:删除永远不会被执行到的代码

不可优化代码

  • External function calls (链接时才能确定到底是什么代码)
    • 未知的代码可能包含系统调用
    • 因此不可删除、移出循环等,且要保证参数传递完全一致
  • 编译器提供的 “不可优化” 标注
    • volatile [load | store | inline assembly]

硬件视角的操作系统

  • firmware运行程序前的计算机系统配置
  • EFI 分区是一种特殊的磁盘分区,用于存储 系统引导相关的数据。GRUB是一个开源引导和加载程序(通常存储在硬盘的第一个扇区,即EFI分区),经过一系列操作将控制权转交给OS。

数学视角的操作系统

  • 一旦把操作系统、应用程序当做 “数学对象” 处理,那么我们图论、数理逻辑中的工具就能被应用于处理程序——例如,可以用图遍历 “暴力枚举” 的方法证明程序的正确性。

  • 证明程序正确:暴力枚举所有可能、写出证明

volatile

grep \”cs\” | sort | uniq