关于 elf loader 的编写

可以使用如下命令观看 elf 文件的信息

readelf -a build/ramdisk.img | vim -

在编写 elf loader 的时候,实际上只有下图这一部分 “Program Headers” 是有用的
在这里插入图片描述
凡是类型为 “LOAD” 的就是需要加载进内存的部分

所以,只要把这些部分加载进内存里,再跳转到 entrypoint 就完事了,是不是很容易啊?

如下,使用 PA3 中的 elf loader 代码:

static uintptr_t loader(PCB *pcb, const char *filename) {
//	1. read program from ramdisk to mem -- invoke ramdisk_read()
//	2. execute the program -- return the entry

	extern size_t ramdisk_read(void *buf, size_t offset, size_t len);

	Elf_Ehdr elfheader;
	
	// 从磁盘/elf文件中读取 elf 头,这部分元数据放在 elf 文件的头部
	ramdisk_read(&elfheader, 0, sizeof(Elf_Ehdr));

	// 检查这个 elf 文件针对的机器架构是否是我们这种架构
	assert(elfheader.e_machine == EXPECT_TYPE);
	// 检查 elf 魔数
	assert(*(uint64_t *)(elfheader.e_ident) == 0x00010102464c457f);

	// Elf_Phdr 的格式和大小刚好是 ELF Program Headers 中的一节 
	Elf_Phdr program_header;

	// 从磁盘/elf文件中 读取第一个 program_header
	ramdisk_read(&program_header, elfheader.e_phoff, sizeof(Elf_Phdr));

	// 进入循环,这个循环会遍历所有的 program_header
	for(int i = 1; i < elfheader.e_phnum; i++) {
		// 如果当前这节 program_header 的类型是 LOAD,那么把它装载进内存
		// 然后再把 program_header.memsize - program_header.filesize 这部分清零
    	if(program_header.p_type == PT_LOAD) {
			ramdisk_read((void *)(program_header.p_vaddr), program_header.p_offset, program_header.p_filesz);
			memset((uint8_t *)(program_header.p_vaddr) +  program_header.p_filesz, 0, program_header.p_memsz - program_header.p_filesz);
		}
		
		// 从磁盘/elf文件中 读取下一个 program_header
		ramdisk_read(&program_header, elfheader.e_phoff + i * elfheader.e_phentsize, sizeof(Elf_Phdr));
	}

	// 返回程序入点
	return elfheader.e_entry; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/520409.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

晶核2024搬砖职业推荐!

在晶核手游的广袤世界中&#xff0c;选择一位适合自己的搬砖角色是每位玩家都必须认真考虑的事情。不同的职业拥有独特的技能和特点&#xff0c;能够在搬砖过程中发挥不同的优势。下面&#xff0c;我们将深入探讨晶核搬砖的四大利器&#xff0c;让你对每个角色有更深入的了解&a…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了&#xff1a; Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏&#xff0c;无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版&#xff0c;https://www.32r.com/soft/38404.html 安装后打开就gg了&#xff1a; 表现…

计算机中数的表示

0. 简介 介绍计算机中数的表示方法&#xff0c;主要内容来自 c s a p p csapp csapp。 1. 整数的表示 包括有符号整数与无符号整数的表示。 假设 w → [ w n − 1 w n − 2 . . . w 0 ] \overrightarrow w[w_{n-1}w_{n-2}...w_0] w [wn−1​wn−2​...w0​] 为一种整数。…

Allavsoft for Mac v3.27.0.8852注册激活版 优秀的视频下载工具

Allavsoft for Mac是一款功能强大的多媒体下载和转换工具&#xff0c;支持从各种在线视频网站和流媒体服务下载视频、音频和图片。它具备批量下载和转换功能&#xff0c;可将文件转换为多种格式&#xff0c;以适应不同设备的播放需求。此外&#xff0c;Allavsoft还提供视频编辑…

windows下部署mongoDB

目录 1. 下载zip安装包并解压&#xff1a;Download MongoDB Community Server | MongoDB 2. 在解压后的文件夹中新建文件夹data及下级文件夹db和log 3. 新建一个mongod.cfg文件&#xff0c;并配置以下内容 4. 在cmd中启动mongodb&#xff0c;并进行验证 5. 部署到本地服务器…

亚信安慧AntDB:打造智慧生态的数据心脏

AntDB的“融合实时”的特性&#xff0c;不仅使得数据库具备了更强大的适应性&#xff0c;更让企业在不同业务场景下能够更好地实现业务目标&#xff0c;释放出更大的商业价值。融合实时的特性让AntDB具有了高度灵活性和实时性&#xff0c;使其能够满足企业在不同业务需求下的快…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号混知近2000篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

uni-app如何实现高性能

这篇文章主要讲解uni-app如何实现高性能的问题&#xff1f; 什么是uni-app&#xff1f; 简单说一下什么是uni-app&#xff0c;uni-app是继承自vue.js&#xff0c;对vue做了轻度定制&#xff0c;并且实现了完整的组件化开发&#xff0c;并且支持多端发布的一种架构&#xff0c…

【Java EE】初识Spring Web MVC

文章目录 &#x1f334;什么是Spring Web MVC&#xff1f;&#x1f338;什么是Servlet呢? &#x1f332;MVC 定义&#x1f338;再理解Spring MVC &#x1f333;如何学习Spring MVC呢&#xff1f;⭕总结 &#x1f334;什么是Spring Web MVC&#xff1f; Spring Web MVC 是基于…

【Linux】使用cloudreve搭建个人网盘并传输文件

Cloudreve 是一个开源的个人网盘系统&#xff0c;能够帮助用户搭建属于自己的私有云存储服务。它支持多种存储后端&#xff0c;包括本地存储、远程FTP/SFTP存储、以及云存储服务如阿里云OSS、腾讯云COS和Amazon S3等。Cloudreve具有友好的用户界面和丰富的功能&#xff0c;比如…

揭秘rmallox病毒:防范、清除、恢复一步到位!

引言&#xff1a; 随着信息技术的快速发展&#xff0c;计算机病毒已成为网络安全领域的一大难题。其中&#xff0c;rmallox病毒是近年来备受关注的一种恶意软件。本文将深入探讨rmallox病毒的特性、传播途径、防范措施、清除方法以及数据恢复技巧&#xff0c;帮助读者全面了解这…

创新指南|涵盖创新管理的一系列终极指南

毫无疑问&#xff0c;创新是过去几十年来最热门的流行语和最具争议的话题之一&#xff0c;尽管很多人已经厌倦了到处听到它&#xff0c;但这个术语和概念它的后面就留在这里。由于这已被证明是无休止的争论来源&#xff0c;因此我们决定创建一系列涵盖创新管理的博客文章&#…

Ideal的使用技巧

一、springcloud项目如何将多个服务放到services中一起启动 1、打开ideal&#xff0c;再view -> Tool Windows -> services 2、在services界面 找到 run configuration type -> springboot即可 二、配置临时的启动参数 1、在edit configurations中 2、选择相应的服务…

红黑树平衡艺术:最大化与最小化红色结点比值的策略与实现

红黑树平衡艺术&#xff1a;最大化与最小化红色结点比值的策略与实现 一、 最大比值的红黑树构造1.1 伪代码示例&#xff1a;1.2 C代码示例&#xff1a; 三、最小比值的红黑树构造3.1 伪代码示例&#xff1a;3.2 C代码示例&#xff1a; 四、结论 红黑树是一种自平衡的二叉搜索树…

动态多目标优化:动态约束多目标优化测试集DCP1-DCP9的TruePF(提供MATLAB代码)

一、进化动态约束多目标优化测试集DCP1-DCP9 参考文献&#xff1a; [1]G. Chen, Y. Guo, Y. Wang, J. Liang, D. Gong and S. Yang, “Evolutionary Dynamic Constrained Multiobjective Optimization: Test Suite and Algorithm,” in IEEE Transactions on Evolutionary Com…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

【Linux】UDP编程{诸多编程接口/三版本服务器/编程常见问题}

文章目录 0.预备知识0.1套接字0.2TCP/UDP0.3大小端问题 1.socket 常见API1.1socket1.2各个接口1.3int bind();1.3网络头文件四件套1.4bzero1.5recvfrom1.6sendto() 2.UDP编程2.1服务器编程2.2客户端编程2.3运行测试2.3.1本机通信2.3.2popen2.3.3strcasestr2.3.4回顾C11智能指针…

Ubuntu20.04配置Kinect 2.0驱动安装和ROS环境下配置以及录制bag包和制作ORB-SLAM数据集

1. 安装libfreenect2 1.1 下载官方文件 git clone https://github.com/OpenKinect/libfreenect2.git cd libfreenect21.2 安装build工具 sudo apt-get install build-essential cmake pkg-config1.3 安装libusb sudo apt-get install libusb-1.0-0-dev1.4 安装urboJPEG su…

如何客观评价5G的现状?

前几天&#xff0c;在知乎上看到一个帖子&#xff0c;热度挺高&#xff1a; 看了一下帖子的回答&#xff0c;基本上都在骂5G。 作为通信行业从业者&#xff0c;我说说我自己的看法。大家姑且听听&#xff0c;一起交流一下。 我们目前所处的这个时代&#xff0c;有一个很大的特点…

练习题(2024/4/6)

1最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target …