• <tr id='g01m7'><strong id='g01m7'></strong><small id='g01m7'></small><button id='g01m7'></button><li id='g01m7'><noscript id='g01m7'><big id='g01m7'></big><dt id='g01m7'></dt></noscript></li></tr><ol id='g01m7'><table id='g01m7'><blockquote id='g01m7'><tbody id='g01m7'></tbody></blockquote></table></ol><u id='g01m7'></u><kbd id='g01m7'><kbd id='g01m7'></kbd></kbd>

        <code id='g01m7'><strong id='g01m7'></strong></code>

          <i id='g01m7'></i>

          <span id='g01m7'></span>

          1. <ins id='g01m7'></ins>
            <fieldset id='g01m7'></fieldset><dl id='g01m7'></dl>

            <i id='g01m7'><div id='g01m7'><ins id='g01m7'></ins></div></i>

            <acronym id='g01m7'><em id='g01m7'></em><td id='g01m7'><div id='g01m7'></div></td></acronym><address id='g01m7'><big id='g01m7'><big id='g01m7'></big><legend id='g01m7'></legend></big></address>
          2. linux三个内核文件详细解析

            • 时间:
            • 浏览:3
            • 来源:124软件资讯网

              在网络中  ,不少服务器接纳的是Linux系统  。为了进一步提高服务器的性能  ,可能需要凭据特定的硬件及需求重新编译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 。若是你使用错误的或没有12下一页