一文详解Linux内核基本概念
扫描二维码
随时随地手机看文章
Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux 内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。
Linux内核是操作系统的核心组件,作为开源软件由Linus Torvalds于1991年创建,负责管理硬件资源并为应用程序提供基础服务。
Linux内核的定义与起源
Linux内核是计算机操作系统最底层的核心程序,采用C语言编写并遵循POSIX标准,具备类Unix特性。它由芬兰程序员Linus Torvalds在1991年首次发布,并依托全球开发者社区协作维护,成为开源软件领域的典范。
核心功能特性
Linux内核通过以下机制实现硬件与软件的协同工作:
进程管理:采用层次化进程结构,通过调度算法分配CPU时间片,支持多任务并发执行。
内存管理:提供虚拟内存机制,实现进程间内存隔离与共享,优化物理内存使用效率。
设备驱动:抽象硬件操作细节,支持超过80%的常见硬件设备的即插即用。
文件系统:基于虚拟文件系统(VFS)架构,兼容ext4、XFS等数十种文件格式。
网络协议栈:内置TCP/IP协议族,支撑互联网通信基础功能。
Linux 内核(英语:Linux kernel),是 Linux 操作系统的内核,以 C 语言写成,符合 POSIX 标准,以 GNU 通用公共许可证发布。Linux 最早是由芬兰黑客林纳斯·托瓦兹为尝试在英特尔 x86 架构上提供自由免费的类 Unix 系统而开发的。该计划开始于 1991 年,林纳斯·托瓦兹当时在 Usenet 新闻组 comp.os.minix 登载帖子,这份著名的帖子标示着 Linux 计划的正式开始。
在计划的早期有一些 Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。
技术上说 Linux 是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于 Linux 内核的完整操作系统叫作 Linux 操作系统,或是 GNU/Linux。
Linux 内核是在 GNU 通用公共许可证第 2 版之下发布的(加上一些非自由固件、blob 与各种非自由许可证)。
贡献者遍布世界各地,日常开发在 Linux 内核邮件列表。
源代码
一般情况下 Linux 内核源代码位于 /usr/src/linux 目录下。
/include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。/init 子目录包含了内核的初始化代码,这是内核工作的开始的起点。/arch 子目录包含了所有硬件结构特定的内核代码。如:i386,alpha/drivers 子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。/fs 子目录包含了所有的文件系统的代码。如:ext2,vfat等。/net 子目录包含了内核的连网代码。/mm 子目录包含了所有内存管理代码。/ipc 子目录包含了进程间通信代码。/kernel 子目录包含了主内核代码。内核程序
编译完成新内核后,会生成几个文件,这些文件是内核启动所需要的,这里简单介绍一下。
vmlinux,编译出来的最原始的内核文件,没有压缩,位于源码根目录下。该内核文件不能用来启动系统。
vmlinuz,这个就是我们要引导的内核,它一般是一个链接文件,位于根目录下。真正的文件位于/boot 文件夹下。z 表示压缩的内核,vm 表示 virtual memory 的意思。linux 支持虚拟内存,可利用硬盘空间作为虚拟内存使用。在编译内核时,通过 make zImage 或 make bzImage 生成 zImage 或 bzImage 原始压缩内核文件,这些内核文件位于 /usr/src/linux-2.6.23.9/arch/i386/boot 目录下;接着我们会把它拷贝到 /boot 目录下并改名为 vmlinuz;最后在根目录下创建一个到该文件的同名链接文件。bzImage 表示 big zImage 的意思,zImage 是老式的内核文件格式,在新的内核版本中已不使用了,现在生成的内核是 bzImage 格式的内核文件。这两种内核文件的区别是,zImage 解压缩内核到低端内存中(第一个640K),bzImage 解压缩内核到高端内存中(1M以上)
这两个内核文件都是使用 gzip 软件压缩的,但文件头部内嵌有 gzip 解压缩代码,能在启动时自动解压缩内核。使用 gzip 是不能正常解压内核的。
在源码根目录生成的 vmlinux 是一个没有压缩的内核文件。
如果在 /boot 目录下存在多个版本的内核文件,则可用 vmlinuz-xxxx 的方式命名。但根目录下的 vmlinuz 链接文件名一般不变。
initrd-x.x.x.img,initrd 是"initial ramdisk"的简写。作用是在内核引导前加载相应的硬件模块,为内核引导做准备。比如,使用的是 scsi 硬盘,而内核 vmlinuz 中并没有这个 scsi 硬件的驱动,那么在装入 scsi 模块之前,内核不能加载根文件系统,但 scsi 模块存储在根文件系统的/lib/modules 下。为了解决这个问题,可以引导一个能够读实际内核的 initrd 内核并用 initrd 修正 scsi 引导问题。initrd 可使用 mkinitrd 工具创建。
System.map,内核符号映射文件,位于/boot 目录下,与内核名要对应。内核编译完成后,在源码根目录下就会生成一个 System.map 文件。我们要把它拷贝到/boot 目录下并改成相关的名称。如内核名为 vmlinuz-2.6.23.9,则这个内核符号映射文件就应该命名为 System.map-2.6.23.9。
运行空间
Linux 系统由用户空间和内核空间两部分组成。
内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。
用户空间分为:
User Applications(用户应用程序)GNU C Library (glibc 即 c 运行库)内核空间分为:
System Call Interface(系统调用接口)Kernel(内核)Architecture Dependent Kernel Code(架构体系内核代码)子系统
Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。
进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。
内存管理(MM):允许多个进程安全的共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时,操作系统负责在磁盘和内存间交换程序块。内存管理从逻辑上分为硬件无关部分和硬件有关部分。硬件无关部分提供了进程的映射和逻辑内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
虚拟文件系统(VFS):隐藏了各种硬件的具体细节,为所有的设备提供了统一的接口,VFS提供了多达数十种不同的文件系统。虚拟文件系统可以分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如 ext2,fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
网络接口(NET):提供了对各种网络标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序。网络协议部分负责实现每一种可能的网络传输协议。网络设备驱动程序负责与硬件设备通讯,每一种可能的硬件设备都有相应的设备驱动程序。
进程间通讯(IPC):支持进程间各种通信机制。处于中心位置的进程调度,所有其它的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功成功地完成消息的发送,当消息被成功的发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统以相似的理由依赖于进程调度。
架构设计特点
Linux采用单内核(Monolithic Kernel)架构设计,具有以下技术优势:
所有核心服务运行在内核空间,避免频繁上下文切换带来的性能损耗。
通过模块化设计实现动态加载驱动和功能扩展,平衡性能与灵活性。
支持从嵌入式设备到超级计算机的跨平台运行,涵盖ARM、x86等多种指令集架构。