可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux
内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat
Linux(每个发行版放置的目录可能不同),在/boot目录下有一些与Linux内核有关的文件,进入/boot执行:ls -l。编译过RedHat
Linux内核的人对其中的System.map
、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这几个文件是怎么产生
的?又有什么作用呢?
一、vmlinuz
vmlinuz是可引导的、压缩的内核。"vm"代表"Virtual Memory"。Linux
支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名"vm"。vmlinuz是可执行
的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。
vmlinuz的建立有两种方式。一是编译内核时通过"make zImage"创建,然后通过:"cp /usr/src/linux
-2.4/arch/i386/linux
/boot/zImage
/boot/vmlinuz"产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make
bzImage创建,然后通过:"cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage
/boot/vmlinuz"产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起
误解,bz表示"big zImage"。 bzImage中的b是"big"意思。
zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip -dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个
640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage
或bzImage之一,两种方式引导的系统运行时是相同的。大的内核采用bzImage,不能采用zImage。
vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
二、initrd-x.x.x.img
initrd是"initial
ramdisk"的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。initrd-2.4.7-
10.img主要是用于加载ext3等文件系统及scsi设备的驱动。比如,使用的是scsi硬盘,而内核vmlinuz中并没有这个scsi硬件的驱
动,那么在装入scsi模块之前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一
个能够读实际内核的initrd内核并用initrd修正scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件。
linuxrc这个脚本initrd实现加载一些模块和安装文件系统等。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它
Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd。
三、 System.map
System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。
内核符号表是怎么创建的呢? System.map是由"nm vmlinux"产生并且不相关的符号被滤出。对于本文中的例子,编译内核时,System.map创建在/usr/src/linux-2.4/System.map。像下面这样:
nm /boot/vmlinux-2.4.7-10 > System.map
下面几行来自/usr/src/linux-2.4/Makefile:
nm vmlinux | grep -v '(compiled)|(.o$$)|
( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map
然后复制到/boot:
cp /usr/src/linux/System.map /boot/System.map-2.4.7-10
在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。
Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。
对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。
然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。变量名checkCPUtype在内核地址c01000a5。
Linux 符号表使用到2个文件:
/proc/ksyms
System.map
/proc/ksyms是一个"proc
file",在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看
出来。然而,System.map是存在于你的文件系统上的实际文件。当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map
具有的是错误的符号信息。每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。
虽然内核本身并不真正使用System.map,但其它程序比如klogd,
lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序
故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。
另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。
Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用
它的软件能够找到它的地方。执行:man
klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map:
/boot/System.map
/System.map
/usr/src/linux/System.map
System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。
分享到:
相关推荐
linux 命令手册:chm格式,提供索引,快速定位命令 内核源码分析:chm格式,陈莉君,给出图解及部分源代码解释 核心手册:chm,
早期UNIX是用汇编语言编写的,但其第三个版本用一种崭新的编程语言C重新设计了。C是Richie设计出来并用于编写操作系统的程序语言。通过这次重新编写,Unix得以移植到更为强大的 DEC PDP-11/45与11/70计算机上运行。...
2.3 几个重要的数据结构和函数 2.4 越界访问 2.5 用户堆栈的扩展 2.6 物理页面的使用和周转 2.7 物理页面的分配 2.8 页面的定期换出 2.9 页面的换入 2.10 内核缓冲区的管理 2.11 外部设备存储空间的地址映射 2.12 ...
/etc/fstab 记录开机要mount的文件系统(做磁盘配额的时候用过这个文件) /etc/inittab 设定系统启动时init进程把系统设置成什么样的runlevel(第六章有用过) /etc/group 设定用户的组名与相关信息 /etc/passwd ...
本书第三版涵盖Linux 2.6,从中可以看到几乎内核每个子系统都有相当大的变化,首当其冲的是内存管理和块设备部分。本书集中讨论了如下内容: 内存管理,包括文件缓冲、进程交换以及直接内存访问(DMA) 虚拟...
umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。 2.格式 unmount -a [-fFnrsvw] [-t vfstype] [-n] [-rw] [-F] device dir 3.使用说明 umount 命令是mount命令...
(Torvalds@kruuna.helsinki.fi)写了 Linux核心程序的 0.02 版开始的,但其后的发展却几乎都 是由互联网上的 Linux社团(Linux Community)互通交流而完成的。Linux 不属于任何一 家公司或个人,任何人都可以免费取得...
本书同时收录了Linux领域两位领导人物的作品—相当于“Linux 文档项目”的一个印刷版本,展示了Linux 核心概念及其基本结构。对于面向所有主流Linux子系统的支持与管理任务,本书都进行了恰到好处的讲解。涵盖的主题...
”)但是当IBM公司开始把它的DB2数据库系统移植到Linux上、SGI公司宣布把Linux作为它基本的桌面操作系统、甚至Dell公司都把Red Hat Linux作为它服务器计算机的一个预安装选项的时候——真正的“警报”才响了起来。...
Linux基础 Linux内核的作用 内核是Linux操作系统的核心,它负责系统的文件管理、设备管理、进程管理、存储管理、网络协议,直接决定着系统的性能和稳定性 。 linux的版本号 通常我们所说的linux的版本号,指的就是...
对于基于嵌入式Linux系统的嵌入式产品,往往是找不到一个通用平台进行产品开发的,通常来说,需要研发人员自己根据实际需求基于某一款CPU芯片或某一核心板开发自己的硬件平台。当完成硬件平台的设计之后,就需要构建...
全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍...
全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口shell和管理系统的好帮手shell脚本,另外还介绍了...
Linux是一类Unix计算机操作系统的... 这里分为四部分内容: 一、Linux核心源码结构介绍 二、编译和配置的过程 三、系统启动顺序的相关文件 四、核心改造的一些经验 一、 当安装好一个Linux系统,通常核心源码存放在/u
本测试题包括了丰富的内容,涵盖了Linux操作系统基础命令、文件系统管理、进程控制、用户与权限管理等方面的知识点。通过完成这些测试题,您将能够深入了解Linux操作系统的核心概念,并检验自己的学习成果。 除了...
实验1.1 熟悉Linux基本命令与文件目录系统2 1.3 全屏幕编辑器与vi6 1.3.1 vi简介6 1.3.2 基本命令7 1.3.3 常用操作7 实验1.2 全屏幕编辑器vi的使用7 1.4 Linux Shell编程8 1.4.1 Shell程序的编写和执行8 ...
第三部分介绍Linux服务器的安全工具;第四部分是Linux下开源数据库安全以及Linux下新闻组服务器构建、网络钓鱼的防范、Linux无线网络构建及其安全策略、使用Linux安全审计以及使用SeLinux保护Linux服务器的方法;第...
10.5.3 内核模块的多个文件 第十一章 设备驱动程序 11.1 概述 11.1.1 I/O软件 11.1.2 设备驱动程序 11.2 设备驱动基础 11.2.1 I/O端口 11.2.2 I/O接口及设备控制器 11.2.3 设备文件 11.2.4 VFS对设备...