《Linux内核设计与实现》 第一章 读书笔记 Linux内核简介
面试被怼了Linux内核,于是决定好好看一下这本书。作为经典书籍,Linux内核设计与实现是一本很重要的书籍。在大学本科的课程中已经学习过有关操作系统的内容,但只是比较粗略的学习。所以在这里看下《Linux内核设计与实现》,希望能对Linux内核有更加深入的理解。
第一章只是比较简单的介绍了Linux内核,包括它的历史,操作系统和内核简介,对比了Linux内核和传统Unix内核。并且介绍了Linux内核开发者社区。
操作系统和内核简介
内核是管理者或者是操作系统的核心,一个内核负责响应中断的中断服务程序,负责管理多个进程从而分享cpu的调度程序,负责管理进程地址空间和内存管理程序和网络,进程间通信等系统服务程序共同组成。内核一般处于系统态,拥有受保护的内存空间和访问硬件设备的权限,这种系统态和被保护起来的内存空间,统称为内核空间。用户空间只能使用某些特定的功能,不能直接访问硬件。当内核运行的时候,系统以内核态进入内核空间执行,而执行一个普通用户程序时,系统以用户态进入以用户空间执行。
系统的应用程序通过系统调用来与内核通信,程序调用库函数,再由库函数调用系统调用,让内核完成任务。1.复杂的函数中,调用内核的操作只是整个工作的一个步骤。2.有的函数,比如open()库函数,就只是调用了open()系统调用。3.有的库函数,strcpy(),不需要直接调用系统级的操作。
一个应用程序执行一条系统调用,应用程序被称为通过系统调用在内核空间运行,内核被称为运行于进程上下文中。应用程序通过系统调用界面陷入内核,是应用程序完成工作的基本行为方式。
内核负责管理硬件设备。硬件设备想要和系统通信,发出异中断信号,打断CPU的执行,进而打断内核的执行。中断通常对应一个中断号,内核通过这个中断号查找相应的中断服务程序,调用程序相应和处理中断。
Linux内核和传统Unix内核比较
单内核:整体上作为一个单独的大过程来实现,同时运行在一个单独的地址空间上。通常以单个静态二进制文件的形式存放在磁盘中,所有的内核服务都在这样一个大内核地址空间上运行。内核之间通信是微不足道的,内核可以直接调用函数,单模块简单性能高。
微内核:微内核的功能被划分成多个独立的过程,每个过程叫做一个服务器,只有强烈请求特权服务的服务器才运行在特权模式下,其它服务器都运行在用户空间。所有的服务器都保持独立运行在各自的地址空间上。通过消息传递处理内核通信,采用进程间通信IPC机制,各个服务器之间通过IPC机制互通消息。IPC的开销比函数调用大,会涉及内核空间于用户空间的上下文切换,所有实际应用的基于微内核系统大部分服务器位于内核,可以直接调用函数,消除频繁的上下文切换。Windows是微内核的实例。
Linux是单内核,内核运行在单独的内核地址空间上,Linux也有微内核的优点,模块化设计,抢占式内核,支持内核线程程以及动态装载内核模块的能力。Linux让所有事情运行在内核态,直接调用函数,无须消息传递。Linux是模块化的、多线程、内核本身可调度的操作系统。(此处面试官问过,Linux与Windows有关的问题)
Linux与Unix的差异:
- Linux支持动态加载内核模块,Linux虽然是单内核,但是允许在需要的时候动态加载部分内核代码。
- Linux支持对称多处理机制(SMP)
- Linux内核可以抢占,大多数Unix内核不支持抢占。
- Linux对线程支持:内核并不区分线程和其它的进程,所有的进程不过是其中的一些共享资源。
- Linux提供设备类面向对象的设备模型,热插拔时间,用户的设备文件系统(sysfs).