《linux内核设计与实现-笔记1》

时间:2021-05-22 16:57:11

第 1 章 Linux 内核简介

linux是类unix系统,因此书籍一开头说明了unix的开发历程。unix强大的根本原因在于:

  1. unix很简洁,有明确设计目的,系统调用精简
  2. 所有东西都被当作文件对待
  3. unix内核和相关系统工具是c语言编写,具有良好的移植能力
  4. unix进程创建速度快,并且有fork系统调用
  5. unix有简单且稳定的进程间通信原语

至今,unix已经是一个支持抢占式多任务、多线程、虚拟内存、换页、动态链接和TCP/IP网络的现代化操作系统。

Linus Torvalds苦于不能随心所欲使用unix系统。借用unix的设计理念开发了自己的操作系统linux,使用了GPL证书作为限制条款,收到了众多用户的喜爱,不断的修改和完善至今。

操作系统的定义

指的在整个系统中负责最基础的功能和系统管理的那部分。包括内核、设备驱动程序、启动引导程序、shell或者其他种类的用户界面、基本的文件管理工具和系统工具。

操作系统的核心是内核。包括管理硬件设备、分配系统资源等。通常内核由

  1. 负责响应中断的中断服务程序
  2. 负责管理多个进程的调度程序
  3. 负责管理进程地址空间的内存管理程序
  4. 网络、进程间通信等系统服务

组成。内核独立于普通应用程序,系统态(内和态)。应用程序在用户空间执行,不直接访问硬件,用户态。

应用程序通过系统调用与内核通信。

应用程序执行系统调用:内核运行在进程上下文中。

中断—》 中断号—》中断服务程序(中断上下文,与所有进程无关,保证中断及时响应)

处理器一定处于下列三者之一:

《linux内核设计与实现-笔记1》

  1. 运行于用户空间,执行用户进程
  2. 运行于内核空间,处于进程上下文,代表某个特定的进程执行
  3. 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定中断。

即使处理器空闲,内核就运行空进程,处于进程上下文,但运行于内核空间。

linux内核与unix内核的比较

unix内核都是一个不可分割的静态可执行库。运行在单独的地址空间。需要硬件系统提供页机制(MMU)以管理内存。

单内核与微内核设计比较

单内核:把内核从整体上作为一个单独的大过程来实现,运行在单独的地址空间。因此通常以静态二进制文件的形式存在于磁盘中。所有内核服务都在这样一个大的地址空间中运行。内核之间的通信很简单,处于同一地址空间,直接调用函数就行。(大多数unix系统)

微内核:被划分成多个独立过程,每个过程叫做一个服务器。所有服务器保持独立并运行在各自的地址空间上。因此不能直接调用函数,而需要通过消息传递来通信。进程间通信(IPC)机制互通消息,互换服务。避免一个的失效影响另一个。模块化允许服务器换入换出。

微内核缺点:

IPC机制开销多于直接调用函数,涉及内核空间与用户空间的上下文切换,因此消息传递需要一定的周期。(因此大部分都将系统服务位于内核,消除频繁的上下文切换)

linux是一个单内核。也就是说linux内核运行在单独的内核地址空间。不过linux也吸取了微内核的精华:模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力了。

区别:

  1. linux支持动态加载内核模块
  2. linux支持对称多处理(SMP)机制
  3. linux内核可以抢占(preemptive)
  4. linux不区分线程和一般的进程
  5. linux提供面向对象的设备模型、热拔插事件

第 2 章 从内核出发

这一章主要介绍了内核源码获取、编译、以及配置安装的过程。内核开发需要注意的几点是:

  1. 无libc库或者标准头文件
  2. GNU C
  3. 没有内存保护机制(重要)
  4. 不要轻易使用浮点数
  5. 容积小而固定大小的栈(4kb/8kb)
  6. 同步和并发(包括抢占式、多处理器、中断是异步的)
  7. 可移植性(字节序、64位对齐、页面长度等)