2-Linux内核区

本文大概介绍了Linux内核区的组成(上层系统调用接口,中层各种管理系统,下层各种驱动程序)。

内核区的组成

如上图,Linux系统内核区可以分为三个部分。

下层—驱动程序

Linux内核区下层主要由 各种硬件的驱动程序 构成,它们直接对接硬件,将硬件抽象为一个个文件,让上层可以通过操作文件来操作硬件。

中层—各种管理系统

Linux内核区中层由各种 管理系统 构成,这些是操作系统真正的核心,因为几乎任何程序都在频繁地使用它们:

  • 文件系统:打开文件、关闭文件等基本操作;实际上向屏幕输出也是在对文件进行操作,因为显示器在驱动程序那儿已经被抽象成文件了。
  • 内存管理:例如经常对堆内存进行申请/释放操作,这就离不开内存管理系统。
  • 进程管理:Linux系统以进程为最小执行单元,而进程是需要资源的,因此进程管理也很重要。
  • 网络服务:现代程序几乎都离不开网络,网络操作也是Linux系统编程的重中之重。

上层—系统调用接口

Linux内核区上层由 系统调用接口 组成,由于用户区和内核区分离,用户区不能直接操作内核区,但用户区又必须使用内核区的某些功能。

于是操作系统提供了系统调用接口,用户区可以通过调用系统调用接口来间接操作内核区。这样用户区既能使用内核区,也能保护内核区不被滥用。

DLC:为什么要手动释放内核区对象

一个对象可能存放的地方有三个:

  • 栈区:内存回收完全不需要自己考虑,函数执行完毕时栈内存会自动释放。
  • 堆区:动态申请的内存不会自动释放,由于栈区是堆区寻址的唯一方式(栈区存储指向堆区某内存的指针),可以给堆内存添加一个引用计数,当引用计数为0时释放堆内存。这也是智能指针的工作原理。
  • 内核区:内核区的对象无法自行判断释放时机,只能自己手动释放。

参考资料

  • Linux系统编程 - 飘零的落花
  • Linux基础课 - Acwing