深入探析vmlinux.bin结构及其影响 (vmlinux.bin结构)

vmlinux.bin是Linux内核代码的可执行镜像。了解其结构以及影响是Linux内核开发者的必备基础知识。本文将深入探析vmlinux.bin的结构、特征以及其对Linux内核开发的影响。

一、vmlinux.bin的结构

vmlinux.bin的结构可以分为文件头、代码段、数据段等几个部分。下面分别介绍。

1. 文件头

文件头在vmlinux.bin中的位置是固定的,它的长度是固定的,一般为52个字节。文件头包括的信息如下:

1)Magic Number:用来标识这是一个Linux内核可执行文件,它的值为0x7f 0x45 0x4c 0x46,“ELF”四个字符的ASCII码。

2)Class:用来描述寄存器的长度,它的值为1或2,分别表示32位或64位寄存器长度。

3)Data:用来描述存储器的字节顺序,它的值为1或2,分别表示小端序或大端序。

4)Version:用来描述ELF头的版本号。

5)Entry:用来描述程序执行的入口地址。

6)Phoff:用来描述程序头表的偏移量。

7)Shoff:用来描述节头表的偏移量。

8)Flags:用来描述ELF文件的属性。

9)Ehsize:用来描述ELF头的大小。

10)Phnum:用来描述程序头表中的描述段的数量。

11)Shnum:用来描述节头表中的描述节的数量。

12)Shstrndx:用来描述区节名称字符串所在节的索引值。

2. 代码段

vmlinux.bin代码段包括代码和常量数据,它们是编译过程中生成的机器指令和全局符号。其中,代码是CPU直接执行的指令,而常量数据是不可改变的。

在vmlinux.bin中,代码段一般以“.text”节的形式存储。代码是存放在文本段(text segment)中的,它是只读的,且只有可执行权限。

3. 数据段

vmlinux.bin数据段主要由全局变量、静态变量和初始化数据等组成。其中,全局变量指的是在任何函数之外定义的变量,它们的作用域是整个文件,静态变量指的是在函数内部定义的变量,但生存期是整个程序执行期间都存在的,它们的作用域也是整个文件。

在vmlinux.bin中,数据段一般以“.data”或“.rodata”节的形式存储。数据段是存放已初始化的变量和常量的文本段,它是可读可写的,但是没有执行权限。

二、vmlinux.bin的特征

1. 可执行目标文件格式

vmlinux.bin是一种可执行格式的目标文件,这是Linux内核开发者必须熟悉的。

可执行目标文件格式一般包括代码段、数据段、符号表、重定位表、修复表等部分。当一个程序被编译链接成一个可执行目标文件时,其实就是将代码段、数据段等部分组合在一起生成一个可执行文件。

2. 调试信息

vmlinux.bin中包含了大量的调试信息,这是Linux内核开发者进行工作时必不可少的。

调试信息包括源文件名、行号、变量名、函数名等信息,它们可以帮助开发者在出现问题时更快地定位和解决问题。

3. 模块结构

Linux内核可以以模块化的方式组织代码和功能,而vmlinux.bin正是这些模块的。

每个模块都可以独立编译链接成一个目标文件,可以在运行时动态加载和卸载,这就增强了可维护性和可扩展性。

三、vmlinux.bin对Linux内核开发的影响

vmlinux.bin对Linux内核开发有着深远的影响,主要体现在以下几个方面。

1. 提高了代码的可重用性

模块化设计可以让Linux内核更加灵活和可维护,模块之间可以互相调用和使用,这就提高了代码的可重用性。

2. 加强了内核安全性

vmlinux.bin的只读和不可执行权限设计可以限制不必要的内存访问和执行权限,从而加强了Linux内核的安全性。

3. 改善了内核性能

vmlinux.bin中的代码和数据都是精心优化过的,它们可以帮助Linux内核获得更好的性能和运行效率。

4. 便于内核调试和分析

vmlinux.bin中的调试信息非常丰富,这就方便了Linux内核开发者进行调试和分析。

vmlinux.bin对Linux内核开发者来说非常重要,了解它的结构和特征对于开发出高效、可靠、安全的Linux内核至关重要。

相关问题拓展阅读:

linux系统作业,求代码过程

谢谢!

Linux内核配置系统由三部组别:

?Makefile:布 Linux 内核源代码 Makefile定义 Linux 内核编译规则;

?配置文件圆哪(config.in):给用户提供配置选择功能;

