Scott's Blog

学则不固, 知则不惑

0%

Linux 是如何工作的- Big Picture

《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.
  • 系统调用的过程,可以参考看下图:

用户空间

  • 内核分配给用户进程的,在内存中的空间称为用户空间。
  • Most of the real action on a Linux system happens in user space.
Example set of components fit together and interact on a Linux system

用户

  • 用户的定义: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 用户被称为超级用户,他可以访问其他用户的进程与空间
  • 还有一个群组的概念,即一组用户

下一章请参考:基本命令与目录结构。