Linux 内核编译过程说明 (以PC Linux为例)

Linux系统编译新内核、增加系统调用实验【Deepin版】 前言:这是操作系统学习Linux要求的必做实验之一,希望通过这种课程报告可以让大家了解Linux系统编译新内核、增加系统调用的方法,另外,现在大多数人可能会选择用ubuntu,所以对于一些用deepin版本的人编译新内核可能会有一些坑,在我下面的课程报告中也有涉及到,希望有所帮助啦~ 一、实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统... 阅读详情
 Linux 内核编译说明
1.Linux内核源码结构:
内核源码中主要包含以下子目录:
arch :包含了与体系结构相关的代码
对应于每一个支持的体系结构,有一个相应的子目录如i386、arm、alpha等。
其每个体系结构子目录下包含几个主要的子目录:
kernel :包含与体系结构相关的内核代码
mm : 包含与体系结构相关的内存管理代码
lib : 包含与体系结构相关的库代码
documentation:包含内核的文档
drivers :包含设备驱动代码。每类设备有相应的子目录,如char 、block、net等
fs : 包含文件系统的代码。每个支持的文件系统有相应的子目录,如 ext2、proc等
include :内核头文件,对每一种体系结构,分别有相应的子目录。
init : 包含内核初始化代码
lib : 包含内核的库代码
mm :包含内存管理代码
kernel :包含内核管理代码
net :包含网络部分的代码

2.系统引导的过程
在pc机上系统启动过程:
系统加电以后bois对系统完成监测设置后将控制权交给硬盘上MBR中的 BootLoader在这里即是lilo或grub等。
BootLoader 将操作系统代码调入内存,然后将控制权交给arch/i386/boot中的Setup.S这段程序。
Setup.S 这段程序在386实模式下对系统进行基本的检测和设置后转入保护模式把控制权交给Head.S
Head.S 建立内存管理和中断管理的框架后调用init/main.c中的start_kernel()函数在start_kernel执行完成后用户就可以登录和使用linux了。Start_kernel()函数在init/main.c 中定义。
Start_kernel的流程中的主要步骤:
setup_arch(&command_line); 用于和处理器、内存等最基本的硬件相关部分的初始化。 在 arch/i386/kernel/setup.c 中定义;
parse_options(command_line); 把启动时得到的参数从命令行的字符串中分离出来并赋给相应的变量。在 init/main.c 中定义;
trap_init(); 对中断向量表进行初始化。在 arch/i386/kernel/trap.c 中定义;
init_IRQ(); 与中断有关的初始化, 在 arch/i386/kernel/i8259.c 中定义;
sched_init(); 进程调度初始化。 在 kernel/sched.c 中定义;
softirq_init(); 在 kernel/softirq.c 中定义;
time_init(); 时间部分初始化。 在 arch/i386/kernel/time.c 中定义;
console_init(); 对终端初始化。 在 drivers/char/tty_io.c 中定义;
buffer_init(mempages); 对用于指示块缓存的buff free list 初始化。 在fs/buffer.c 中定义;
mem_init(); 内存管理初始化。 在 arch/i386/mm/init.c中定义;
rest_init(); 此函数中调用
kernel_thread(init,NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL)函数时会调用init/main.c中的init()函数 在init()函数中将会建立dbflush、kswapd两个新的内核线程。初始化tty1设备。寻找/etc/init或/sbin/init 或/bin/init来建立一个init进程。
Init进程根据/etc/inittab文件进行文件系统检查、启动系统守护进程为联机终端建立getty进程,执行/etc/rc下的命令文件。
此后getty会在终端上显示login提示符,以等待用户登录。

3.使用make建立内核
1.使用make menuconfig命令:
使用以下编译选项:
Processor type and features --->
(Pentium-Pro/Celeron/Pentium-II) Processor family
(3GB) Maximum Virtual Memory
General setup --->
(ELF) Kernel core (/proc/kcore) format
[*] Kernel support for ELF binaries
File systems --->
[*] /proc file system support
[*] Second extended fs support
ATA/IDE/MFM/RLL support --->
[*] ATA/IDE/MFM/RLL support
[*] Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
[*] Include IDE/ATA-2 DISK support
Character devices --->
[*] Virtual terminal
Console drivers --->
[*] VGA text console

