首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux内核及源码简介

Linux内核及源码简介

原创
作者头像
god-frey
修改于 2021-10-26 01:59:45
修改于 2021-10-26 01:59:45
2.6K0
举报
文章被收录于专栏:Linux内核源码Linux内核源码

Linux内核及源码学习使用陈莉君老师的书《深入分析Linux内核源代码》,内核源码版本为2.4.16。

1. Linux 内核在整个操作系统中的位置

Linux 的内核不是孤立的,必须把它放在整个系统中去研究,如图 1.1 所示,显示了 Linux内核在整个操作系统的位置。

 图1.1 Linux内核在整个操作系统的位置
图1.1 Linux内核在整个操作系统的位置

由图 1.1 可以看出,Linux 操作系统由 4 个部分组成。

1)用户进程

用户应用程序是运行在 Linux 操作系统最高层的一个庞大的软件集合。当一个用户程序在操作系统之上运行时,它成为操作系统中的一个进程。

2)系统调用接口

在应用程序中,可通过系统调用来调用操作系统内核中特定的过程,以实现特定的服务。例如,在程序中安排一条创建进程的系统调用,则操作系统内核便会为之创建一个新进程。

系统调用本身也是由若干条指令构成的过程。但它与一般的过程不同,主要区别是:系统调用是运行在内核态(或叫系统态),而一般过程是运行在用户态。在 Linux 中,系统调用是内核代码的一部分。

3)Linux 内核

内核是操作系统的灵魂,它负责管理磁盘上的文件、内存,负责启动并运行程序,负责从网络上接收和发送数据包等。简言之,内核实际是抽象的资源操作到具体硬件操作细节之间的接口。

4)硬件

这个子系统包括了 Linux 安装时需要的所有可能的物理设备。例如,CPU、 内存、硬盘、网络硬件等。

2. Linux 内核的抽象结构

Linux 内核由 5 个主要的子系统组成,如图 1.2 所示。

图1.2 Linux 内核子系统及其之间的关系
图1.2 Linux 内核子系统及其之间的关系

(1)进程调度(SCHED)控制着进程对 CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。

(2)内存管理(MM)允许多个进程安全地共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。

(3)虚拟文件系统(Virtul File System,VFS)隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS 还支持多达数十种不同的文件系统,这也是 Linux 较有特色的一部分。

虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如 ext2,fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。

(4)网络接口(NET)提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。

(5)进程间通信(IPC) 支持进程间各种通信机制。从图 1.2 所示可以看出,处于中心位置的是进程调度,所有其他的子系统都依赖于它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统(内存管理,虚拟文件系统及进程间通信)以相似的理由依赖于进程调度。

各个子系统之间的依赖关系如下。

• 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将程序和数据装入内存。

• 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有内存,还可存取共同的内存区域。

• 虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持 RAMDISK 设备。

• 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

除了如图 1.2 所示的依赖关系以外,内核中的所有子系统还要依赖一些共同的资源,但在图中并没有显示出来。这些资源包括所有子系统都用到的过程,例如分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等。

3. Linux 内核源代码的结构

Linux 内核源代码位于/usr/src/linux 目录下,其结构分布如图 1.3 所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。

include/目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。

init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。

arch/子目录包含了所有硬件结构特定的内核代码,如图 1.3 所示,arch/子目录下有 i386和 alpha 模块等。

drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等。

fs/ 目录包含了所有文件系统的代码,如:ext2,vfat 模块的代码等。

net/ 目录包含了内核的连网代码。

mm/ 目录包含了所有的内存管理代码。

ipc/ 目录包含了进程间通信的代码。

kernel/ 目录包含了主内核代码。

图 1.3 显示了 8 个目录,即 init、kernel、mm、ipc、drivers、fs、arch 及 net 的包含文件都在“include/”目录下。在 Linux 内核中包含了 drivers、fs、arch 及 net 模块,这就使得 Linux 内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。

在图 1.3 中所示的模块结构,代表了一种工作分配单元。利用这种结构,我们期望 LinusTorvalds 能维护和增强内核的核心服务,即 init/、kernel/、mm/及 ipc/,其他的模块 drivers、fs、arch 及 net 也可以作为工作单元,例如,可以分配一组人对块文件系统进行维护和进一步地开发,而另一组人对 scsi 文件系统进行完善。图 1.3 所示类似于 Linux 的自愿者开发队伍一起工作来增强和扩展整个系统的框架。

