解决Unable to read partition table of drive0 kernel panic: in swapper task - not syncing

在Linux0.11上运行Bochs报错信息如下:

dev 0300, block 0

Unable to read partition table of drive0

kernel panic: In swapper task - not syncing

        这是相当严重的错误,笔者在完成哈工大蓝桥云上的操作系统实验时因为这个问题困扰了两天,最初我还以为是VM Ware出问题了,克隆了好几个系统来做这个实验,重新编译linux0.11等等都没能解决这个问题,无论是代码还是makefile都尝试个遍都没法发现Bug在哪。

        经过一系列的调试后发现问题出在sys.h中,我不同于以往的将系统调用放在最后面,而是放在了最前面,如图1所示:

图1 错误示范

正确做法应该是将其放置于最后,如图2所示:

图2 正确示范


        这个问题主要出在sys.h的末尾处:`n_ptr sys_call_table[]` 中的顺序需要与前面声明的系统调用函数一一对应。在 Linux 内核中,系统调用表 `sys_call_table` 包含了系统调用函数的指针数组,每个系统调用函数对应着表中的一个位置。因此,如果要添加新的系统调用函数,需要确保在 `sys_call_table` 中的位置与前面声明函数的位置是一一对应的。

        这样做是为了确保内核能够正确地将用户空间的系统调用映射到相应的内核函数上。如果顺序不对应,将会导致系统调用与内核函数的映射错误,可能会导致系统调用执行出错或崩溃。

        因此,在添加新的系统调用函数时,需要谨慎地确保 `sys_call_table` 中的顺序与前门声明函数的顺序一一对应。在本例中,由于我们将sys_shmget与sys_shmat声明在了最后面,因此在sys_call_table[]中也自然的应该放在最后面,这样才能正常启动内核。

        希望能帮到你。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值