您的位置:首页>栏目首页 > 运营 >

linux内核源码编译

2023-06-27 21:57:30    来源:嵌入式Linux开发

Linux内核源码树介绍

Linux内核简介

Linux是一种开源的操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰大学生Linus Torvalds于1991年开发的一款全新的操作系统。那时,作为芬兰赫尔辛基大学的一名学生的linus,正为不能随心所欲使用强大而自由的Unix系统而苦恼。Linus热衷于使用Minix,一种教学用的廉价Unix,但是,他不能轻易修改和发布该系统的源代码,也不能对Minix开发者所作的设计进行修改,基于此linus开始了开发自己的操作系统,并于1991年年底在internet上发布了早期版本,由此Linux内核诞生。Linux内核的主要功能有以下几个方面:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化、系统调用等。

获取Linux内核源码

通过Linux内核官网www.kernel.org下载自己需要的Linux内核源码,笔者下载的是4.14版本的源码。


【资料图】

Linux内核源码树展示

Linux内核源码目录和文件介绍

了解Linux内核源码各个目录和文件的作用,对于我们以后进行Linux内核源码阅读和Linux内核编程大有益处。

arch目录

arch是architecture的缩写,所有与体系结构相关的代码都在这个目录,Linux支持的每种体系结构在arch目录下都有对应的子目录,例如arm子目录是arm32位体系相关代码,arm64子目录是arm64位体系相关代码,x86子目录是intelx86体系相关代码。每个体系结构子目录下又包含和启动相关的代码目录boot,和内核配置相关的代码目录configs,和体系结构相关的头文件目录include,和具体体系结构相关的内存管理代码目录mm等。

block目录

块设备驱动所在目录。块设备是以数据块方式发送和接收数据的设备。

certs目录

认证相关的一些代码实现。

crypto目录

内核本身所用的加密API,实现了常用的加密和散列算法,还有一些压缩和CRC校验算法。例如SHA1加密算法的代码。

Documentation目录

内核帮助文档目录,是学习内核了解内核实现机制的重要途径,关于内核的一些说明信息,在这个目录下会有帮助手册。

drivers目录

各种设备驱动代码、驱动架构代码所在目录,这个目录是内核中最庞大的一个目录,内核源码数量的一半以上都是这个目录贡献的。显卡、网卡、SCSI适配器、PCI总线、USB总线和其他任何Linux支持的外围设备或总线的驱动程序都可以在这儿找到。

firmware目录

fireware中包含了让计算机读取和理解从设备发来的信号的代码。举例来说,一个摄像头管理它自己的硬件,但计算机必须了解摄像头给计算机发送的信号。Linux系统会使用vicam固件(firmware)来理解摄像头的通讯。否则,没有了固件,Linux系统将不知道如何处理摄像头发来的信息。另外,固件同样有助于将Linux系统发送消息给该设备。这样Linux系统可以告诉摄像头重新调整或关闭摄像头。

fs目录

虚拟文件系统(VFS)的代码和各种不同类型的文件系统的代码都在这个目录中。Linux支持的所有文件系统在fs目录下面都有一个对应的子目录。比如ext4文件系统对应的是fs/ext4目录,fat文件系统对应的是fs/fat目录。一个文件系统是存储设备和需要访问存储设备的进程之间的媒介。存储设备可能是本地的物理上可以访问的设备,比如硬盘、U盘、Flash,他们分别使用系统ext4/UBIFS文件系统。还有一些虚拟文件系统,比如proc、sysfs等,他们以一个标准文件系统出现。然而,他们的文件只存在于内存中,并不占磁盘空间。

include目录

这个目录包含了内核中大部分的头文件,按照不同的功能分散在不同的子目录下。例如与平台相关的头文件在/include/linux子目录下。

init目录

内核的初始化代码。包括main.c、创建早期用户空间的代码及其他初始化代码。do_mounts.c内核启动后挂载根文件系统。

ipc目录

IPC(进程间通信)。它包含了共享内存、信号量、消息队列及其他形式的IPC代码。

kernel目录

内核中核心的部分,包括进程的调度(sched.c),以及进程的创建和撤销(fork.c和exit.c)等。

lib目录

此目录包含了核心的库代码。实现了一个标准C库的通用子集,包括字符串和内存操作的函数(strlen、mmcpy)以及有关sprintf和atoi系列函数。

mm目录

此目录包含了与体系结构无关的部分内存管理代码。与体系结构相关的内存管理代码位于arch目录相对应的子目录下的mm目录。

net目录

核心的网络部分代码,实现了各种常见的网络协议,如TCP/IP。

samples目录

一些内核编程的范例。

scripts目录

该目录下没有内核代码,只是包含了用来配置内核的脚本文件。当运行make menuconfig之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。

security目录

这个目录下包含了不同的Linux安全模型的代码。它对计算机免于受到病毒和黑客的侵害很重要。包括SELinux安全模块。

sound目录

ALSA,OSS音频设备的驱动核心代码和常用设备驱动。

tools目录

这个文件夹中包含了和内核交互的工具。

usr目录

实现了用于打包和压缩的cpio等。

virt目录

内核虚拟化相关的代码。包括kvm等。

COPYING文件

许可和授权信息。Linux内核在GPLv2许可证下授权。该许可证授予任何人有权免费去使用、修改、分发和共享源代码和编译代码。

CREDITS文件

贡献者列表

Kbuild文件

这是一个设置一些内核设定的脚本。例如设定一个ARCH变量,这是开发者想要生成的内核支持的处理器类型。

Kconfig文件

这个脚本会在开发人员配置内核的时候用到。

MAINTAINERS文件

这是一个目前维护者列表,他们的电子邮件地址,主页,和他们负责开发和维护的内核的特定部分或文件。这是内核问题反馈的途径。

Makefile文件

这个脚本是编译内核的主要文件。这个文件将编译参数和编译所需的文件和必要的信息传给编译器。

README文件

这个文档提供给开发者想要知道的如何编译内核的信息。

总结

本文简要介绍了Linux内核源码树下各个目录的作用,以及它们主要实现了哪些功能,是我们以后进行Linux内核开发的基础。

关键词:

相关阅读