几个首要的RedHat Linux内核文件详细介绍
在搜集中,不少效劳器授与的是Linux琐屑。为了进一步进步效劳器的遵命,梗概须要依据特定的硬件及需求从新编译Linux内核。编译Linux内核,须要依据规则的步调举行,编译内核历程中触及到几个首要的文件。比如关于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot实施。
编译过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-2.4.7-10的软链接。
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收缩的文件,initrd完成加载一些模块和安置文件琐屑等遵命。
initrd映象文件是运用mkinitrd设立建设的。mkinitrd实用法式可以设立建设initrd映象文件。这个命令是RedHat专有的。另外 Linux发行版年夜约有相应的命令。这是个很便当的实用法式。详细状况请看帮忙:man mkinitrd下面的命令设立建设initrd映象文件。
三、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
下图是System.map文件的一局部:
在举行法式规划时,会命名一些变量名或函数名之类的标记。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)文件。
来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2007/0723/28030.html
版权声明:
原创作品,承诺转载,转载时请务必以超链接方式标明文章 原始原由 、作者信息和本声明。否则将究查司法责任。