我想在我编写的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,并未得到有用的答案,因此来请教各位,感谢各位的热心回答!