linux内核符号表在哪个文件夹里,【Linux技术】几个重要的linux内核文件

Prefacelinux

当用户编译一个linux内核代码后,会产生几个文件:vmlinz、initrd.img, 以及System.map,若是配置过grub引导管理器程序,会在/boot目录下看到这几个文件。ide

vmlinuz

函数

vmlinuz是可引导的、压缩的内核文件。编码

该文件包含了一个最小功能的内核,在PC上一般是先执行vmlinuz,以后加载initrd.img文件,最后加载根分区。spa

实际上initrd.img是可选的,从文件大小来看,initrd.img比vmlinuz文件大得多,initrd.img也包含了较多的功能,若是不须要额外的功能,例如在一些功能需求较小的嵌入式系统上,能够仅使用vmlinuz文件存放内核,而省去initrd.img文件。操作系统

“vm”表明“Virtual Memory”。Linux 支持虚拟内存,不像老的操做系统好比DOS有640KB内存的限制。Linux可以使用硬盘空间做为虚拟内存,所以得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它通常是一个软连接。设计

vmlinuz的创建有两种方式。

调试

一是编译内核时经过“make zImage”建立。zImage适用于小内核的状况,它的存在是为了向后的兼容性。日志

二是编译内核时经过“make bzImage”建立,而后经过。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文件,vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

initrd文件

initrd是“initial ramdisk”的简写。就是由Bootloader初始化的内存盘。

在linux内核启动以前,Bootloader会把存储介质(例如闪存)中的initrd文件加载到内存,内核启动时会在访问到真正的根文件系统前访问内存中的initrd文件系统。

若是Bootloader配置了initrd,内核启动被分红两个阶段:

第一阶段先加载initrd文件系统中的驱动程序模块;

第二阶段才会执行真正的根文件系统中的/sbin/init进程。

第一阶段启动的目的是为第二阶段启动扫清障碍,linux根文件系统支持多种存储介质(如IDE、SCSI、USB等),若是把这些设备的驱动都编译进内核,内核会十分庞大,使用initrd存放设备驱动很好地解决了这一问题。

在启动顺序上,initrd会在vmlinuz代码执行完以后加载,使用initrd的机制能够很好地解决不一样硬件环境的状况,是linux发行版,以USB设备启动的必备。在嵌入式系统上,在硬件相对固定的状况下,initrd做用不像PC上那么大,可是对于调试设备驱动起到了简化调试步骤的做用。

initrd通常被用来临时的引导硬件到实际内核vmlinuz可以接管并继续引导的状态。好比,使用的是scsi硬盘,而内核vmlinuz中并无这个scsi硬件的驱动,那么在装入scsi模块以前,内核不能加载根文件系统,但scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,能够引导一个可以读实际内核的initrd内核并用initrd修正scsi引导问题。

initrd实现加载一些模块和安装文件系统等。

initrd映象文件是使用mkinitrd建立的。mkinitrd实用程序可以建立initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体状况请看帮助:man mkinitrd

System.map

System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的连接。

System.map是由“nm vmlinux”产生而且不相关的符号被滤出。

在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。

Linux内核不使用符号名,而是经过变量或函数的地址来识别变量或函数名。好比不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。

对于使用计算机的人来讲,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,因此编译器/链接器容许咱们编码时使用符号名,当内核运行时使用地址(使用符号表查询一个符号对应的地址,或者经过内存地址获得一个符号名称)。

然而,在有的状况下,咱们须要知道符号的地址,或者须要知道地址对应的符号。这由符号表来完成,符号表是全部符号连同它们的地址的列表。

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为了执行名称-地址解析,须要使用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)文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值