生成内核bzImage 大小为 309892 byte;
此内核可在pc上成功引导系统

此命令生成一个文件 .config 其中根据你在menuconfig中的选择定义了相应的变量。在Makefile文件中将会包含这个文件。

2.使用make dep命令 建立依赖关系。

3.使用make bzImage 命令建立内核。
如设置正确将在arch/i386/boot/目录下生成内核bzImage文件
4.make bzImage的流程简单说明
当我们使用make命令时,make程序将首先找到当前目录下的Makefile文件。根据Makefile文件的语法进行处理。
在主Makefile文件中包含了arch/i386/Makefile我们make的目标bzImage即在该文件中定:
bzImage: vmlinux
@$(MAKEBOOT) bzImage #此命令将解释为:make -C arch/i386/boot bzImage
现在make需要先去建立目标 vmlinux 然后再执行 arch/i386/boot/ 目录下的 make bzImae。我们现在假设vmlinux目标已生成,则 arch/i386/boot目录下的make程序将执行如下操作:
tools/build -b bbootsect bsetup compressed/bvmlinux.out ./ bzImage
即将vmlinux 用 tools/build工具压缩成目标文件 bzImage(在此过程中,还会构建build 程序,将vmlinux转换成bvmlinux.out等,可参考tools 和 compressed目录下的Makefile文件)。

生成vmlinux目标:
在主目录下Makefile文件中vmlinux生成规则如下:
vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o /
--start-group /
$(CORE_FILES) /
$(DRIVERS) /
$(NETWORKS) /
$(LIBS) /
--end-group /
-o vmlinux #生成vmlinux
$(NM) vmlinux |grep –v /(compiled/)/|/(/.o$$/)/|/( [aUw] /)/|/(/./.ng$$/)/|/(LASH[RL]DI/) | sort > System.map #此命令根据vmlinux生成System.map文件

在当前设置下此ld连接命令被解释为:

ld -m elf_i386 -T /home/arm/linux/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o --start-group arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o drivers/char/char.o drivers/block/block.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/ide/idedriver.o drivers/video/video.o net/network.o /home/arm/linux/arch/i386/lib/lib.a /home/arm/linux/lib/lib.a /home/arm/linux/arch/i386/lib/lib.a --end-group -o vmlinux

即连接程序ld 将各个.o文件连接成目标文件 vmlinux 。
此命令中用到的各个 .o文件make程序会根据Makefile文件的规则去自动生成,下面简单介绍一下由ipc目录生成ipc.o过程:
其ipc目录下Makefile文件内容如下:
O_TARGET := ipc.o
obj-y := util.o
obj-$(CONFIG_SYSVIPC) += msg.o sem.o shm.o
include $(TOPDIR)/Rules.make #包含的Rules.make文件中为通用的规则;

如我们在make menuconfig时选中了SYSVIPC选项,则 .config文件中将定义变量 CONFIG_SYSVIPC=y; 则obj-y 就等于util.o msg.o sem.o shm.o;根据Rules.make将四个.c文件编译为 .o文件。再将四个.o文件连接成 ipc.o文件。在我们的当前设置中没有选择SYSVIPC;将只使用util.o一个文件生成目标 ipc.o ;而util.o由util.c生成。

当所有需要的.o文件生成以后,由ld将其连接生成vmlinux文件,再将其压缩成我们所需要的内核文件 bzImage。Make程序就执行完了。


2002年9月13日
Linux内核模块(驱动)编译详解 本文主要说说如何编译自己开发的内核模块。由于驱动通常也被编译成内核模块,因此文章的内容也适用于驱动的编译。 由于在下能力相当有限,有不当之处,还望大家批评指正^_^ 一、准备工作 准备工作如何做,这里就不详说了。 a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。 b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、m 阅读详情

