您尚未登录。

楼主 # 2022-09-15 16:28:48

WM_CH
会员
注册时间: 2018-08-18
已发帖子: 38
积分: 83

bochs调试linux2.4.0内核,制作硬盘镜像文件,开机报错

我在用bochs进行调试,
内核是linux2.4.0【在redhat 7.3上可以编译生成bzImage】

一、
dd命令制作了一个硬盘镜像,
dd if=/dev/zero of=hd.img bs=516096c count=100


二、
前边63扇区安装grub,后边的硬盘空间全部只划分一个分区,
fdisk -u -C100 -S63 -H16 hd.img
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x0d508796.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c').

Command (m for help): c                                            <=================
DOS Compatibility flag is not set

Command (m for help): n                                           <=================
Command action
   e   extended
   p   primary partition (1-4)
p                                                                           <=================
Partition number (1-4): 1                                          <=================
First sector (1-100799, default 1): 63                        <=================
Last sector, +sectors or +size{K,M,G} (63-100799, default 100799):        <=================回车
Using default value 100799

Command (m for help): w                                        <=================
The partition table has been altered!

Syncing disks.



三、
losetup -o 32256 /dev/loop0 hd.img
跳过63x512=32256个字节再挂载

四、
格式化分区
mkfs.ext2 /dev/loop0

五、
将主机用的grub文件拷贝到硬盘镜像中【主机用的是centos6.4】【编译内核用的是redhat7.3】
mount -t ext2 /dev/loop0 /mnt/
mkdir  -p /mnt/boot/grub
cp /boot/grub/stage1 /mnt/boot/grub/
cp /boot/grub/stage2 /mnt/boot/grub/
cp /boot/grub/e2fs_stage1_5 /mnt/boot/grub/
cp /boot/grub/grub.conf /mnt/boot/grub/
ln -s /mnt/boot/grub/grub.conf /mnt/boot/grub/menu.lst

六、
卸载设备
umount /mnt/
losetup -d /dev/loop0
安装grub
grub --device-map=/dev/null
device (hd0) hd.img
geometry (hd0) 100 16 63
root (hd0,0)
setup (hd0)
quit


七、
拷贝内核、busybox制作的文件系统
losetup -o 32256 /dev/loop0 hd.img
mount -t ext2 /dev/loop0 /mnt/
cp bzImage /mnt/boot/vmlinuz
拷贝完文件系统之后,/mnt目录如下
[root@bogon work]# ls /mnt/
bin  boot  dev  etc  linuxrc  lost+found  mnt  proc  root  sbin  sys  tmp  usr  var

注:busybox是我在Redhat7.3上边编译的busybox-0.60.3.tar.bz2




八、
修改/mnt/boot/grub/grub.conf文件:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Linux-2.4.0
        root (hd0,0)
        kernel /boot/vmlinuz rw root=/dev/hda1 init=/linuxrc



卸载
umount /mnt/
losetup -d /dev/loop0



bochs启动后,报错:
Snipaste_2022-09-15_15-41-29.png







我想问一下,
将内核、文件系统放到同一个分区里面,这样的做法是对的吗?
之前想弄ramdisk、initrd啥的,一直弄不成,所以就想让内核直接来挂载我这个唯一的分区得了,结果还是不行。
了解的兄弟帮我解答一下啊,谢谢了。




参考链接:
https://www.linuxidc.com/Linux/2016-11/137354.htm
https://www.linuxidc.com/Linux/2016-11/137353.htm
https://www.linuxidc.com/Linux/2016-11/137343.htm
https://www.linuxidc.com/Linux/2016-11/137342.htm

离线

楼主 #1 2022-11-04 14:42:53

WM_CH
会员
注册时间: 2018-08-18
已发帖子: 38
积分: 83

Re: bochs调试linux2.4.0内核,制作硬盘镜像文件,开机报错

我回来填坑了,修改一下内核文件即可进入命令行:

   1091         } else if (S_ISLNK(inode->i_mode)) {
   1092         //      if (!inode->i_blocks)
   1093                         inode->i_op = &ext2_fast_symlink_inode_operations;
   1094         //      else {
   1095         //              inode->i_op = &page_symlink_inode_operations;
   1096         //              inode->i_mapping->a_ops = &ext2_aops;
   1097         //      }
   1098         } else

