搜索
bottom↓
回复: 5
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-9-15 14:29:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 WM_CH 于 2022-9-15 14:37 编辑

我在用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
  1. Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
  2. Building a new DOS disklabel with disk identifier 0x0d508796.
  3. Changes will remain in memory only, until you decide to write them.
  4. After that, of course, the previous content won't be recoverable.

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

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

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

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

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

  21. 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文件:
  1. default=0
  2. timeout=5
  3. splashimage=(hd0,0)/grub/splash.xpm.gz
  4. hiddenmenu
  5. title Linux-2.4.0
  6.         root (hd0,0)
  7.         kernel /boot/vmlinuz rw root=/dev/hda1 init=/linuxrc
复制代码


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



bochs启动后,报错:





我想问一下,
将内核、文件系统放到同一个分区里面,这样的做法是对的吗?
之前想弄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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入85汤圆

2
发表于 2022-9-15 21:10:48 | 只看该作者
很简单啊,就是没有init ,放上init.,弄个busybox就行了

出0入85汤圆

3
发表于 2022-9-15 21:12:46 | 只看该作者
仔细看了,你的文件系统有init,名字对不上而已,内核启动参数指定一下init的路径就行了

出0入0汤圆

4
 楼主| 发表于 2022-9-16 11:03:35 来自手机 | 只看该作者
zdg102 发表于 2022-9-15 21:12
仔细看了,你的文件系统有init,名字对不上而已,内核启动参数指定一下init的路径就行了 ...
(引用自3楼)

老哥,我指定了init=/linuxrc
也试过init=/sbin/init
整个文件系统都是busybox编译的
这俩文件都是符号链接文件,,,

出0入0汤圆

5
 楼主| 发表于 2022-11-4 14:46:32 | 只看该作者
我回来填坑了,修改一下内核文件即可进入命令行:
fs/ext2/inode.c

  1.    1091         } else if (S_ISLNK(inode->i_mode)) {
  2.    1092         //      if (!inode->i_blocks)
  3.    1093                         inode->i_op = &ext2_fast_symlink_inode_operations;
  4.    1094         //      else {
  5.    1095         //              inode->i_op = &page_symlink_inode_operations;
  6.    1096         //              inode->i_mapping->a_ops = &ext2_aops;
  7.    1097         //      }
  8.    1098         } else
复制代码

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

贴上运行成功的图:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

6
 楼主| 发表于 2022-11-4 15:08:21 | 只看该作者
思路是把他访问的块号十六进制打印出来,会是非常大的数字,
但是会翻译成
../bin/busybox
这个字符串的ASCII码。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 02:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表