• 第1章 Linux内核简介


    1.1 Unix的历史

    unix的优点

    • 简介,没有繁冗的系统调用
    • 所有东西都被当成了文件对待,对文件和对设备的操作是通过同样的系统调用的接口实现的
    • 内核和相关工具使用C编写,具有很高的可移至性
    • 创建新的进程非常迅速
    • 进程间的通信简单稳定

    1.2 追寻Linux足迹

      linux和unix并不一样,他并没有使用unix的源代码,只是使用unix的接口名称

    1.3 操作系统和内核简介

      内核是实现了一组核心系统功能的程序集合,如终端响应、进程管理、内存空间管理等,系统其余部分必须依赖内核来提供服务。

      其实内核说白了就是一些代码,当然整个计算机软件都是一些代码,内核和普通的软件代码不同之处在于在提供保护机制的计算机系统里,内核代码拥有更高的权限。当系统执行内核代码的时候,系统处于内核态。内核代码拥有访问受保护内存空间和访问硬件的权力,这种系统态和被保护的内存空间被称为系统空间。当系统执行普通代码的时候,系统处于用户态,只能访问有限的内存空间,这些有限的内存空间被称为用户空间。

      我们平时写代码的时候也需要和硬件打交道,比如print函数向屏幕上输出helloworld。但是普通程序是不具备访问硬件的权限的,所以他必须要通过某种方式来让请求内核来实现访问硬件的功能。学究一点的说法就是“应用程序通过系统调用来和内核进行通信”。其实应用程序并非直接和系统调用打交道,比如C语言是先调用库函数然后再由库函数去执行系统调用。库函数封装了一些系统调用不具有的新功能,比如printf打印字符串的功能是通过write系统调用来实现的,printf函数也支持格式化字符串,所以printf函数在系统调用之前先会完成格式化字符串的功能,把格式化之后的字符串作为参数传给write这个系统调用。也有一些简单的库函数直接进行系统调用,比如open。

      用学究的可以在面试官面前装逼的语言总结一下上述过程:应用程序通过系统调用而陷入内核,当一个应用程序在执行一条系统调用的时候,内核在代其执行,应用程序通过系统调用在内核空间运行。

      内核还要负责硬件和系统之间的通信。硬件和系统的通信是通过中断来实现的,以键盘敲击为例,当敲击键盘输入某个字符的时候,键盘发出一个中断,每一个中断都有自己的一个中断号。内核收到中断请求,根据中断里的中断号去查询相应的中断服务程序去响应中断。比如服务键盘输入的中断会读取输入缓冲区里的字符,并通知键盘可以继续输入了。中断服务程序在一个与进程无关的、专门的中断上下文里运行,这样做是为了提高中断响应速度。

      中断是可以屏蔽的,对于某个处理器,它可以屏蔽所有中断也可以选择屏蔽某个中断号的中断。在后面的同步相关章节会设计到。

      所有综上所有情况,一个处理器一定是处在下述三种运行状态之下

    • 用户空间,执行用户进程
    • 内核空间,处于进程上下文,此时是在处理进程的系统调用请求
    • 内核空间,处于中断上下文,处理中断

    1.4 Linux内核和传统Unix内核的比较

      内核的设计分为两大阵营:单内核和微内核。

      大多数unix采用的是单内核,即unix内核是一个不可分割的静态可执行库,它以一个巨大的二进制文件的格式存在于磁盘中,所谓不可分割意味着整个内核要么全部被加载要么都不被加载,不存在某一功能模块被加载而另一些功能模块代码没有被加载的情况。整个内核同时被加载意味着他们运行在同一个地址空间中,所以内核间不同的模块不存在通信的问题,可以以函数调用的方式调用不同模块的代码。

      与单内核相反,微内核把不同的功能划分成不同的模块,不同的模块运行在不同的地址空间里。一个比较特殊的地方是,作为内核的一些功能模块居然运行在非特权模式下运行,只有少量的具有“强烈请求特权”的功能模块运行在特权模式。因此模块直接的相互调用需要通过某种方式通信,这就产生了进程间通信(IPC)机制,这种通信会带来比单内核之间函数调用更大的代价,而且不同的模式之间的切换设计到内核空间和用户空间的上下文切换。

      实际中那些号称微内核的操作系统,比如WindowsNT和MacOSX都是让微内核的所有功能模块运行在内核空间,这是违背了设计初衷的。我们的linux是单内核的,但是他也吸收了微内核的一些精华,比如可以在需要的时候动态的卸载和加载部分内核代码。

  • 相关阅读:
    【Java】组合 继承 代理
    《Thinking In Java》笔记之十三章 字符串
    常用Dos命令
    Thinking in Java异常笔记与习题
    php去重 逗号分隔的字符串
    php 连接本地数据库
    vue重载子组件
    小程序更改checked样式
    JavaScript中两个数组的拼接
    FROM_UNIXTIME()时间戳转换函数
  • 原文地址:https://www.cnblogs.com/AshOfTime/p/10256517.html
Copyright © 2020-2023  润新知