日期:2014-05-16  浏览次数:20685 次

linux 内核镜像
请问   ,linux系统启动后,能后通过文件系统,通过目录找到内核镜像文件?

------解决方案--------------------
是说/boot下的initrd.img么
------解决方案--------------------
内核在装入内存之前是在 /boot/vmlinuz- <version no> .gz
装入内存启动之后的内核镜像是/proc/kcore
------解决方案--------------------
这个问题很简单,内核代码vmlinuz在装入内存之前是二进制代码(分为实模式代码和保护模式代码),以文件形式存在。
当装入内存,开始执行它的实模式代码,然后开始转入执行它的保护模式代码。这些代码本身当然不会太大,就是vmlinuz的内容。但是在他运行过程中,这些内和代码会不断分配新的内存,比如,当创建第一个Kernel thread: idle时,或者当用户执行一个命令创建进程时,clone系统调用内部的内核代码就会分配新的进程映像内存。所以kcore包含整个正在运行中的系统映像,而且会随时变化。这当中当然包括内核代码。具体在什么地方呢,那就看loader启动时把内核装在了什么地方,对于bzImage的映像(大多数linux内核都是这种)是在:0x100000开始的位置以后的代码段就是内核代码,你可以通过从kcore偏移0x100000读出它的内容。当然从这里开始的内容就很丰富了,除了内核的安装代码之外,还有所有的系统调用代码(这包括了内核的方方面面:虚拟内存管理,作业/处理器调度,以及大量的数据),IO设备驱动等等,当然还有所有正在运行的进程映像。虽然大,这个kcore才是真正正在运行中的内核。所有内核代码的位置可以通过/proc/kallsyms找到他们的位置。然后kcore中相应的偏移量,就可以找到对应的代码。

当然,了解内核运作最好的办法还是阅读他的源码,看内核映像的二进制代码还不如看C的源码来得方便。