python 网站开发框架,网站开发合同怎么写,地名公共服务网站建设,管理培训班Info: 普典衡 21020007074 Date: 2023-12-02 一、实验要求#xff08; 10% #xff09; 1. 从操作系统角度理解 MIPS 体系结构 2. 掌握操作系统启动的基本流程 3. 掌握 ELF 文件的结构和功能 二、实验内容及步骤#xff08; 80% #xff09; 把include.mk中的 … Info: 普典衡 21020007074 Date: 2023-12-02 一、实验要求 10% 1. 从操作系统角度理解 MIPS 体系结构 2. 掌握操作系统启动的基本流程 3. 掌握 ELF 文件的结构和功能 二、实验内容及步骤 80% 把include.mk中的 /opt/eldk/usr/bin/mips-4kc- 改成 /OSLAB/compiler/usr/bin/mips_4KC- 查看 gxemul 文件夹该目录下生成了 vmlinux 内核文件 1. ELF 定义 -ELF Executable and Linkable Format 是一种文件格式主要用于 Linux 平台。它用于存储各种类 型的文件包括可执行文件、可重定位文件通常是 .o 文件、共享对象文件如 .so 文件和核 心转储文件。在 Windows 平台中类似的格式是 PE/COFF 。 2. ELF 文件头 -ELF 文件的起始位置是文件头包含关于文件的静态信息。这些信息可以通过 readelf 命令查看。 文件头的结构和参数在 /usr/include/elf.h 中定义分为 32 位版本 Elf32_Ehdr 和 64 位版本 Elf64_Ehdr 这两个版本在大多数内容上是相似的结构如下所示 typedef struct {
Elf32_Half e_type;//Elf 文件类型
Elf32_Half e_machine;//ELF 文件的 CPU 平台属性
Elf32_Word e_version;//ELF 版本信息
Elf32_Addr e_entry;//入口地址
Elf32_Off e_phoff;//程序头表的文件偏移以字节为单位。如果文件没有程序头表则此成员值为零。
Elf32_Off e_shoff;//节头表的文件偏移以字节为单位。如果文件没有节头表则此成员值为零。
Elf32_Word e_flags;//与文件关联的特定于处理器的标志。标志名称采用 EF_machine_flag 形式。
Elf32_Half e_ehsize;//ELF 头的大小以字节为单位
Elf32_Half e_phentsize;//文件的程序头表中某一项的大小以字节为单位。所有项的大小都相同
Elf32_Half e_phnum;//程序头表中的项数。
Elf32_Half e_shentsize;//节头的大小以字节为单位。节头是节头表中的一项。所有项的大小都相同
Elf32_Half e_shnum;//节头表中的项数
Elf32_Half e_shstrndx;//与节名称字符串表关联的项的节头表索引。
} Elf32_Ehdr; 2 补全全 readelf.c 中代码 // get section table addr, section header number and section header size.
shdr (Elf32_Shdr *)(binary ehdr-e_shoff);
sh_entry_count ehdr-e_shnum;
sh_entry_size ehdr-e_shentsize;// for each section header, output section number and section addr.
for (Nr 0; Nr sh_entry_count; Nr) {printf(%d:0x%x\n, Nr, shdr-sh_addr);shdr;
}编译运行结果如下 之前生成的 vmlinux 内核文件为大端存储 big endian 而 testELF 为小端存储 little endian 。 readelf 程序只 能解析后者而不能解析前者因为 readelf 程序使用 c 语言不能简单的读取大端存储的数据。 补全 scse_03.lds OUTPUT_ARCH(mips)
/*
Set the architecture to mips.
*/
ENTRY(_start)
/*
Set the ENTRY point of the program to _start.
*/
SECTIONS
{. 0x80010000;.text : { *(.text) }.data : { *(.data) }.bss : { *(.bss) }/* To do:fill in the correct address of the key sectionssuch as text, data, bss...
*/end . ;
} 生成 vmlinux 后查看各 section 地址 在本次实验中内核入口处设定的起始地址是 0x80000000 而 main 函数的位置在 0x80010000 。入口函 数本例中为 start.S 内部利用 jal 跳转指令来跳转至特定的函数地址。实现跨文件的函数调用时这 种跳转通常先要求将数据存入栈中随后再执行跳转。 补全 boot/start.S /*To do: set up stack you can reference the memory layout in the include/mmu.h
*/
li sp, 0x80400000
jal main
nop 重新 make 执行 gxemul -E testmips -C R3000 -M64 gxemul/vmlinux 命令 补全 lib/print.c 中的 Ip_Print() 函数中缺失部分 for (;;) {{/* scan for the next % */while ((*fmt) ! % (*fmt) ! \0) {OUTPUT(arg, fmt, 1);fmt;}/* flush the string found so far *//* are we hitting the end? */if ((*fmt) \0) {break;}}/* we found a % */fmt;/* check for long *//* check for other prefixes *//* check format flag */if (*fmt -) {ladjust 1, fmt;} else if (*fmt 0) {padc 0, fmt;}for (; IsDigit(*fmt); fmt) {width width * 10 Ctod(*fmt);}if (*fmt .) {fmt;for (; IsDigit(*fmt); fmt) {prec prec * 10 Ctod(*fmt);}}if (*fmt l) {longFlag 1;fmt;}longFlag 0;width 0;ladjust 0;prec 0;padc ;negFlag 0; 再次输入 gxemul -E testmips -C R3000 -M64 gxemul/vmlinux Push lab1 分支 通过 三、心得总结写出自己在完成实验过程中遇到的问题、解决方法以及体会、收获等 10% 遇到的问题与解决方法 1. 交叉编译器路径的配置 开始时遇到交叉编译器路径不正确的问题。通过修改 include.mk 文件中的 CROSS_COMPILE 变量为正确的路径解决了这个问题。 2. 理解并操作 ELF 文件 ELF 文件的复杂结构最初让我感到困惑。通过研究 readelf 工具和 ELF 文件的头部结构我逐渐 理解了它们的组成部分和功能。 3. 内核文件的大端和小端问题 尝试解析不同格式的 ELF 文件时发现 readelf 程序不能解析大端存储的 vmlinux 文件。我了解 到这是由于 C 语言处理字节顺序的方式造成的进而理解了大端和小端存储格式的差异。 4. 编写和调试汇编代码 在补全 boot/start.S 时学会了如何编写 MIPS 汇编代码并理解了汇编层面的函数跳转。 5. 编译和调试 整个实验过程中我反复进行编译、测试和调试以确保每一部分都能正确工作。 体会和收获 1. 深入理解 MIPS 架构 通过这次实验我对 MIPS 架构有了更深入的理解包括其指令集和内存管理方式。 2. 操作系统启动过程的认识 学习了操作系统启动的基本流程特别是 bootloader 的作用以及如何将控制权从 bootloader 转移 到操作系统内核。 3. ELF 文件格式的深入了解 对 ELF 文件格式的研究让我更好地理解了 Linux 下的可执行文件是如何被组织和管理的。 4. 实践编程技能 实验过程中的编码和调试工作提升了我的编程能力特别是在处理底层系统层面的编程时。 5. 解决问题的能力 面对各种挑战和问题我学会了如何系统地分析问题、查找资料并应用知识来找到解决方案。更加自信地面对未来可能遇到的技术挑战。