相关推荐

编译linux内核生成.ko,Linux内核编译完整过程

通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验。内核简介内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src...

weixin_33954881的博客 2741

Linux内核编译

下面简单介绍一下Linux内核编译过程。(附注:本博客所讲的内容是在Ubuntu上进行操作的,Cent OS并未验证) 1、下载内核源码,可以到kernel.org上进行下载。 2、解压内核源文件(注意:要先使用cd命令进入压缩包所在目录),可以使用如下命令: tar -xvf 压缩包名称 3、进入解压后的文件夹: 如下图: 4、配置内核: 使用 make menuconf......

ibless的博客 4万+

鸿蒙PC操作系统:从Linux到自研微内核的蜕变

鸿蒙PC操作系统在技术演进中经历了从依赖Linux内核到完全自主的转变。早期版本(如2023年的V2.0和V3.3.5)基于Linux内核进行适配,以快速实现PC端功能并复用Linux生态资源。然而,2025年发布的鸿蒙PC(HarmonyOS 5)标志着技术突破,采用自主研发的微内核架构,摒弃了Linux内核依赖。鸿蒙微内核通过创新的内存管理和进程调度机制,显著提升了性能和安全性,同时通过兼容性设计在用户态支持Linux应用程序和驱动程序。官方技术文档和生态战略也明确强调鸿蒙PC的“全栈自主可控”,不再兼

kcarly的专栏 2711

Linux内核编译详解

学习了网上的一些资料,自己试着摸索了一下,整理出此文。 由于在下水平相当有限,不当之处,还望大家批评指正^_^ 重要的参考资料有: http://raspberrypi.stackexchange.com/questions/192/how-do-i-cross-compile-the-kernel-on-a-ubuntu-host http://blog.csdn.net/x

无忧老猪 5万+

Linux内核编译过程中遇到的问题

首先还是声明编译环境,和交叉编译工具,还有内核是天嵌移植过的内核源代码,上一篇写的编译内核问题,移植没有解决,今天编译成功后,感觉上次问题好白痴,我还去改了很多文件和函数,殊不知是自己操作错误,在此声明,有些版本的内核都是移植过的,如果是按照第三方提供的资料或者视频去编译可能会出现各种错误,这个时候首先去做的不是查错误,可能更好的办法是去查下相关手册,我上次就是犯了哪个错误。当然从kernel.o

u013234665的专栏 1600

A40i &T3 全源码编译-ARM Linux内核在PC Linux的编译方法

本章讲述方法,采用硬件平台为 飞凌OKA40i开发板、OKT3开发板,已经验证成功,其它平台板卡,请参考使用。 全源码编译 注意:全源码编译消耗时间过长,不推荐使用。 1、编译 在进行本章实验之前,默认已经搭建好交叉编译器环境,即交叉编译器安装成功。 本节介绍ARM Linux内核在PC Linux的编译方法。 交叉编译器路径:lichee/out/sun8iw11p1/linux/common/buildroot/host/opt/ext-toolchain/bin。 配置交叉编..

ningmengzier的博客 893

linux内核编译过程及配置说明解释(1)--Kernel Configuration

