名字不能取太长 2023-07-23 00:01 采纳率: 75.6%
浏览 43
已结题

关于riscv64架构下操作系统中elf程序加载器的实现

我想在我编写的riscv架构的操作系统上实现一个elf文件加载器,用于执行elf格式程序,这是我存储elf文件数据的结构:

//exe info
typedef struct ELFExec {

  loader_env_t user_data;  //用户数据

  char * argv[MAXARGSIZE];
  int argv_size;
  char * envp[MAXARGSIZE];
  int envp_size;

  unsigned long file_size;
  unsigned long sections;
  unsigned long sectionTable;
  unsigned long sectionTableStrings;

  unsigned long symbolCount;
  unsigned long symbolTable;
  unsigned long symbolTableStrings;
  unsigned long entry;

  ELFSection_t text;
  ELFSection_t rodata;
  ELFSection_t data;
  ELFSection_t sdata;
  ELFSection_t bss;
  ELFSection_t init_array;
  ELFSection_t fini_array;
  ELFSection_t sdram_rodata;
  ELFSection_t sdram_data;
  ELFSection_t sdram_bss;

  unsigned int fini_array_size;

}__attribute__((aligned(16))) ELFExec_t;

typedef struct  {
  void *data;
  int secIdx;                   //section index
  unsigned long relSecIdx;      //index in relocation
  unsigned long sec_size;       //size of section(data len)
}__attribute__((aligned(16))) ELFSection_t;

我的设计思路如下:首先通过read系统调用读取elf文件头,提取出信息,然后用read系统调用将各个段(如text,bss,sdata这些)读取并存入ELFExec 这个结构体中的对应成员(如data段读出后存入ELFExec::text::data中),最后跳转到ELFExec::entry指向的位置运行。我的问题如下:
1.我的设计思路有问题吗?
2.我在设计中并未使用mmap做内存映射,而是通过read和lseek等系统调用将elf文件中各个段的内容读入到结构体中存储,这样可以吗?
3.我目前已经实现了这个思路,但是在调试时候发现跳转到ELFExec::entry指向的位置运行一部分代码后会触发异常Load access fault,请问这是为什么?
已经询问过chatgpt和bing ai,并未得到有用的答案,因此来请教各位,感谢各位的热心回答!

  • 写回答

5条回答 默认 最新

  • 王家的小先生 2023-07-23 00:15
    关注

    您的设计思路基本上是正确的。您首先通过读取ELF文件头来提取出信息,然后使用read系统调用将各个段读取到内存中,并将其存储在ELFExec结构体的相应成员中。最后,跳转到ELFExec的entry指向的位置开始执行程序。这是一个常见的ELF加载器的设计思路。

    使用read和lseek系统调用将ELF文件中的各个段读入到结构体中存储是可行的。您不一定需要使用mmap来进行内存映射。通过read和lseek系统调用,您可以将段数据直接读取到指定的内存位置,并将其存储在ELFExec结构体的相应成员中。

    引发"Load access fault"异常可能有多种原因。这可能是由于您的加载器在加载过程中没有正确设置虚拟内存映射,导致尝试访问某些内存区域时引发异常。另外,还可能是由于加载的ELF文件包含了错误的指令或数据,导致异常。您可以通过调试工具、日志输出等方式来定位问题所在,并检查加载的ELF文件和加载器的实现是否正确。

    下述是一些可能导致"Load access fault"异常的常见原因:

    内存映射错误:在加载ELF文件时,如果没有正确映射虚拟地址到物理地址,或者映射的大小不正确,可能会导致访问异常。请确保正确设置虚拟内存映射,并将段数据加载到正确的虚拟地址。

    错误的指令或数据:检查ELF文件中的指令和数据是否正确,是否存在不合法或错误的内容。特别注意代码段的地址对齐和访问权限。

    内存保护:某些ELF文件可能具有特殊的内存保护属性,例如只读段或不可执行段。确保设置了正确的访问权限和内存属性。

    希望上述信息对您有帮助!

    评论
    1人已打赏

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月25日
  • 创建了问题 7月23日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价