`
izuoyan
  • 浏览: 9222672 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

读Kernel感悟-Linux内核启动-内核的生成

阅读更多

这段时间在看《Linux内核源代码情景分析》,顺便写了一些感悟。读内核源代码是一件很有意思的事。它像一条线,把操作系统,编译原理,C语言,数据结构与算法,计算机体系结构等等计算机的基础课程串起来。

我看内核源代码是用lxr+glimpse(不一定要自己架,可以直接访问校内外的lxr网站)的。如果在windows下也可以用sourceinsight。以下的当前路径为内核源代码路径,通常为/usr/src/linux。内核版本为2.6.13,平台为x86

好,让我们开始Linux内核之旅。

我们的出发点是在CPU加电的一刹那,系统处于16位实地址模式下,终点是内核开始运行start_kernel(),系统处于32位页式寻址的保护模式下。那时内核映象bzImage已经解压完毕,运行于内核态。系统中已经有了一个叫swapper的0号进程,有自己的内核堆栈,情况就相对好理解得多。(尽管与用户态程序相比,还要多操心不少事,包括对硬件的直接操作,内核态各种数据结构的初始化,对页表的操作等等)。不过,不妨先做些准备动作。

首先,什么是内核?目前,只知道编译内核后,产生一个叫bzImage的压缩内核映象。它不同于任何普通的可执行程序。我们甚至不知道它从哪里开始执行。只知道把它往/boot/下一放,往bootloader的配置文件(例如grub的menu.lst)中写上相关信息,机子就顺利启动了。因此,我对它的生成过程产生了浓厚兴趣。于是,我查看了相关资料,最直接的资料来自于arch/i386/boot/下的Makefile。从Makefile中可以知道。bzImage的产生过程是这样的:不过我不满足于此。于是,我想到了去看arch/i386/boot/下的Makefile。从arch/i386/boot/Makefile和arch/i386/boot/compressed/Makefile中可以看出(具体过程省略,)

1.先生成vmlinux.这是一个elf可执行文件

2.然后objcopy成arch/i386/boot/compressed/vmlinux.bin,去掉了原elf文件中的一些无用的section等信息。

3.gzip后压缩为arch/i386/boot/compressed/vmlinux.bin.gz

4.把压缩文件作为数据段链接成arch/i386/boot/compressed/piggy.o

5.链接:arch/i386/boot/compressed/vmlinux=head.o+misc.o+piggy.o

其中head.o和misc.o是用来解压缩的。

6.objcopy成arch/i386/boot/vmlinux.bin,去掉了原elf文件中的一些无用的section等信息。

7.用arch/i386/boot/tools/build.c工具拼接bzImage=bootsect+setup+vmlinux.bin

过程好复杂。

这里要介绍一下objcopy命令,它的作用是把一个object文件转化为另一种格式的文件。在这里,objcopy的作用就是去掉原来elf文件中的elfheader和一些无用的section信息。为什么要这么做呢?因为elf文件中的elfheader和一些section的作用是告诉elfloader如何载入elf可执行文件。但是,linux内核作为一种特殊的elf文件,需要特殊折辅助程序去装载它。往往它的装载地址是固定的。这时,为了保证通用性而存在的elfheader和一些section对内核的装载就没有意义了。加上为了使内核尽可能小,所以干脆把这些信息去掉。

我们可以看一下vmlinux和arch/i386/boot/compressed/vmlinux。用file命令查看,它们也是elf可执行文件。只是没有main函数而已

参考:

Documentation/kbuild/makefiles.txt

Documentation/kbuild/modules.txt

分享到:
评论

相关推荐

    kernel-ml-5.11.2内核所有组件集合包

    kernel-ml-doc-5.11.2-1.el7.elrepo.noarch.rpm kernel-ml-headers-5.11.2-1.el7.elrepo.x86_64.rpm kernel-ml-tools-libs-devel-5.11.2-1.el7.elrepo.x86_64.rpm kernel-ml-tools-libs-5.11.2-1.el7.elrepo.x86_64....

    升级linux内核到kernel-ml-aufs-devel-3.10.5-3.el6所需的内核

    当我们提到“升级Linux内核到kernel-ml-aufs-devel-3.10.5-3.el6所需的内核”时,这涉及到对现有Linux内核的更新,以获取最新的功能、性能优化和安全修复。 `kernel-ml-aufs-devel-3.10.5-3.el6.x86_64.rpm` 和 `...

    centos7内核升级离线安装包kernel-lt-5.4.274*

    由于是离线安装,你需要确保在有网络连接的环境中下载好所有必要的文件,包括kernel-lt、kernel-lt-devel和kernel-lt-headers等组件,它们通常是配套发布的。 2. **传输内核包**:将下载好的RPM包通过USB驱动器、...

    ARM-Linux内核启动的分析

    ARM-Linux内核启动是一个复杂而精细的过程,本文将重点分析`arch/arm/kernel/head-armv.S`文件,该文件作为整个内核启动的入口点,在Bootloader执行完毕后直接控制着后续的执行流程。在分析过程中,还会涉及其他关键...

    kernel-lt-4.4.213内核所有组件集合包

    kernel-lt-doc-4.4.213-1.el7.elrepo.noarch.rpm kernel-lt-headers-4.4.213-1.el7.elrepo.x86_64.rpm kernel-lt-tools-libs-devel-4.4.213-1.el7.elrepo.x86_64.rpm kernel-lt-tools-libs-4.4.213-1.el7.elrepo.x86...

    centos7.2内核包kernel-3.10.0-327.el7.x86_64

    kernel-3.10.0-327.el7.x86_64.rpm kernel-debug-3.10.0-327.el7.x86_64.rpm kernel-debug-devel-3.10.0-327.el7.x86_64.rpm kernel-devel-3.10.0-327.el7.x86_64.rpm kernel-headers-3.10.0-327.el7.x86_64.rpm ...

    kernel-ml-5.5.5内核所有组件集合包

    kernel-ml-doc-5.5.5-1.el7.elrepo.noarch.rpm kernel-ml-headers-5.5.5-1.el7.elrepo.x86_64.rpm kernel-ml-tools-libs-devel-5.5.5-1.el7.elrepo.x86_64.rpm kernel-ml-tools-libs-5.5.5-1.el7.elrepo.x86_64.rpm ...

    kernel-devel-3.10.0-1160.el7.x86-64.rpm 及其他版本下载地址信息

    总结起来,`kernel-devel`包对于Linux内核模块的开发至关重要,它提供了构建和调试模块所需的所有工具。`kernel-devel-3.10.0-1160.el7.x86_64.rpm`是针对RHEL 7的一个具体实例,确保了与该版本内核的兼容性。通过...

    Reading-and-comprehense-linux-Kernel-network-protocol-stack-master.7z

    本文将基于提供的"Reading-and-comprehense-linux-Kernel-network-protocol-stack-master.7z"压缩包,深入探讨Linux 2.6内核版本中的TCP/IP协议栈。 首先,让我们明确一下TCP/IP协议栈的基本概念。它是由一系列协议...

    linux内核图解-linux内核图解

    - 虚拟化:KVM(Kernel-based Virtual Machine)是Linux内核内置的虚拟化技术,可创建和管理虚拟机。 - 安全性:Linux内核支持SELinux(Security-Enhanced Linux)等安全模块,提供强制访问控制,增强系统安全性。 -...

    虚拟机黑屏end kernel panic - not syncing两种解决方式.docx

    这个错误通常表示Linux内核遇到了严重的问题,导致系统无法正常运行。在本文中,我们将探讨两种解决这个问题的方法,主要针对使用最新版Ubuntu或Debian的虚拟机。 首先,当新建虚拟机时遇到“end kernel panic - ...

    linux-linux内核1.0版本源码阅读和注释.zip

    这份资料"Linux-Linux内核1.0版本源码阅读和注释.zip"提供了对这一早期版本内核源码的解读和注释,对于理解Linux发展史和学习操作系统原理有着重要的价值。 首先,我们来看看Linux内核1.0的源码结构。源码通常被...

    kernel-headers-3.10.0-1160.zip

    《深入理解Linux内核开发与优化:以kernel-headers-3.10.0-1160.zip为例》 在Linux系统的世界里,内核是操作系统的核心,它负责管理和调度系统的硬件资源,为上层应用程序提供服务。本文将围绕"kernel-headers-...

    centos-6.8 内核升级kernel-3.18版本rpm包分享

    rpm -ivh kernel-3.18.21-16.el6.x86_64.rpm --nodeps kernel-devel-3.18.21-16.el6.x86_64_2.rpm --nodeps 2、修改grub.conf文件 把default=1修改为 default=0 3、重启centos reboot 4、重新查看内核 uname -r

    Reading-and-comprehense-linux-Kernel-network-protocol-stack_y123456yz.tar.gz

    这个压缩包“Reading-and-comprehense-linux-Kernel-network-protocol-stack_y123456yz.tar.gz”提供了一份详细的源码分析,对于学习和理解Linux内核如何处理网络数据包,特别是对C语言编程有一定基础的人来说,是一...

    边干边学--linux内核指导相关源代码

    "边干边学--Linux内核指导相关源代码"是一份珍贵的学习资料,旨在帮助开发者深入理解Linux内核的工作原理,并通过实践来提升技能。下面我们将围绕这个主题,详细探讨Linux内核的一些核心知识点。 首先,Linux内核...

    linux内核启动---bootloader启动内核过程

    在深入探讨Linux内核启动和bootloader启动内核的过程之前,首先需要理解这两个概念的基本含义。Bootloader是操作系统加载前运行的一小段程序,它的主要任务是初始化硬件设备,如CPU、内存、显卡等,并将操作系统内核...

    linux启动流程分析---内核解压缩过程

    Linux 启动流程分析 --- 内核解压缩过程 Linux 启动流程中的内核解压缩过程是一个非常重要的步骤,它决定了 Linux 内核的正确加载和执行。在这个过程中,内核压缩和解压缩代码都在目录 kernel/arch/arm/boot/...

    kernel-headers-3.10.0-957.el7.x86_64

    标题“kernel-headers-3.10.0-957.el7.x86_64”指的是Linux内核头文件的一个特定版本,用于RPM(Red Hat Package Manager)包管理系统的环境。在这个案例中,它是针对Linux内核版本3.10.0-957,适配于EL7...

Global site tag (gtag.js) - Google Analytics