8.2.3 运行ELF格式的应用程序
首先我们需要提供一些与ELF格式有关的宏定义。
代码8-7
- #define ELFCLASSNONE 0
- #define ELFCLASS32 1
- #define ELFCLASS64 2
- #define CHECK_ELF_CLASS(p) ((p)->e_ident[4])
- #define CHECK_ELF_CLASS_ELFCLASS32(p)\
- (CHECK_ELF_CLASS(p)==ELFCLASS32)
- /*definition of elf data*/
- #define ELFDATANONE 0
- #define ELFDATA2LSB 1
- #define ELFDATA2MSB 2
- #define CHECK_ELF_DATA(p) ((p)->e_ident[5])
- #define CHECK_ELF_DATA_LSB(p)\
- (CHECK_ELF_DATA(p)==ELFDATA2LSB)
- /*elf type*/
- #define ET_NONE 0
- #define ET_REL 1
- #define ET_EXEC 2
- #define ET_DYN 3
- #define ET_CORE 4
- #define ET_LOPROC 0xff00
- #define ET_HIPROC 0xffff
- #define CHECK_ELF_TYPE(p) ((p)->e_type)
- #define CHECK_ELF_TYPE_EXEC(p)\
- (CHECK_ELF_TYPE(p)==ET_EXEC)
- /*elf machine*/
- #define EM_NONE 0
- #define EM_M32 1
- #define EM_SPARC 2
- #define EM_386 3
- #define EM_68k 4
- #define EM_88k 5
- #define EM_860 7
- #define EM_MIPS 8
- #define EM_ARM 40
- #define CHECK_ELF_MACHINE(p) ((p)->e_machine)
- #define CHECK_ELF_MACHINE_ARM(p)\
- (CHECK_ELF_MACHINE(p)==EM_ARM)
- /*elf version*/
- #define EV_NONE 0
- #define EV_CURRENT 1
- #define CHECK_ELF_VERSION(p) ((p)->e_ident[6])
- #define CHECK_ELF_VERSION_CURRENT(p)\
- (CHECK_ELF_VERSION(p)==EV_CURRENT)
- #define ELF_FILE_CHECK(hdr) ((((hdr) ->e_ident[0])==0x7f)&&\
- (((hdr)->e_ ident[1])=='E')&&\
- (((hdr)->e_ ident[2])=='L')&&\
- (((hdr) ->e_ident[3])=='F'))
- #define PT_NULL 0
- #define PT_LOAD 1
- #define PT_DYNAMIC 2
- #define PT_INTERP 3
- #define PT_NOTE 4
- #define PT_SHLIB 5
- #define PT_PHDR 6
- #define PT_LOPROC 0x70000000
- #define PT_HIPROC 0x7fffffff
- #define CHECK_PT_TYPE(p) ((p)->p_type)
- #define CHECK_PT_TYPE_LOAD(p) (CHECK_PT_TYPE(p)\
- ==PT_LOAD)
代码8-7中,有一部分内容我们曾经使用过,但大部分宏在本书的代码中都未曾用到。这些宏都是根据ELF文件格式标准定义的,具有一定的通用性。朋友们也可以将这些宏用到自己的代码之中。
现在,读者朋友们可以将代码8-7与代码8-5、代码8-4的内容共同保存到一个文件之中,命名为"elf.h"。
然后修改"boot.c"文件,先在文件的开始处将"elf.h"文件包含进来,再把plat_boot函数修改为代码8-6那样。
这样,操作系统部分的代码就算完成了,读者可以尝试编译一下程序,确保没有语法错误。
接下来,我们还需要重新制作一个RAM盘存储设备映像。进入tools目录,将编译生成的测试应用程序main复制到tools中的filesystem目录。使用工具制作一个新的romfs文件系统类型文件,并将这个文件复制到上级目录的"ram.img"文件中。
现在回到我们的操作系统根目录,启动虚拟机,运行操作系统。不出意外的话,您将看到与上一节相同的结果。
- arch: arm
- cpu info: armv4, arm920t, 41009200, ff00fff0, 2
- mach info: name s3c2410x, mach_init addr 0x426c70
- uart_mod:0, desc_in:, desc_out:, converter:
- SKYEYE: use arm920t mmu ops
- Loaded RAM ./leeos.bin
- Loaded RAM ./ram.img
- start addr is set to 0x30000000 by exec file.
- helloworld
- this is a test application
运行ELF文件的应用程序
时间: 2024-11-09 00:52:28