カーネルソースを読む ( 2 ) ~カーネルファイル~

July 11, 2017

カーネルの実体

Linux カーネルは vmlinux というファイル 1 つで構成されている。 実際には vmlinux そのままではなく、gzip で圧縮された vmlinuz というファイルが、/boot 配下に置かれている。

$ ls -l /boot/

total 113612
-rw-r--r--. 1 root root   137701 May 28 17:12 config-3.10.0-514.21.2.el7.x86_64
drwxr-xr-x. 2 root root       39 Jun 13 15:37 grub/
drwx------. 6 root root      111 Jun 29 09:37 grub2/
-rw-------. 1 root root 38189435 Jun 13 15:29 initramfs-0-rescue-2c0164cc85e344b6837514530c15f0d7.img
-rw-------. 1 root root 37708703 Jun 13 15:33 initramfs-3.10.0-514.21.2.el7.x86_64.img
-rw-------. 1 root root 26103785 Jun 27 02:58 initramfs-3.10.0-514.21.2.el7.x86_64kdump.img
-rw-r--r--. 1 root root   277955 May 28 17:13 symvers-3.10.0-514.21.2.el7.x86_64.gz
-rw-------. 1 root root  3114214 May 28 17:12 System.map-3.10.0-514.21.2.el7.x86_64
-rwxr-xr-x. 1 root root  5396288 Jun 13 15:29 vmlinuz-0-rescue-2c0164cc85e344b6837514530c15f0d7
-rwxr-xr-x. 1 root root  5396288 May 28 17:12 vmlinuz-3.10.0-514.21.2.el7.x86_64

以下、掻い摘んで説明。

  • vmlinuz-3.10.0-514.21.2.el7.x86_64: カーネルの実体
  • initramfs-3.10.0-514.21.2.el7.x86_64.img: 初期 RAM ディスク
  • System.map-3.10.0-514.21.2.el7.x86_64: vmlinux のシンボルファイルでデバッグ用に用いられる。カーネル起動には不要。
  • grub2: ブートローダーが格納されている

file コマンドによりファイルタイプを判別できる。

$ file vmlinuz-3.10.0-514.21.2.el7.x86_64 

vmlinuz-3.10.0-514.21.2.el7.x86_64: Linux kernel x86 boot executable bzImage, version 3.10.0-514.21.2.el7.x86_64 (mockbuild@x86-037.build.eng.bos.red, RO-rootFS, swap_dev 0x5, Normal VGA

ちなみに、file コマンドがどのようにファイルタイプを識別しているかというと、ファイルの先頭部分を読み込んで、データパターンを探しているんですね。 識別ルールは /usr/share/file/magic で定義されています。

$ cat /usr/share/file/magic | grep 'boot sector'

0x1FE	leshort	0xAA55			x86 boot sector
#30	search/481	\x55\xAA	x86 boot sector
#(11.s-2) uleshort	0xAA55		x86 boot sector
#If the boot sector fails to read any other sector,
#If the boot sector fails to find needed program in the root directory,
#If the boot sector fails to read any other sector,
#If the boot sector fails to find needed program in the root directory,
>>>>>>>50	uleshort	>6		\b, Backup boot sector %u
#>>>>>>>50	uleshort	=6		\b, Backup boot sector %u (usual) 
>>>>>>>50	uleshort	<6		\b, Backup boot sector %u
>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
>0x1FE	leshort		0xAA55		\b, x86 hard disk boot sector
# strength is changed to try these patterns before "x86 boot sector"
>497		leshort		0		x86 boot sector
# Linux boot sector thefts.
>0x1e6		belong		!0x454c4b53	style boot sector

この

0x1FE	leshort	0xAA55			x86 boot sector

ですが、“ファイルの先頭から「1FE」バイト目に「リトル・エンディアン」で「0xAA55」という 2 バイト値があれば、Linux カーネルのブート・ファイルであるとしろ” という意味です。
よって、実際に見てみると、

$ hexdump -C /boot/vmlinuz-3.10.0-514.21.2.el7.x86_64 | less

00000150  00 00 00 00 00 00 00 00  00 00 00 00 00 00 20 00  |.............. .|
00000160  50 60 2e 72 65 6c 6f 63  00 00 20 00 00 00 e0 41  |P`.reloc.. ....A|
00000170  00 00 20 00 00 00 e0 41  00 00 00 00 00 00 00 00  |.. ....A........|
00000180  00 00 00 00 00 00 40 00  10 42 2e 74 65 78 74 00  |......@..B.text.|
00000190  00 00 30 0b 52 00 00 42  00 00 30 0b 52 00 00 42  |..0.R..B..0.R..B|
000001a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 20 00  |.............. .|
000001b0  50 60 2e 62 73 73 00 00  00 00 d0 02 ea 00 30 4d  |P`.bss........0M|
000001c0  52 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |R...............|
000001d0  00 00 00 00 00 00 80 00  00 c8 00 00 00 00 00 00  |................|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 ff  |................|
000001f0  ff 20 01 00 b3 20 05 00  00 00 ff ff 00 00 55 aa  |. ... ........U.|
                                                     ↑ここ

ありましたね。これがブートフラグ ( 0xAA55 ) です


 © 2023, Dealing with Ambiguity