NJU_OS_0x1
NJU OS 2024 南京大学《操作系统:设计与实现》
一些好词佳句
linux知识
echo $status
打印程序返回值- 可以通过管道将输出传递给
less命令
查看输出,同时,可以通过2>&1 |
将标准错误输出也输出到less - 可以通过
strace -f
可以记录系统调用和子进程,甚至可以追踪他自己! QEMU
, A fast and portable dynamic translatormake -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 |
|
我们可以通过设置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 内核提供的一种机制,用于将一组系统资源隔离到独立的命名空间中。通过命名空间,可以创建一种虚拟化的环境,每个环境都拥有自己独立的一组资源,包括进程、网络、文件系统、用户等,使得在同一系统上运行的进程能够共享系统的硬件资源,但彼此之间是隔离的。类似于虚拟化。
/proc/[pid]/ns
文件:这个文件夹包含了一个进程的命名空间相关的
符号链接
,主要用于隔离不同进程。通过读取这些符号链接,可以了解进程所在的各种命名空间,从而实现对命名空间的管理和隔离。/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