最近比较闲,定了一个任务就是学习linux的内核原理,网上找了些资料进行了汇总和记录如下: 1、找到ubuntu网站(https://launchpad.net/ubuntu/+source/linux/3.8.0-19.29)下载内核源码linux_3.8.0.orig.tar.gz 解压到本地文件夹; 2、本文采用make menuconfig方式进行内核的编译(方法有很多种);

我在全球村 9061

Linux内核配置与编译

文章目录Linux内核配置与编译1 配置内核1.1 为什么需要配置内核1.2 如何配置内核1.3 内核配置结果2 编译内核2.1 编译内核2.2 编译内核模块2.3 制作3 安装内核4 清理内核4.1 make clean4.2 make disclean Linux内核配置与编译 1 配置内核 1.1 为什么需要配置内核   1 硬件的需求   2 软件的需求 1.2 如何配置内核   make config:基于文件模式的交互式配置   make menuconfig: 基于文本模式的菜单型配置 一般选

qq_42711815的博客 1315

:linux内核编译过程的最终总结版

参考了linuxsir和水母的linux版的精华区,本人不保留任何版权。经过归纳整理,看看上面的就可以了,包括补丁如何打。具体的一些选项可以往下看,一些一看就懂的白痴选项,并没有选进来,因此适合对电脑软硬件都有所了解的人参考。基本以2.6.5内核为例,虽然2.6的内核编译有更为方便的过程,但这里还是按照最经典的方式,这样最保险。一些过程说明经过了本人的精简,相关的疑

sanying012345的专栏 3675

避坑指南:RFSoC数据转换器多片同步配置的7个致命错误

本文深入剖析了在配置RFSoC多片同步功能时,工程师最常遇到的七个致命错误。从Tile 0的强制启用、时钟域与SYSREF时序,到跨代器件兼容性、电源序列以及动态重配置的陷阱,文章结合实战经验,提供了从原理到调试的完整RF数据转换器配置指南,旨在帮助开发者高效构建相位一致的大规模射频采样系统。

weixin_28452161的博客 533

【Cadence】Virtuoso@LayoutXL 差分电路版图同步修改

对于差分电路,器件和部分走线通常是对称的,只需要画一半,另一半通过镜像操作完成。因此,需要对差分电路进行同步的修改,保证电路的差分对称性和正确的连接关系。然而,通常版图会经过多次修改,修改的部分可能在镜像的时候被遗漏。左边画了金属块,右边也出现了同步出现了金属块。进入group会有同步复制的提示。

乾巽的博客 3049

Linux内核--内核编译/内核镜像产生过程

Linux内核--内核编译/内核镜像产生过程

letterljhx的博客 2342

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

树莓派Linux内核配置和编译

树莓派Linux内核配置

weixin_54859557的博客 1791

三维重建之条纹投影结构光(三)——相位展开优化与多频外差实践

本文深入探讨了三维重建中条纹投影结构光技术的核心环节——相位展开优化。针对传统路径跟踪法存在的误差传播与路径依赖问题,重点解析了多频外差法的原理与优势,并通过详细的C++代码实践,展示了如何利用三频外差法实现鲁棒、高精度的相位展开,从而获得连续的绝对相位图,为后续三维点云生成奠定坚实基础。

weixin_29074295的博客 530

ABP框架实战:从零搭建多租户应用(含完整代码示例)

本文详细介绍了如何使用ABP框架从零构建多租户SaaS应用,涵盖多租户架构设计、数据隔离实现、租户管理及性能优化等核心内容。通过完整的代码示例,帮助开发者快速掌握企业级数据隔离系统的开发技巧,提升SaaS应用开发效率。

weixin_29247219的博客 263

Linux内核编译步骤(PC和嵌入式)

Linux内核编译步骤(PC和嵌入式) 一、准备工作 a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。 b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。 c) 下载一份纯净的Linux内核源码包,并解压好。 注意,如果你是为当前PC机编译内核,最好使用相应的Linux发行版的源码包。 不过这应该也不是必须的,因为我在我的Fedora 13上(其自带的内核版本是2.6.33.3),就下载了一个标准的内核lin.

sickbe的博客 870

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4262

X86/PC平台下的Linux内核编译

因为我们的软件源自己是无法更新的,你可以将软件源想象成“应用商店”,只是这个“应用商店“自己是无法更新的,那么这个”应用商店“就只有软件的旧版本,并且没有最新发布的一些软件,所以我们得手动更新一下,当然我们不是每次下资源时都要更新,这边建议一天使用一次就行了。这里下载会默认到你当前文件中,红色的就是我们刚刚下载的。这里我们提供两种版本的ARM GCC编译链,EABI效率低,CPU占用高,但适配所有ARM芯片,EAPIHF效率高,但仅适配带FPU的ARM芯片,比如Cortex-A芯片。卸载,节省内核体积。

