geekos project 1 (ELF文件相关)

一、目的
熟悉ELF文件格式,了解GeekOS系统如何将ELF格式的可执行程序装入到内存,建立内核进程并运行的实现技术。
二、流程
1、修改/geekos/elf.c文件:在函数Parse_ELF_Executable( )中添加代码,分析ELF格式的可执行文件(包括分析得出ELF文件头、程序头,获取可执行文件长度,代码段、数据段等信息),并填充Exe_Format数据结构中的域值。
2、在Linux环境下编译系统得到GeekOS镜像文件。
3、编写一个相应的bochs配置文件。
4、在bochs中运行GeekOS系统显示结果。

 

编译以及启动bochs同project0…
project0遇到的那些错误还是都会遇到一遍233.

然后在project1/src/geekos/ 目录下的elf.c中添加函数:int Parse_ELF_Executable(char *exeFileData, ulong_t exeFileLength,
struct Exe_Format *exeFormat)

原理部分不过多阐释,具体可见我参考的博客。

最后实现为:

 

然后由于编译之后比project0多生成了一个diskc.img文件

所以还需要相应得修改配置文件.bochsrc

最后内容如下:

project0遇到的启动bochs的那些问题project1也会遇到一遍233

 

然后。。。启动。。。

报错如下:

选区_123

 

查了好多。。。一无所获。。。

最后看到一遍博客: 参考博客1

那篇博客里虽然和我遇到的问题不一致。。。

但是死马当做活马医。。。

objdump -d a.exe 查看了反汇编代码。。。。a.exe的路径是project1/build/user/

 

可以看到在_Entry入口处的汇编,首先

sub    $0x1c,%esp

然而程序却抢先在

add    $0x1c,%esp

之前使用leave和lret长跳转返回了,这样程序当然出错了。

我这里是将
  __asm__ __volatile__ (“leave”);
__asm__ __volatile__ (“lret”);
改成了
  __asm__ __volatile__ (“add $0x1c, %esp”);    (注意,原文作者这里把%esp写成$esp,坑死小白啊。。还写错两次)
  __asm__ __volatile__ (“lret”);

就能正常工作了。

 

选区_125

作者: CrazyKK

ex-ACMer@hust,stackoverflow-engineer@sensetime

说点什么

3 评论 在 "geekos project 1 (ELF文件相关)"

提醒
排序:   最新 | 最旧 | 得票最多

学姐,你知道反汇编后是怎么具体修改的吗,我看了src/user中也有a.c 的原始文件,但并没有看出来具体问题在哪里,我觉得修改a.c应该是一个更好的办法

呃,我后来有找到那个entry.c的文件,修改后确实就没有问题了,不过那个second string要从a.c中main函数里拿出来就可以显示全3个了。
感谢学姐能写这么详细的博客,忙了我很多忙。

wpDiscuz