【写在前面】
网上资料梳理,侵删烦请联系。或有表达错误,欢迎指出纠正。
【参考引用】
网站:www.kerneltravel.net

Linux内核设计与实现

目标
整体把握内核各个核心子系统

内容
系统提供什么样的服务?
为什么要提供这样的服务?
如何实现的?

下一步
侧重了解内核:研究《Understanding the Linux Kernel》与源码本身;
侧重于实际编程,研读《Linux Device Drivers》

第1章-Linux内核简介

1.1-操作系统和内核简介

操作系统

整个系统中,负责完成最基本功能和系统管理的部分。
包括:内核、设备驱动程序、启动引导程序、命令行shell或其他种类的用户界面、基本的文件管理工具和系统工具。


系统

包含操作系统和运行在它之上的应用程序。

内核

组成:
①中断服务程序:响应中断;
②调度程序:管理多个进程分享处理器时间;
③内存管理程序:管理进程地址空间;
④系统服务程序:网络、进程间通信等。
内核独立于普通应用程序,一般处于系统态,有受保护的内存空间和访问硬件设备的所有权限。
内核空间:系统态和受保护的内存空间。
用户空间:执行应用程序。只能看到允许他们使用的部分系统资源,且只使用某些特定的系统功能,不能直接访问硬件和内核划给别人的内存范围。
内核运行时,系统以内核态进入内核空间执行;
普通用户程序执行时,系统以用户态进入用户空间执行。

系统调用

应用程序通过系统调用与内核通信。
应用程序调用库函数(如C库函数),再由库函数通过系统调用让内核代其完成各种任务。—应用程序完成其工作的基本行为方式。
一个应用程序执行一条系统调用:
应用程序通过系统调用在内核空间运行;内核运行于进程上下文中。

管理系统硬件设备(中断机制)

硬件设备与系统通信:
①硬件发出一个异步中断信号:打断处理器执行,继而打断内核执行;
②内核通过中断号查找对应的中断服务程序,通过调用该程序处理中断。

中断上下文

与所有进程无关的、专门执行中断的环境。
保证中断服务程序能够在第一时间响应和处理中断请求,然后快速退出。

应用程序、内核、硬件的关系

在这里插入图片描述

内核/处理器活动范围:
①运行于用户空间,执行用户进程;
②运行于内核空间,处于进程上下文,代表某个特定的进程执行;
③运行于内核空间,处于中断上下文,处理某个特定的中断。
CPU空闲时,内核运行一个空进程,处于进程上下文,运行于内核空间。

1.2-Linux内核和传统Unix内核的比较

单内核

内核整体上作为一个单独的大过程来实现,运行在一个单独的地址空间上。
内核通常以单个静态二进制文件存放于磁盘。
所有内核都运行在内核态,且身处同一地址空间,所以,内核可以直接调用函数。

微内核

内核功能被划分为多个独立过程,每个过程为1个服务器,服务器一般运行在用户空间。
所有服务器保持独立且运行在各自的地址空间,不能直接调用函数,通过“消息传递”处理微内核通信。
系统采用了进程间通信(IPC)机制,因此,各个服务器之间通过IPC机制互通消息。

第3章-进程管理

3.1-进程

3.1.1进程

正在执行的程序以及相关资源的总称。包括代码、内存地址空间、数据段等。
可能存在:两个或多个不同的进程执行的是同一个程序。
两个及以上并存的进程可以共享打开的文件、地址空间等资源。

进程在创建它的时刻开始存活。
①系统调用fork():通过复制现有进程(父进程)创建新进程(子进程)。
系统调用结束时,父进程恢复执行,子进程开始执行。
②创建新进程后,调用exec(),创建新的地址空间,并把新的程序载入其中。
③exit(),退出执行。终结进程并释放其占用资源。
④wait4(),父进程调用,查询子进程是否终结。使进程可以等待特定进程执行完毕。
进程退出执行后被设置为僵死状态,直到其父进程调用wait()为止。

3.1.3线程

进程中活动的对象。具备独立的程序计数器、进程栈和一组进程寄存器。

内核调度的对象是线程。

3.2-进程描述符及任务结构

3.2.5-进程上下文

进程中的代码执行
可执行程序代码从一个可执行文件载入到进程的地址空间执行。一般在用户空间。

陷入内核空间
当程序执行了系统调用,或触发了异常,即陷入内核空间。
此时,内核“代表进程执行”并处于进程上下文中。
一般内核退出时,程序恢复在用户空间会继续执行。

内核接口
系统调用和异常处理程序是对内核明确定义的接口。对内核的所有访问必须通过该接口。

3.2.6-进程家族树

所有进程都是PID为1的init进程的后代。
系统启动最后阶段,内核启动init进程。该进程读取系统的初始化脚本,并执行其他相关程序,最终完成系统启动的整个过程。
系统中每个进程必有一个父进程,拥有同一个父进程的所有进程被称为兄弟。

3.3-进程创建

  • fork()函数
    通过拷贝当前进程创建一个子进程。
    子进程与父进程的区别:
    ①PID:每个进程唯一;
    ②PPID:父进程的进程号,子进程将其设置为被拷贝进程的PID;
    ③某些资源和统计量。
  • exec()函数
    读取可执行文件并将其载入地址空间开始运行。

3.3.1-写时拷贝

写时拷贝
实现fork()的一种可以推迟或免除拷贝数据的技术。此时,内核不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。
数据只在需要写入时,才会被复制,使各个进程拥有各自的拷贝。在此之前,以只读方式共享。

3.3.2-fork()

3.4-线程在Linux中的实现

线程机制
提供了在同一程序内共享内存地址空间运行的一组线程。
Linux把线程视为一个与其他进程共享某些资源的进程。

3.5-进程终结

进程终结时,内核必须释放所占有的资源,并告知其父进程。

标签: Linux, 进程, 内核, 系统, 空间, 设计, 调用

相关文章推荐

添加新评论,含*的栏目为必填