在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[]中也自然的应该放在最后面,这样才能正常启动内核。
希望能帮到你。