《How Linux Works》 阅读笔记。
Big Picture
理解操作系统如何工作的关键是学会抽象,我们会将 Linux 系统抽象成不同的层:
内核和用户进程有不同的运行态:
- the kernel runs in kernel mode, and the user processes run in user mode.
- Code running in kernel mode has unrestricted access to the processor and main memory.
- User mode restricts access to a (usually quite small) subset of memory and safe CPU operations.
理解内存
- main memory is just a big storage area for a bunch of 0s and 1s.
- where the running kernel and processes reside
内核
- 管理进程,决定哪个进程可以使用 CPU
- Memory, 追踪、分配所有内存,如何多进程间共享内存
- 设备,提供硬件与软件的接口
- 系统调用和其他功能
管理进程
首先,进程是的运行是 “simultaneously” 的,同一时刻在一个CPU核心上,只能有一个进程可以使用 CPU,每个进程在 CPU 上运行一小段时间,内核需要管理不同进程在 CPU 上的切换。
切换意味着程序所在的环境(变量值、内存地址等)需要记录下来,当再次运行的时候,需要重新恢复,这是通过 CPU 的寄存器实现的。同时每一个进程自己也有许多种状态,如就绪态、运行态、阻塞态等,这些状态的切换也需要内核来实现,一个进程属于哪个状态,就需要将其放到该状态的队列中去。不过状态之间的切换,有时候可能是进程自己来请求的,方法是通过系统调用。
管理内存
- 内核在内存中,必须有一段常驻的区域,它是无法被用户进程访问的
- 每个用户进程需要有自己的内存区域与其他进程隔离
- 用户进程之间需要共享内存
- 用户进程的内存需要是只读的
- 系统可以通过将内存区域的数据放到磁盘,支持大于物理内存的数据放入内存中
管理设备与驱动
只有内核可以控制设备的访问,这是为了简化和抽象底层的硬件,防止用户进程直接访问硬件(比如直接关闭电源)。
系统调用
- system calls (or syscalls) perform specific tasks that a user process alone cannot do well or at all.
- Two system calls, fork() and exec(), are important to understanding how processes start:
- When a process calls
fork()
, the kernel creates a nearly identical copy of the process. - When a process calls
exec(program)
, the kernel loads and starts program, replacing the current process.
- When a process calls
- 系统调用的过程,可以参考看下图:
用户空间
- 内核分配给用户进程的,在内存中的空间称为用户空间。
- Most of the real action on a Linux system happens in user space.
用户
- 用户的定义:A user is an entity that can run processes and own files.
- 内核通过用户 ID 而不是用户名来管理用户。kernel does not manage the usernames; instead, it identifies users by simple numeric identifiers called user IDs.
- Linux 通过用户主要是来管理 permissions and boundaries,每个用户空间都属于某个用户,进程也一样,用户只能对自己的进程、空间、文件有权限。
- 现实 Linux 系统中会有一系列的用户,其中有一个 root 用户被称为超级用户,他可以访问其他用户的进程与空间
- 还有一个群组的概念,即一组用户
下一章请参考:基本命令与目录结构。