?配置工具:包括配置命令解释器(配置脚本使用配置命令进行解释)配置用户界面(提供基于字符界面、基于 Ncurses 图形界面及基于 Xwindows 图形界面用户配州孝置界面各自应于 Make config、Make menuconfig make xconfig)

些配置工具都使用脚本语言 Tcl/TK、Perl 编写(包含些用 C 编写代码)本文并配置系统本身进行析介绍何使用配置系统所除非配置系统维护者般内核发者须解原理需要知道何编写 Makefile 配置文件所本文我 Makefile 配置文件进行讨论另外凡涉及与具体 CPU 体系结构相关内容我都 ARM 例仅讨论问题明确化且内容本身产影响橘迹码

2. Makefile

2.1 Makefile 概述

Makefile 作用根据配置情况构造需要编译源文件列表别编译并目标代码链接起终形 Linux 内核二进制文件

由于 Linux 内核源代码按照树形结构组织所 Makefile 布目录树Linux 内核 Makefile 及与 Makefile 直接相关文件:

?Makefile:顶层 Makefile整内核配置、编译总体控制文件

?.config:内核配置文件包含由用户选择配置选项用存放内核配置结( make config)

?arch/*/Makefile:位于各种 CPU 体系目录 Makefile arch/arm/Makefile针特定平台 Makefile

?各目录 Makefile:比 drivers/Makefile负责所目录源代码管理

?Rules.make:规则文件所 Makefile 使用

用户通 make config 配置产 .config顶层 Makefile 读入 .config 配置选择顶层 Makefile 两主要任务:产 vmlinux 文件内核模块(module)达目顶层 Makefile 递归进入内核各目录别调用位于些目录 Makefile至于底进入哪些目录取决于内核配置顶层 Makefile 句:include arch/$(ARCH)/Makefile包含特定 CPU 体系结构 Makefile Makefile 包含平台相关信息

位于各目录 Makefile 同根据 .config 给配置信息构造前配置需要源文件列表并文件 include $(TOPDIR)/Rules.make

Rules.make 文件起着非重要作用定义所 Makefile 共用编译规则比需要本目录所 c 程序编译汇编代码需要 Makefile 编译规则:

%.s: %.c

$(CC) $(CFLAGS) -S $

目录都同要求需要各自 Makefile 包含编译规则比较麻烦 Linux 内核则类编译规则统放置 Rules.make 并各自 Makefile 包含进 Rules.make(include Rules.make)避免 Makefile 重复同规则于面例 Rules.make 应规则:

%.s: %.c

$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $

2.2 Makefile 变量

顶层 Makefile 定义并向环境输许变量各目录 Makefile 传递些信息些变量比 SUBDIRS仅顶层 Makefile 定义并且赋初值且 arch/*/Makefile 作扩充

用变量几类:

1) 版本信息

版本信息:VERSIONPATCHLEVEL, SUBLEVEL, EXTRAVERSIONKERNELRELEASE版本信息定义前内核版本比 VERSION=2PATCHLEVEL=4SUBLEVEL=18EXATAVERSION=-rmk7共同构内核发行版本KERNELRELEASE:2.4.18-rmk7

2) CPU 体系结构:ARCH

顶层 Makefile 用 ARCH 定义目标 CPU 体系结构比 ARCH:=arm 等许目录 Makefile 要根据 ARCH 定义选择编译源文件列表

3) 路径信息:TOPDIR, SUBDIRS

TOPDIR 定义 Linux 内核源代码所根目录例各目录 Makefile 通 $(TOPDIR)/Rules.make 找 Rules.make 位置

SUBDIRS 定义目录列表编译内核或模块顶层 Makefile 根据 SUBDIRS 决定进入哪些目录SUBDIRS 值取决于内核配置顶层 Makefile SUBDIRS 赋值 kernel drivers mm fs net ipc lib;根据内核配置情况 arch/*/Makefile 扩充 SUBDIRS 值参见4)例

4) 内核组信息:HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS

Linux 内核文件 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 由 HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS LIBS 组些变量( HEAD)都用定义连接 vmlinux 目标文件库文件列表其HEADarch/*/Makefile 定义用确定先链接进 vmlinux 文件列表比于 ARM 系列 CPUHEAD 定义:

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

