linux kernel主要文件-图文讲解

文章目录

  • linux 内核
    • 前言
    • 内核重要文件介绍

linux 内核

前言

  • 内核在线阅读:https://elixir.bootlin.com/linux/latest/source
  • 内核官网:https://www.kernel.org/
  • 内核编译:make
  • 安装内核和模块:make module_install install
  • 其他:make mrprobe(每次配置,并重新编译内核前,先执行"make mrproper",清理源代码树,包括清理过去的内核配置文件".config",);make dep(生成内核直接的依赖关系,为编译做好准备)

内核重要文件介绍

  • config
  • vmlinuz 、vmlinux
  • initrd.img
  • System.map
    linux kernel主要文件-图文讲解_第1张图片

根据上图说明一下流程:
1、make menuconfig
根据 先遍历所有目录下的Kconfig,再加载 .config 去生成内核配置信息
当修改make menuconfig 中的图像界面时,会把配置写入到.config和所在目录的Makefile中,
决定内核各个功能是否开启或编译形式
2、vmlinuxz
是 可引导、压缩的内核,“vm”是virtual Memory。Linux 支持虚拟内存,linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinux 是可执行的Linux内核,vmlinuxz 可以由两种方式:1)、编译内核时通过“make zImage” 创建,zImage 使用于小内核的情况,它的存在是为了向后兼容;2)、编译内核使用 bzImage 创建,bzImage 是压缩文件,而且这两个文件的开头部分内前有 gzip 解压缩代码,所以你不能用/也不必 gunzip 或 gzip -dc 解包 vmlinuz。内核文件中包含微型的 gzip 用于解压内核并引导它。两者不同之处在于,老的zImage 解压缩内核到低端内存(第一个640K),bzImage 解压缩内核到高端内存(1M 以上);两种方式引导的系统运行时相同,大的内核采用bzImage,vmlinux是未压缩的内核,vmlinuz 是 vmlinux 压缩文件
3、initrd.img
是 “initial ramdisk”。initrd 一般用来临时引导硬件,直到实际的内核vmlinuz能够接管并继续引导。vmlinuz 被加载到虚拟内存中,而kernel 需要要加载各个 外设的驱动,因为kenel和驱动分离的原因(vmlinuz -> kernel,initrd -> driver),比如上图:initrd-xxx.img 主要是用于加载 ext3 等文件系统及 scsi 设备的驱动。如果你使用的是 scsi 硬盘,而内核 vmlinuz 中并没有这个 scsi 硬件驱动,在装入 scsi 驱动前,内核不能加载 rootfs ,但 scsi 模块在rootfs 的/lib/module 下;为了解决这个问题,可以先引导一个能够读实际内核的 initrd内核,并用initrd 解决 scsi引导问题,initrd-xxx.img 是用 gzip 压缩文件。 initrd 镜像文件是用 mkinitrd 创建(Redhat 特有的),其他Linux 有其他相应实现命令。
3、System.map
是一个特定内核的内核符号表,由"nm vmlinux" 产生,kernel具体实现 /usr/src/linuxxxx/Makefile
>nm vmlinux | grep -v '(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)' | sort > System.map
内核使用C写的,在写代码时会定义一些变量和函数名的符号,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为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的软件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map: /boot/System.map 、/System.map 、/usr/src/linux/System.map

你可能感兴趣的:(linux,kernel,linux,服务器,运维)