Linux内核入门:简单认识Linux内核

1.宏内核和微内核

操作系统属于软件.负责管理系统的硬件资源,同时为应用程序开发和执行提供配套环境.

        1.1 操作系统的功能

依据定义,因此,操作系统必须具备如下两个大功能:               

1.为多用户和应用程序管理计算机上的硬件资源

2.为应用程序提供执行环境

        1.2 操作系统的特性

除功能外,操作系统还需具备如下特性:

1.并发性:操作系统必须具备执行多个线程的能力.

2.虚拟性:让每个线程都感觉有一个专门为其服务的处理器,而实际上处理器的数目往往只有几个.

操作系统内核的设计曾经分为两大阵容,宏内核与微内核.

宏内核: 将所有的内核代码都编译成一个二进制文件,所有的内核代码都在一个大内存地址空间里运行,内核代码可以直接访问和调用,效率高而且性能好

微内核: 把操作系统分成多个独立的功能模块,每个功能模块之间的访问需要通过消息来完成,因此效率没那么高,如:Minix, Windows.而内核保留操作系统最基本的功能,如进程调度,内存管理通信等模块.其他功能全部从内核部移除放到用户态中实现.

Linux在最初使用的是宏内核架构,宏内核的优点是设计简洁与性能比较好,而微内核架构的优势也很明显,如稳定性和实时性.微内核架构最大的问题就是高度模块化带来的交互的冗余和效率的损耗.Linux在这么多年的发展历程中,形成了自己的工程理念,并且不断融入了微内核的精华,如模块化设计,抢占式内核,动态加载内核模块等.

Linux内核支持动态加载模块.Linux内核中很多核心的实现或者设备驱动的实现都可以编译成一个个单独的模块.模块是被编译成的一个目标文件,并且可以在运行时的内核中动态加载和卸载.

和微内核实现的模块化不一样,它不是作为一个特殊模块来执行的,而是和静态编译的内核函数一样,运行在内核态中.模块的引入给Linux内核带来了不少优点,其中最大的优点就是很多内核的功能和设备驱动都可以编译成动态加载和卸载的模块,并且驱动开发者在编写内核模块时必须遵守定义好的接口来访问内核核心,这也使得开发一个内核模块变得容易很多.另一个优点就是,很多内核模块可以设计成和平台无关的,如文件系统等.相比微内核的模块,还有一个优点就是继承了宏内核的性能优势.

2.Linux内核概貌

Linux内核从当初的不到1万行代码发展到现在已经超过2000万行代码,对于如此庞大的项目,在学习前需要了解其整体的概貌,再度深入学习每个核心子模块.

一个典型的Linux系统可以分成三部分:

  • 硬件层:包括CPU,物理内存,主板,磁盘和相应的外设等.
  • 内核空间:包括Linux内核的核心部件,如arch抽象层,设备管理抽象层,内存管理,进程管理,总线设备,字符设备以及应用程序交互的系统调用层.
  • 用户空间:这里包括的内容很丰富,如C语言库,应用程序和虚拟机等.

重点关注内核空间层中的一些主要的部件.

        2.1 系统调用层

Linux内核把系统分为两个空间:用户空间和内核空间.CPU在这两个空间中都可以运行.一些体系结构的实现还有多种执行模式,如x86体系结构有ring0~ring3这4种不同的执行模式.但是Linux内核只使用了ring0和ring3这两种模式来实现内核态和用户态.

而负责内核态和用户态之间的切换的软件抽象层,叫作"系统调用".每个处理器体系结构设计中都提供了一些特殊的指令来实现内核态和用户态之间的切换.Linux内核充分利用了这种硬件提供的机制来实现系统调用层.

系统调用层最大的目的就是让用户进程看不到真实的硬件信息,如当一个用户需要读取一个文件的内容时,编写进程的程序员不需要知道这个文件具体存放在磁盘的哪个扇区里,只需调用open(),read(),或mmap()等函数即可.

一个用户进程大部分时间都运行在用户态,当需要向内核请求服务时,它会调用系统提供的接口进入内核态,如上面的open()函数.当内核完成了open()函数的调用后会返回用户态.

        2.2 处理器体系结构抽象层

Linux内核支持多种体系结构,如现在最流行的x86和ARM,也包括MIPS,powerpc等.而Linux最初的设计只支持x86体系结构,后来不断扩展,到现在已经支持几十种体系结构.

Linux内核为不同体系结构的实现做了很好的抽象和隔离,也提供了统一的接口来实现.如,在内存管理方面,Linux内核把体系结构相关部分的代码都存放在arch/xx/mm目录里,把和体系结构不相关的代码都存放在mm目录里,从而实现完好的分层.

        2.3 进程管理

进程是现代操作系统中非常重要的概念,包括上下文切换以及进程调度.

每个进程运行时都感觉完全占有了全部的硬件资源,但是进程不会长时间占有硬件资源.操作系统利用进程调度器让多个进程并发执行.

Linux内核没有严格区分进程和线程,而常用task_struct数据结构来描述.

进程管理还包括进程的创建和销毁,线程组管理,内核线程管理,队列等待等内容.

        2.4 内存管理

内存管理模块是Linux内核中最复杂的模块,它涉及了物理内存的管理和虚拟内存的管理.但是在一些小型的嵌入式RTOS中,内存管理不涉及虚拟内存的管理,比较简单和简洁.而Linux内核的虚拟内存管理非常重要.

虚拟内存有很多优点,如多个进程可以并发执行,进程请求的内存可以比物理内存大,多个进程可以共享函数库等,因此虚拟内存的管理也变得越来越复杂.

在Linux内核中,关于虚拟内存的模块有反向映射,页面回收,KSM,Mmap映射,缺页中断,共享内存,进程虚拟地址空间管理等.

而物理内存的管理也比较复杂.页面分配器是核心部件,它需要考虑当系统内存紧张时,如何回收页面和继续分配物理内存.其他比较重要的模块有交换分区管理,页面回收和OOM Killer等.

        2.5 中断管理

中断管理包含处理器的异常处理和中断处理.

异常通常是指处理器在执行指令时检测到一个反常条件,处理器就必须暂停下来处理这些特殊的情况,如常见的缺页异常.

中断异常一般是指外设通过中断信号线路来请求处理器,处理器会暂停当前正在做的事情来处理外设的请求.Linux内核在中断管理方面有上半部和下半部之分.上半部是在关闭中断的情况下执行的,因此处理的时间要求短,平,快;下半部是在开启中断的情况下执行的,很多对执行时间要求不高的操作可以放到下半部来执行.Linux内核为下半部提供了很多机制,如软中断,Tasklet和工作队列等.

        2.6 设备管理

设备管理对于任何的一个操作系统来说都是重中之重.

Linux内核的设备管理是一个很广泛的概念,包含的内容有很多,如ACPI,设备树,设备模型kobject,设备总线(如PCI总线),字符设备驱动,块设备驱动,网络设备驱动等.

        2.7 文件系统

一个优秀的操作系统必须包含优秀的文件系统,但是文件系统有不同的应用场合,如基于闪存的文件,系统F2FS,基于磁盘存储的文件系统ext4和XFS等.为了支持各种各样的文件系统,Linux抽象出了一个称为虚拟文件系统(VFS)层的软件层,这样Linux内核就可以很方便地集成多种文件系统.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值