2403_85029219的博客 926

手把手教你学SIMULINK模块库文件专栏--Scope 模块详解

模块是 Simulink 中的一个信号接收模块,用于实时显示信号波形。该模块可以捕捉并可视化仿真过程中信号的变化,帮助用户直观地分析系统的动态行为。模块都能提供强有力的支持。通过深入了解其参数的影响及结合 MATLAB 脚本的应用,读者可以更加有效地利用这一模块进行仿真和研究。此外,通过实际应用场景的扩展以及常见问题解答部分的帮助,能够更好地掌握。模块是一个非常实用的工具,适用于需要实时显示信号波形的各种场景。模块的参数,可以进一步增强学习体验。模块参数的影响,下面我们将详细探讨每个参数如何影响波形显示。

MHD0815的博客 312

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5737

编译Linux内核全过程及添加系统调用

将下载的内核源码压缩包移动到目录 /usr/src (/usr/src:内核源代码默认的放置目录。首先需要切换到 root 账户,或使用 sudo 命令),解压并且换到内核源代码目录下。编译完成后显示:Kernel: arch/x86/boot/bzImage is ready (#4)括号里的 #4意思是这个内核的第4次构建。上面的工具编译 4.x 的内核足够了,但是 5.13 之后的还需要一些别的工具。,修改 arch/x86/include/asm/syscalls.h。3. 在内核源代码中。

IFONLY000的博客 2104

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux内核的编译(Ubuntu为例

1、获取linux内核源代码 在下载目录打开终端,输入命令 sudo tar -xvf linux*.tar.xz -C /usr/src 解压到/usr/src文件夹中 2、选择和启动内核配置程序 打开终端,输入命令cd /usr/src/linux-5.0 (最后一项为你所下载的linux内核源代码文件夹的名称) 准备安装环境,输入命令 sudo apt-get install kern...

白丁的博客 816

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

linux交叉编译和内核编译

20181005记 一、交叉编译arm-linux-gcc 由于嵌入式系统资源匮乏,一般不能像 PC 一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如 PC 来完成这些工作,这样的系统通常被称为宿主机。 宿主机通常是 Linux 系统,并安装交叉编译器、调试器等工具;宿主机也可以是 Windows系统,安装嵌入式 Linux 集成开发环境。在宿主机上编写和编...

Feng_8071的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

玩转NVIDIA Jetson AGX Xavier(13)--- L4T内核kernel编译之在x86 PC上交叉编译jetson kernel

上一篇讲了在jetson平台上编译内核,本篇讲在x86 PC上编译 这里提一点,我并不建议你用虚拟机来搞Linux开发,你的host至少应该是个ubuntu+windows双系统,虚拟机可能有各种问题,不要浪费时间在这些没有意义的问题上,可能会影响到你搞正事的情绪。 配置交叉编译环境 请查看第10篇博文 玩转NVIDIA Jetson AGX Xavier(10)— L4T内核kernel编...

木子山石的学习笔记 7132

嵌入式Linux开发: 从0开始编译并启动ARM Linux内核(全志)

最近看见很多小白不会编译Linux内核,自己瞎折腾走了很多弯路。本文章将会以Orange Pi(香橙派) Zero开发板为例,带您成功编译内核并在板子上启动它。您需要一台(版本最好在20.04以上)、一个可以用的文件、和您开发板对应的、内存卡、读卡器以及一根串口线。 以上这些东西都很容易就能获取到: 可以选择实体机,或者虚拟机(推荐配置4核4G)。 文件可以从官方的系统镜像里面提取出来(/usr/lib/linux-u-boot-xxxxxxxxx/u-boot-sunxi-with-spl.bin),或者

CNflysky的博客 1万+
上一篇: 嵌入式系统开发 (Linux)
下一篇: 回调函数概念
ryman
博客等级 码龄22年 77粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值