图 1.3 Linux 源代码的分布结构
图 1.3 Linux 源代码的分布结构

4. 从何处开始阅读源代码

像 Linux 内核这样庞大而复杂的程序看起来确实让人望而生畏,它像一个很大的球,没有起点和终点。在读源代码的过程中,你会遇到这样的情况,当读到内核的某一部分时又会涉及到其他更多的文件,当返回到原来的地方想继续往下读时,又忘了原来读的内容。在Internet 上,很多人为此付出了很大的努力,制作出了源代码导航器,这为源代码阅读提供了很好的条件,下载站点为http://lxr.linux.no/source。下面给出阅读源代码的一些线索。

1.系统的启动和初始化

在基于 Intel 的系统上,当 loadlin.exe 或 LILO 把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看 arch/i386/kernel/head.S ,head.S 进行特定结构的设置,然后跳转到 init/main.c 的 main()例程。

2.内存管理

内存管理的代码主要在/mm,但特定结构的代码在 arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在 mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在 mm/swap_state.c 和 mm/swapfile.c 中实现。

3.内核

内核中,特定结构的代码在 arch/*/kernel,调度程序在 kernel/sched.c,fork 的代码在 kernel/fork.c,task_struct 数据结构在 include/linux/sched.h 中。

4.PCI

PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在 include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码,Intel 的在 arch/alpha/kernel/bios32.c。

5.进程间通信

所 有 System V IPC 对 象 权 限 都 包 含 在 ipc_perm 数 据 结 构 中 , 这 可 以 在include/linux/ipc.h 中找到 System V 消息是在 ipc/msg.c 中实现, 共享内存在 ipc/shm.c中,信号量在 ipc/sem.c 中,管道在 ipc/pipe.c 中实现。

6.中断处理

内 核 的 中 断 处 理 代 码 是 几 乎 所 有 的 微 处 理 器 所 特 有 的 。 中 断 处 理 代 码 在arch/i386/kernel/irq.c 中,其定义在 include/asm-i386/irq.h 中。

7.设备驱动程序

Linux 内核源代码的很多行是设备驱动程序。Linux 设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:

/block

块设备驱动程序如 ide(在 ide.c)。如果想看包含文件系统的所有设备是如何被初始化的,应当看 drivers/block/genhd.c 中的 device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装 nfs 文件系统时,它也初始化网络。块设备包含了基于 IDE 和 SCSI的设备。

/char

这是看字符设备(如 tty,串口及鼠标等)驱动程序的地方。

/cdrom

Linux 的所有 CDROM 代码都在这里,如在这儿可以找到 Soundblaster CDROM 的驱动程序。注意 ide CD 的驱动程序是 ide-cd.c,放在 drivers/block;SCSI CD 的驱动程序是 scsi.c,放在 drivers/scsi。

/pci

这是 PCI 伪驱动程序的源代码,在这里可以看到 PCI 子系统是如何被映射和初始化的。

/scsi

在这里可以找到所有的 SCSI 代码及 Linux 所支持的 scsi 设备的所有设备驱动程序。

/net

在这里可以找到网络设备驱动程序,如 DECChip 21040 PCI 以太网驱动程序在 tulip.c中。

/sound

这是所有声卡驱动程序的所在地。

8.文件系统

EXT2 文 件 系 统 的 源 代 码 全 部 在 fs/ext2/ 目 录 下 , 而 其 数 据 结 构 的 定 义 在include/linux/ ext2_fs.h,ext2_fs_i.h 及 ext2_fs_sb.h 中。虚拟文件系统的数据结构在include/linux/fs.h 中描述,而代码是在 fs/*中。缓冲区高速缓存与更新内核的守护进程的实现是在 fs/buffer.c 中。

9.网络

网络代码保存在/net 中,大部分的 include 文件在 include/net 下,BSD 套节口代码在net/socket.c 中,IP 第 4 版本的套节口代码在 net/ipv4/af_inet.c。一般的协议支持代码(包括 sk_buff 处理例程)在 net/core 下,TCP/IP 联网代码在 net/ipv4 下,网络设备驱动程序在/drivers/net 下。

10.模块

内核模块的代码部分在内核中,部分在模块包中,前者全部在 kernel/modules.c 中,而 数 据 结 构 和 内 核 守 护 进 程 kerneld 的 信 息 分 别 在 include/linux/module.h 和include/linux/kerneld.h 中。如果想看 ELF 目标文件的结构,它位于 include/linux/elf.h中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LINUX内核
6.音频:音频体系结构ALSA.支持USB音频和MIDI设备,并支持全双工重放功能。
心跳包
2020/08/28
16K0
linux内核编程指南_UNIX/LINUX
arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经支持30种左右的体系结构。在arch目录下,存放的是各个平台以及各个平台的芯片对Linux内核进程调度、内存管理、中断等的支持,以及每个具体的SoC和电路板的板级支持代码。
全栈程序员站长
2022/09/30
2.2K0
linux内核编程指南_UNIX/LINUX
linux内核编程_linux内核是什么
进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)
全栈程序员站长
2022/11/08
21.6K0
探究Linux Kernel内核架构,让你成为真正的内核专家
本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。
嵌入式Linux内核
2023/08/08
1.2K0
探究Linux Kernel内核架构,让你成为真正的内核专家
为什么要阅读Linux内核源码以及如何阅读Linux内核源码
第一种方法纵向或者横向来读都可以,因为代码量不是很大。《linux内核完全剖析》《linux内核完全注释》是引导你横向阅读的书,《linux内核设计的艺术》是引导你纵向阅读的书。建议横向纵向结合着来,纵向跟着bochs调试工具来是必不可少的,当遇到问题时进入到相应的功能模块横向拓展一下。
Jasonangel
2021/05/28
5.1K0
深度:一文看懂Linux内核!Linux内核架构和工作原理详解
Linux内核的作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。
混说Linux
2022/11/18
3.3K0
深度:一文看懂Linux内核!Linux内核架构和工作原理详解
Linux内核的整体架构
本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。
全栈程序员站长
2022/09/15
1K0
一文让你深度了解Linux内核架构和工作原理
1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
嵌入式Linux内核
2022/10/25
1K0
一文让你深度了解Linux内核架构和工作原理
好多网友都不知道怎么阅读Linux内核源码,这篇让你快速理解
Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。
嵌入式Linux内核
2022/10/22
5.5K0
好多网友都不知道怎么阅读Linux内核源码,这篇让你快速理解
深入理解Linux Kernel内核整体架构(图文详解)
本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。
嵌入式Linux内核
2022/09/24
3K0
深入理解Linux Kernel内核整体架构(图文详解)
深度:一文看懂Linux内核!Linux内核架构和工作原理详解
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。virt/ ---- 提供虚拟机技术的支持。
用户7557625
2021/01/29
3.1K0
linux系统组成及结构[通俗易懂]
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。
全栈程序员站长
2022/09/14
2K0
linux系统组成及结构[通俗易懂]
Linux内核源代码分析经验
  Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的 最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。   Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核,顺利通过编译,一切运行正常的时候。 那种成就感真是油然而生!而且,对内核的分析,除了出自对技术的狂热追求之外,这种令人生畏的劳动所带来的回报也是非常令人着迷的,这也正是它拥有众多追 随者的主要原因:   首先,你可以从中学到很多的计算机的底层知识,如后面将讲到的系统的引导和硬件提供的中断机制等;其它,象虚拟存储的实现机制,多任务机制,系统保护 机制等等,这些都是非都源码不能体会的。   同时,你还将从操作系统的整体结构中,体会整体设计在软件设计中的份量和作用,以及一些宏观设计的方法和技巧:Linux的内核为上层应用提供一个与 具体硬件不相关的平台;同时在内核内部,它又把代码分为与体系结构和硬件相关的部分,和可移植的部分;再例如,Linux虽然不是微内核的,但他把大部分 的设备驱动处理成相对独立的内核模块,这样减小了内核运行的开销,增强了内核代码的模块独立性。   而且你还能从对内核源码的分析中,体会到它在解决某个具体细节问题时,方法的巧妙:如后面将分析到了的Linux通过Botoom_half机制来加 快系统对中断的处理。   最重要的是:在源码的分析过程中,你将会被一点一点地、潜移默化地专业化。一个专业的程序员,总是把代码的清晰性,兼容性,可移植性放在很重要的位 置。他们总是通过定义大量的宏,来增强代码的清晰度和可读性,而又不增加编译后的代码长度和代码的运行效率;他们总是在编码的同时,就考虑到了以后的代码 维护和升级。 甚至,只要分析百分之一的代码后,你就会深刻地体会到,什么样的代码才是一个专业的程序员写的,什么样的代码是一个业余爱好者写的。而这一点是任何没有真 正分析过标准代码的人都无法体会到的。   然而,由于内核代码的冗长,和内核体系结构的庞杂,所以分析内核也是一个很艰难,很需要毅力的事;在缺乏指导和交流的情况下,尤其如此。只有方法正 确,才能事半功倍。正是基于这种考虑,作者希望通过此文能给大家一些借鉴和启迪。   由于本人所进行的分析都是基于2.2.5版本的内核;所以,如果没有特别说明,以下分析都是基于i386单处理器的2.2.5版本的Linux内核。 所有源文件均是相对于目录/usr/src/linux的。   要分析Linux内核源码,首先必须找到各个模块的位置,也即要弄懂源码的文件组织形式。虽然对于有经验的高手而言,这个不是很难;但对于很多初级的 Linux爱好者,和那些对源码分析很有兴趣但接触不多的人来说,这还是很有必要的。   1、Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(的二个数为偶数,例如 2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心。   2、核心源程序的文件按树形结构进行组织,在源程序树的最上层,即目录/usr/src/linux下有这样一些目录和文件。   ◆ COPYING: GPL版权申明。对具有GPL版权的源代码改动而形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务,如公开源代码。   ◆ CREDITS: 光荣榜。对Linux做出过很大贡献的一些人的信息。   ◆ MAINTAINERS: 维护人员列表,对当前版本的内核各部分都有谁负责。   ◆ Makefile: 第一个Makefile文件。用来组织内核的各模块,记录了个模块间的相互这间的联系和依托关系,编译时使用;仔细阅读各子目录下的Makefile文件 对弄清各个文件这间的联系和依托关系很有帮助。   ◆ ReadMe: 核心及其编译配置方法简单介绍。   ◆ Rules.make: 各种Makefilemake所使用的一些共同规则。   ◆ REPORTING-BUGS:有关报告Bug 的一些内容。   ● Arch/ :arch子目录包括了所有和体系结构相关的核心代码。它的每一个子目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体系结构的子目录。PC机一般都基于此目录;   ● Include/: include子目录包括编译核心所需要的大部分头文件。与平台无关的头文件在 include/linux子目录下,与 intel c
嵌入式与Linux那些事
2021/05/20
3.1K0
Linux 内核架构分析
进程调度器是Linux内核中最重要的子系统。其目的是控制对计算机CPU的访问。这不仅包括用户进程的访问,还包括其他内核子系统的访问。
用户6280468
2022/03/21
3K0
Linux 内核架构分析
Linux系统结构详解
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统。部分层次结构如图1-1所示。
用户8826052
2022/03/02
8280
【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827
韩曙亮
2023/03/27
2.9K0
【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介
【译】Linux概念架构的理解摘要一、Linux内核在整个计算机系统中的位置二、内核的作用三、Linux内核的整体架构四、高度模块化设计的系统,利于分工合作。五、系统中的数据结构六、子系统架构七、结论
声明:本文翻译自Conceptual Architecture of the Linux Kernel
阿杜
2018/08/06
1.2K0
【译】Linux概念架构的理解摘要一、Linux内核在整个计算机系统中的位置二、内核的作用三、Linux内核的整体架构四、高度模块化设计的系统,利于分工合作。五、系统中的数据结构六、子系统架构七、结论
FPGA Xilinx Zynq 系列(三十六)Linux 内核
今天给大侠带来FPGA Xilinx Zynq 系列第三十六篇,开启第二十三章,带来Linux 内核相关内容,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.7K0
牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万
原文地址:牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万
嵌入式Linux内核
2023/06/09
1.1K0
牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万
Linux Kernel入门指南—魅力内核的奇妙之旅
踏上 Linux 内核世界的探险将成为您职业生涯的一段迷人旅程。作为操作系统之心的 Linux 内核涵盖众多领域,如操作系统原理、硬件抽象以及驱动开发等。在这篇文章中,我们将一探 Linux 内核的奥秘,并为具备编程基础的技术人员提供一处学习起点。
腾讯技术工程官方号
2023/08/04
2.4K0
Linux Kernel入门指南—魅力内核的奇妙之旅
推荐阅读
相关推荐
LINUX内核
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档