diff --git a/notes/pics/os-kernels.png b/notes/pics/os-kernels.png new file mode 100644 index 00000000..a350ac84 Binary files /dev/null and b/notes/pics/os-kernels.png differ diff --git a/notes/pics/os-syscall.png b/notes/pics/os-syscall.png new file mode 100644 index 00000000..324f5741 Binary files /dev/null and b/notes/pics/os-syscall.png differ diff --git a/notes/计算机操作系统 - 概述.md b/notes/计算机操作系统 - 概述.md index e58db1a6..168bd0c6 100644 --- a/notes/计算机操作系统 - 概述.md +++ b/notes/计算机操作系统 - 概述.md @@ -78,7 +78,7 @@ 如果一个进程在用户态需要使用内核态的功能,就进行系统调用从而陷入内核,由操作系统代为完成。 -

+

Linux 的系统调用主要有以下这些: @@ -107,7 +107,7 @@ Linux 的系统调用主要有以下这些: 因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。 -

+

## 中断分类 diff --git a/tools/diagram/src/os-kernels.svg b/tools/diagram/src/os-kernels.svg new file mode 100644 index 00000000..28df38a9 --- /dev/null +++ b/tools/diagram/src/os-kernels.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + 宏内核与微内核 + 宏内核(Linux) + + + 用户态 + 内核态 + + 应用程序 + + 文件系统 + + 设备驱动 + + 内存管理 + + 进程调度 + + 进程间通信 + + 硬件 + 微内核(Minix、QNX) + + + 用户态 + 内核态 + + 应用程序 + + 文件系统 + + 设备驱动 + + 内存管理 + + 进程调度 + + 进程间通信 + + 硬件 + 微内核把文件系统、驱动等移到用户态,通过消息与内核通信:一个驱动崩溃不会拖垮整个系统,但每次请求多了几次用户态和内核态的切换。 + diff --git a/tools/diagram/src/os-syscall.svg b/tools/diagram/src/os-syscall.svg new file mode 100644 index 00000000..fe27b007 --- /dev/null +++ b/tools/diagram/src/os-syscall.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + 系统调用:open() 从用户态进入内核态 + + + 用户态 + 内核态 + + + + + + fd = open("a.txt", O_RDONLY); + + C 库的 open 包装函数 + + + 系统调用表 + 按系统调用号查找 + + 内核的 open 实现 + + 系统调用号放进寄存器, + 执行陷入指令(x86-64 上是 syscall) + + + 返回文件描述符 + 进入内核时 CPU 切换到特权级,执行完再切回用户态。这一来一回比普通函数调用慢得多,所以频繁的小读写要用缓冲区合并。 +