gz ファイルを展開しているのは誰?


先日、/dev/fl1 に vmlinux.gz と ramdisk.img.gz が収められていることを 見つけた。

ローダ?

vmlinux.gz と ramdisk.img.gz とは、 どのタイミングで gzip を解かれるのだろうか?
少なくとも vmlinux がカーネルなので、vmlinux 自身が vmlinux.gz を 解くことはできない。

ということは、LILO や GRUB 相当のローダがあるはず。

そして、それはおそらく /dev/fl2 か、見えない ROM? かにあって、

gzip のソースコードを使わずに gz ファイルを展開しているはず

そうでないと、ローダも GPL 下になり、ソースの開示が必要になるので。

ramdisk.img.gz の展開タイミング

fs/super.c に
#define MELCO_EMERGENCY_FS_BOOT
#ifdef  MELCO_EMERGENCY_FS_BOOT
	blkdev_close(bdev->bd_inode, NULL);
	strcpy(root_device_name, "rd/0");
	strcpy(ROOT_DEVICE_NAME, root_device_name);
	ROOT_DEV = MKDEV (1, 0);
	goto TRY_RAMDISK;	
#endif

	panic("VFS: Unable to mount root fs on %s", kdevname(ROOT_DEV));
こういうコードがある。
(この上のほうには、他にも興味深いコードがあるのだが、また別途)

つまり、よく(?) PC で見る VFS: Unable to mount root fs on ?? と いうカーネルパニックの前に、RAM DISK で再試行している。
Major 1, Minor 0 というと、/dev/ram0 である。 ということは、このあたりで ramdisk.img.gz が展開されているはず。

また、drivers/block/rd.c には、

	/*
	 * If it matches the gzip magic numbers, return -1
	 */
	if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) {
		printk(KERN_NOTICE
		       "RAMDISK: Compressed image found at block %d\n",
		       start_block);
		nblocks = 0;
		goto done;
	}
があるので、このあたりで展開しているに違いない。

今日は、ここまで。


 LinkStation/玄箱 をハックしよう  → /dev/fl1 のヘッダ部
Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
yasunari @ yamasita.jp
山下康成京都府向日市