表明 head-$(PROCESSOR).o init_task.o 需要先链接 vmlinux PROCESSOR armv 或 armo取决于目标 CPU CORE_FILESNETWORKDRIVERS LIBS 顶层 Makefile 定义并且由 arch/*/Makefile 根据需要进行扩充 CORE_FILES 应着内核核文件 kernel/kernel.omm/mm.ofs/fs.oipc/ipc.o看些组内核重要文件同arch/arm/Makefile CORE_FILES 进行扩充:

# arch/arm/Makefile

# If we have a machine-specific directory, then include it in the build.

MACHDIR := arch/arm/mach-$(MACHINE)

ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))

SUBDIRS += $(MACHDIR)

CORE_FILES := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)

endif

HEAD := arch/arm/kernel/head-$(PROCESSOR).o

arch/arm/kernel/init_task.o

SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe

CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)

LIBS := arch/arm/lib/lib.a $(LIBS)

5) 编译信息:CPP, CC, AS, LD, ARCFLAGSLINKFLAGS

Rules.make 定义编译通用规则具体特定场合需要明确给编译环境编译环境变量定义针交叉编译要求定义 CROSS_COMPILE比:

CROSS_COMPILE = arm-linux-

CC = $(CROSS_COMPILE)gcc

LD = $(CROSS_COMPILE)ld

……

CROSS_COMPILE 定义交叉编译器前缀 arm-linux-表明所交叉编译工具都 arm-linux- 所各交叉编译器工具前都加入 $(CROSS_COMPILE)组完整交叉编译工具文件名比 arm-linux-gcc

CFLAGS 定义传递给 C 编译器参数

LINKFLAGS 链接 vmlinux 由链接器使用参数LINKFLAGS arm/*/Makefile 定义比:

# arch/arm/Makefile

LINKFLAGS :=-p -X -T arch/arm/vmlinux.lds

6) 配置变量CONFIG_*

.config 文件许配置变量等式用说明用户配置结例 CONFIG_MODULES=y 表明用户选择 Linux 内核模块功能

.config 顶层 Makefile 包含形许配置变量每配置变量具确定值:y 表示本编译选项应内核代码静态编译进 Linux 内核;m 表示本编译选项应内核代码编译模块;n 表示选择编译选项;根本没选择配置变量值空

2.3 Rules.make 变量

前面讲Rules.make 编译规则文件所 Makefile 都包括 Rules.makeRules.make 文件定义许变量重要些编译、链接列表变量

O_OBL_OBOX_OBLX_OB:本目录需要编译进 Linux 内核 vmlinux 目标文件列表其 OX_OB LX_OB “X” 表明目标文件使用 EXPORT_SYMBOL 输符号

M_OBMX_OB:本目录需要编译装载模块目标文件列表同MX_OB “X” 表明目标文件使用 EXPORT_SYMBOL 输符号

O_TARGETL_TARGET:每目录都 O_TARGET 或 L_TARGETRules.make 首先源代码编译 O_OB OX_OB 所目标文件使用 $(LD) -r 链接 O_TARGET 或 L_TARGETO_TARGET .o 结尾 L_TARGET .a 结尾

你网上随基卖便祥锋和搜一下Linux文件权限,主要谨盯是chmod,chown这两个命令看一看就明白了!

mkdir test

touch file1

chmod o+w file1

chmod g-r file1

chmod 755 file1

chmod 400 file1

二、

chmod 744 backup.tar.gz

chmod 777 backup.tar.gz

chmod 755 backup.tar.gz

chgrp adm backup.tar.gz

chown adm backup.tar.gz

linux下安装后缀为bin的Java JDK

1、sun网站上下载jdk-6u13-linux-i586.bin;

2、一般默认下载到文档;

3、比如安装到/usr/java目录下;

4、使用命令建握御立目录:sudo mkdir -v /usr/java;

5、拷贝下载的jdk-6u13-linux-i586.bin到以上建立的目录中:sudo cp -v /home/wmseal/文档/jdk-6u13- linux-i586.bin /usr/java;

6、扰祥进入安装目录:cd /usr/java;

7、赋予权限:sudo chmod u+x jdk-6u10-linux-i586.bin;

8、执行安装:段李岩sudo ./jdk-6u10-linux-i586.bin;

9、配置环境变量: export JAVA_HOME=/usr/java/jdk1.6.0_13 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin

10、测试是否成功:java -version java version “1.6.0_13” Java(TM) SE Runtime Environment (build 1.6.0_13-b33) Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing) 见到这个信息就是你安装成功了!

关于vmlinux.bin结构的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入探析vmlinux.bin结构及其影响 (vmlinux.bin结构)