原因是对于软连接文件,文件名60字节以内的叫快速链接文件,否则叫普通软连接文件。
我目前没有搞懂为啥,对于快速链接文件,2.4.0内核竟然使用了普通软连接的处理方式。
可能是内核的问题,也可能是格式化工具mke2fs的问题。

贴上运行成功的图:
Linux2.4.0运行成功.png


smile

离线

楼主 #2 2022-11-04 15:08:32

WM_CH
会员
注册时间: 2018-08-18
已发帖子: 38
积分: 83

Re: bochs调试linux2.4.0内核,制作硬盘镜像文件,开机报错

思路是把他访问的块号十六进制打印出来,会是非常大的数字,
但是会翻译成
../bin/busybox
这个字符串的ASCII码。。。

最近编辑记录 WM_CH (2022-11-04 15:08:53)

离线

#3 2024-03-04 17:22:04

songyao
会员
注册时间: 2024-03-04
已发帖子: 1
积分: 1

Re: bochs调试linux2.4.0内核,制作硬盘镜像文件,开机报错

博主看到你内容很有帮助,所以特地注册了一个账号这里回帖一下,同时更正一下博主的说法。

 1091         } else if (S_ISLNK(inode->i_mode)) {
[color=#FF0000]   1092         //      if (!inode->i_blocks) [/color]
   1093                         inode->i_op = &ext2_fast_symlink_inode_operations;
   1094         //      else {
   1095         //              inode->i_op = &page_symlink_inode_operations;
   1096         //              inode->i_mapping->a_ops = &ext2_aops;
   1097         //      }
   1098         } else

针对博主上述的这个说法,这个地方inode->i_blocks,由于ext2文件系统的更新在高版本内核中每个inode会额外分配2个block用于acl规则的存储,
所以inode->i_blocks在低版本ext2中该值是0,但是在更新后的ext2文件系统中该值是2。

2.4.x高版本中已修复此问题

/*
 * Test whether an inode is a fast symlink.
 */
static inline int ext2_inode_is_fast_symlink(struct inode *inode)
{
	int ea_blocks = EXT2_I(inode)->i_file_acl ?
		(inode->i_sb->s_blocksize >> 9) : 0;

	return (S_ISLNK(inode->i_mode) &&
		inode->i_blocks - ea_blocks == 0);
}

高版本如下:
else if (S_ISLNK(inode->i_mode)) {
		if (ext2_inode_is_fast_symlink(inode)) {
			inode->i_op = &ext2_fast_symlink_inode_operations;
			nd_terminate_link(ei->i_data, inode->i_size,
				sizeof(ei->i_data) - 1);
		} else {
			inode->i_op = &ext2_symlink_inode_operations;
			if (test_opt(inode->i_sb, NOBH))
				inode->i_mapping->a_ops = &ext2_nobh_aops;
			else
				inode->i_mapping->a_ops = &ext2_aops;
		}
	}

同时再针对这个软连长度问题也说明一下:

struct ext2_inode_info {
	__u32	i_data[15];
	__u32	i_flags;
	__u32	i_faddr;
	__u8	i_frag_no;
	__u8	i_frag_size;
	__u16	i_osync;
	__u32	i_file_acl;
	__u32	i_dir_acl;
	__u32	i_dtime;
	__u32	not_used_1;	/* FIX: not used/ 2.2 placeholder */
	__u32	i_block_group;
	__u32	i_next_alloc_block;
	__u32	i_next_alloc_goal;
	__u32	i_prealloc_block;
	__u32	i_prealloc_count;
	__u32	i_high_size;
	int	i_new_inode:1;	/* Is a freshly allocated inode */
};

在2.4.0版本,上面是一个ext2_inode的相关结构,如果一个软连接字符长度不超过15,那么该字符串将会被存放到i_data结构中,也就是说这个inode的block就是0,所以可以直接使用ext2_fast_symlink_inode_operations相关结构进行操作即可。如果一个软连接的长度超过15个字节,i_date此时就不够用了,那么该名称字符串需要重新申请一个block进行存储,基于文件申请缓存的原则,需要先申请一个page然后再把该page的内容写入到block中。而page_symlink_inode_operations就是提供了该inode对其page的操作,先从page中找找不到再从block找。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn