Bootstrap

Linux内核(一)–基础概念及学习路线

Linux内核(一)–基础概念

一、Linux体系结构

嵌入式应用基本在Linux操作系统上运行,有类似的三层结构:

  1. 硬件:物理机(这是系统的底层结构或基础)是由内存(RAM)、处理器(或 CPU)以及输入/输出(I/O)设备(例如存储、网络和图形)组成的。其中,CPU 负责执行计算和内存的读写操作。
  2. Linux 内核:操作系统的核心。(没错,内核正处于核心的位置)它是驻留在内存中的软件,用于告诉 CPU 要执行哪些操作。
  3. 用户可执行程序:用户进程共同构成了用户空间。用户进程有时也简称为进程。内核还允许这些进程和服务器彼此进行通信(称为进程间通信或 IPC)。
1、Linux体系结构

Linux体系结构可以 分为用户空间内核空间两块。

  • 用户空间:包含了用户应用程序C库
  • 内核空间:包括系统调用内核,以及与平台架构相关的代码;内核对用户是不可见的。
    在这里插入图片描述

用户空间和内核空间是程序执行的两种不同状态,我们可以通过“系统调用”和“硬件中断“来完成用户空间到内核空间的转移,用户空间和内核空间的区分主要是为了系统的安全防护。

二、Linux内核

linux内核代码涉及知识点包括汇编指令、c语言、硬件组成原理、操作系统、数据结构和算法、各种外设总线、驱动、网络协议栈

Linux内核的主要组件有:系统调用接口、进程管理、虚拟文件系统(VFS)、网络堆栈、设备驱动程序、硬件架构等。

  • 系统调用接口:SCI层提供了某些机制执行从用户空间到内核空间的函数调用;这个接口依赖于体系结构,在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。
  • 进程管理:内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSIX] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSIX 机制)。
    1. 进程基础:进程原理及状态、生命周期及系统调用、task_struct数据结构;
    2. 进程调度:调度策略、进程优先级、调度类分析、SMP调度;
  • 内存管理:Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。管理虚拟内存是按照所谓的内存页方式进行管理的。为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
    1. 内存原理:SMP/NUMA模型组织、页表/页表缓存、CPU缓存、内存映射;
    2. 虚拟内存:伙伴分配器、块分配器、巨型页、页回收、页错误异常处理与反碎片技术、连续内存分配技术原理、不连续页分配器原理与实现;
    3. 内存系统调用:kmalloc/vmalloc、内存池原理与实现、内存优化与实现
  • 虚拟文件系统:它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()read()write()这样的系统调用操作文件,而无须考虑具体的文件系统和实际的存储介质。通过VFS系统,Linux提供了通用的系统调用,可以跨越不同文件系统和介质之间执行,极大简化了用户访问不同文件系统的过程。另一方面,新的文件系统、新类型的存储介质,可以无须编译的情况下,动态加载到Linux中。文件系统的源代码可以在 ./linux/fs 中找到。VFS属于Linux文件系统,包括:
    1. 虚拟文件系统:通用文件模型、数据结构、文件系统调用、挂载文件系统、无存储文件系统;
    2. 磁盘文件系统:Ext2/Ext3/Ext4文件系统、日志JBD2
    3. 用户空间系统:FUSE原理机制/接口与实现
  • 网络堆栈(网络协议栈):Internet Protocol (IP) 是传输协议(通常称为传输控制协议或 TCP)下面的核心网络层协议。TCP 上面是 socket 层,它是通过 SCI 进行调用的。socket 层是网络子系统的标准 API,它为各种网络协议提供了一个用户接口。从原始帧访问到 IP 协议数据单元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 层提供了一种标准化的方法来管理连接,并在各个终点之间移动数据。内核中网络源代码可以在 ./linux/net 中找到。
    1. 网络基础架构:SKB/net_device、网络层分析、Linux邻近子系统、netlink套接字、iptables套接字、netfilter框架、内核NIC接口分析、mac80211无线子系统;
    2. 网络协议栈:internet控制消息协议(ICMP)、用户数据报协议(UDP)、传输控制协议(TCP)、流控制传输协议(SCTP)、数据报拥塞控制协议(DCCP)、IPv4路由选择子系统、组播/策略/多路径路由选择、接收/发送(IPv4/IPv6)数据报、infiniBand栈的架构;
    3. 系统API调用:POSIX网络API调用、epoll内核原理与实现、网络系统参数配置;
  • 设备驱动
    1. 设备子系统:I/O机制原理、设备模型、字符设备子系统、网络接口卡驱动;
    2. Linux设备模型:LDM、设备模型和sysfs;
    3. 字符设备驱动:主设备与次设备、设备文件操作、分配与注册字符设备、写文件操作实现;
    4. 网卡设备驱动:数据结构、设备方法、驱动程序;
    5. 块设备驱动:资源管理、I/O调度、BIO结构原理、PCI总线原理;
  • 体系结构代码:./linux/arch 子目录定义了内核源代码中依赖于体系结构的部分,其中包含了各种特定于体系结构的子目录(共同组成了 BSP)。
    在这里插入图片描述
1、Linux内核源代码代码目录
include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。
kernel/ ---- Linux内核的核心代码,包含了进程调度子系统,以及和进程调度相关的模块。
mm/ ---- 内存管理子系统。
fs/ ---- VFS子系统
net/ ---- 不包括网络设备驱动的网络子系统。
ipc/ ---- IPC(进程间通信)子系统。
arch// ---- 体系结构相关的代码,例如arm, x86等等。 
arch//mach- ---- 具体的machine/board相关的代码。 
arch//include/asm ---- 体系结构相关的头文件。 
arch//boot/dts ---- 设备树(Device Tree)文件。
init/ ---- Linux系统启动初始化相关的代码。 
block/ ---- 提供块设备的层次。 
sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 
drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。
lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 
crypto/ ----- 加密、解密相关的库函数。 
security/ ---- 提供安全特性(SELinux)。 
virt/ ---- 提供虚拟机技术(KVM等)的支持。 
usr/ ---- 用于生成initramfs的代码。 
firmware/ ---- 保存用于驱动第三方设备的固件。
samples/ ---- 一些示例代码。 
tools/ ---- 一些常用工具,如性能剖析、自测试等。
Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。
COPYING ---- 版权声明。 
MAINTAINERS ----维护者名单。 
CREDITS ---- Linux主要的贡献者名单。 
REPORTING-BUGS ---- Bug上报的指南。
Documentation, README ---- 帮助、说明文档。
2、Linux内核学习线路推荐

Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。选择3.10版本之后的代码阅读学习

  • Linux驱动架构
  • Linux网络子系统
  • Linux内核启动过程

从最基本的字符设备学起,学习如何编写一个简单的模块,学习如何为一些简单的设备如LED、ADC等编写驱动。

  • Linux内存管理机制

  • Linux调度器

  • Linux进程管理

  • Linux虚拟机制(KVM)
    何编写一个简单的模块,学习如何为一些简单的设备如LED、ADC等编写驱动。

  • Linux内存管理机制

  • Linux调度器

  • Linux进程管理

  • Linux虚拟机制(KVM)

  • Linux内核实时化技术

;