美文网首页
UBUNTU编译LINUX内核(UBUNTU下获取VMLINUX

UBUNTU编译LINUX内核(UBUNTU下获取VMLINUX

作者: Sma11_Tim3 | 来源:发表于2020-04-06 17:24 被阅读0次

1.vmlinux

vmlinux是一个包括linux kernel的静态链接的可运行文件。文件类型是linux接受的可运行文件格式之中的一个(ELF、COFF或a.out)。

2.vmlinuz
vmlinuz是可引导的,压缩的linux内核,“vm”代表的“virtual memory”。
vmlinuz是vmlinux经过gzip和objcopy(*)制作出来的压缩文件。vmlinuz不仅是一个压缩文件,并且在文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

vmlinuz是一个统称。有两种详细的表现形式:zImage和bzImage(big zImage)。

zImage和bzImage的差别在于本身的大小和载入到内存的地址不同。zImage是0~640KB,bzImage是1M以上。假设内核比較小。那么能够採用zImage 或bzImage之中的一个,两种方式引导的系统运行时是同样的。大的内核採用bzImage。不能採用zImage。

  1. 综述
    总结起来就是例如以下的几句话:
    vmlinux 是ELF文件。即编译出来的最原始的文件。

vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后。并经过压缩后的文件
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核

总结了网上获取vmlinux的方法:
方法一:
vmlinux在Ubuntu下获取的最简单(且非hacky)方法是添加ddebs存储库

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01

并安装内核调试符号:

sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym

vmlinux 然后可以在这里找到:

/usr/lib/debug/boot/vmlinux-$(uname -r)

PS:这种方式我在sudo apt-get update时候始终报错


image.png

方法二:
事实是,压缩了vmlinuz文件-出于调试目的,您需要一个未压缩的vmlinux文件(最好是一个带有调试符号的文件-Ubuntu附带的默认vmlinuz-不含调试符号,因为它们被去除了符号) 。

现在,可以将vmlinuz解压缩到vmlinux文件中-但是,这并不容易。首先,您必须在vmlinuz中找到压缩文件开始的字节偏移,然后使用ddzcat仅解压缩必要的部分。详细地,这在“ [ubuntu] How to trace this bug? – Ubuntu Forums – post #4”中进行了解释。简而言之,以下是基于该帖子的示例终端命令日志:

$ od -A d -t x1 /boot/vmlinuz-$(uname -r) | grep '1f 8b 08 00' --colour
0013920 f3 a5 fc 5e 8d 83 70 23 3d 00 ff e0 *1f 8b 08 00*

$ wcalc 13920+12
 = 13932

$ dd if=/boot/vmlinuz-$(uname -r) bs=1 skip=13932 | zcat > vmlinux-$(uname -r)
4022132+0 records in
4022132+0 records out
4022132 bytes (4,0 MB) copied, 42,1695 s, 95,4 kB/s

gzip: stdin: decompression OK, trailing garbage ignored

$ file vmlinux-2.6.32-25-generic 
vmlinux-2.6.32-25-generic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

不明白的可以去baidu或者Google关于vmlinuz解压至vmlinux的相关知识。
方法三:
利用Ubuntu直接编译(我采用的此方法)
首先通过apt-get获取内核代码,当然你可以直接从kernel.org上Git获取代码.
sudo apt-get install linux-source
然后是一些编译需要的
sudo apt-get install libncurses5-dev
将linux-source-4.15.0.tar.bz2解压到/usr/src/目录下
tar -jxf /usr/src/linux-source-4.15.0/linux-source-4.15.0.tar.bz2 -C /usr/src/
获取配置文件
sudo cp /boot/config-4.15.0-88-generic /usr/src/linux-source-4.15.0/.config
然后进入/usr/src/linux-source-4.15.0文件夹中
sudo make -j4
编译要很长一段时间。成功之后在/usr/src/linux-source-4.15.0中就有vmlinux文件了

image.png
vmlinux便是我想要的文件,参与内核调试过程所需要的文件。
如果想继续安装内核,执行:
make -j8 && make modules -j8 && make modules-install -j8 && make install -j8
重点:因为编译过程中会有很大的磁盘损耗,切记自己的磁盘空间一定要充足最后空余20G以上。

相关文章

网友评论

      本文标题:UBUNTU编译LINUX内核(UBUNTU下获取VMLINUX

      本文链接:https://www.haomeiwen.com/subject/spqfhhtx.html