首页 > 其他分享 >xv6 exec系统调用

xv6 exec系统调用

时间:2023-04-21 19:23:25浏览次数:33  
标签:kernel 调用 exec 二进制 elf ELF xv6 文件

exec是一个创建用户地址空间的系统调用。根据一个存储在文件系统中的file来创建用户地址空间。

具体来说,

int
exec(char *path, char **argv)
  1. exec 使用 namei 打开指定的二进制文件路径(kernel/exec.c:26)。

  2. exec 读取ELF(可执行与可链接格式)文件头。xv6应用程序遵循广泛使用的ELF格式,由kernel/elf.h定义。一个ELF二进制文件包含一个ELF文件头(struct elfhdr,位于kernel/elf.h:6)以及一系列程序段头(struct proghdr,位于kernel/elf.h:25)。每个proghdr描述了需要加载到内存中的应用程序的一个部分。xv6程序只有一个程序段头,但其他系统可能会为指令和数据分别设置不同的段。

  3. 首先,通过检查四字节的"magic number"(0x7F, 'E', 'L', 'F',或者 ELF_MAGIC(kernel/elf.h:3)),快速确认文件可能包含一个ELF二进制文件。如果ELF头具有正确的魔术数字,exec假设该二进制文件是格式正确的。

  4. exec使用proc_pagetable(kernel/exec.c:38)分配一个没有用户映射的新页表。

  5. 使用uvmalloc(kernel/exec.c:52)为每个ELF段分配内存,并使用loadseg(kernel/exec.c:10)将每个段加载到内存中。loadseg使用walkaddr查找分配内存的物理地址以在其上写入ELF段的每个页,并使用readi从文件中读取。

这个过程实现了将用户程序的二进制文件从文件系统加载到内存中的用户地址空间,并在适当的内存位置进行存储。在完成加载过程后,内核将控制权返回给用户程序,用户程序便可以在新的地址空间中开始运行。

标签:kernel,调用,exec,二进制,elf,ELF,xv6,文件
From: https://www.cnblogs.com/ijpq/p/17341481.html

相关文章

  • cesium源码编译调试及调用全过程
    完整记录一次cesium源码从下载、打包、调用、调试的全过程。本文使用软件或API版本:VSCodeNode:12.18.3cesium版本:1.94总体步骤:下载源码执行npminstall和npmstart启动web服务打包源码(打包前可以先将申请到的cesium的token更改到ion.js文件中的默认值中)运行测试html页面......
  • python调用imgkit将html转图片pdf问题实例wkhtmltox
    wkhtmltox的下载地址:https://wkhtmltopdf.org/downloads.html或者:https://github.com/wkhtmltopdf/wkhtmltopdf0.12.6版本按网络上的教程会出现一个错误:IOError:wkhtmltopdfexitedwithnon-zerocode1.error:[blank]解决方法参见:https://stackoverflow.com/questions/......
  • java如何使用线程池 new threadPoolExecutor()
    //使用线程池不返回结果脚本中使用的ClassB{privatestaticfinalExecutorServiceexecutor=newThreadPoolExecutor(4,10,3000L,TimeUnit.MILLISECONDS,newArrayBlockingQueue<>(500),newThreadFactoryBuilder().setNameFormat("publish-pool-%d").build(),(......
  • Python调用C程序
    1.将C程序编译为动态库;2.python代码加载动态库调用C函数......
  • PageOffice调用本地office实现多人在线同时编辑Word文档
    说明:多人同时在线编辑文件大多数会出现文档相互覆盖的问题,后保存的文档会覆盖先保存的文档。pageoffice的这个功能可以用程序控制不同用户打开文件后,编辑Word文档中属于自己的区域,并且不会互相影响。1、环境:前端:vue后端:springboot、pageoffice5.4.0.3版本vue+springboot集成pa......
  • xv6 labs Copy-On-Write fork
    虚拟内存提供了一个中间层:内核可以通过将PTE标记为invalid或者read-only来拦截内存引用,这会导致pagefault,此时,你可以通过修改PTE来改变地址的含义。在计算机系统中有一种说法,任何系统问题都可以通过中间层解决。lazyallocation实验提供了一个例子,本次实验将探索另一个例子:copy-o......
  • 请注意游客模式下,调用 wx.operateWXData 是受限的
    报这个错误是因为AppID的问题第一步,在小程序界面点击设置,点击最后一个项目设置  第二步,出现下图右侧弹窗选择红框中的基本信息 第三步,在基本信息中找到appid点击修改,换成小程序中自己的appid即可 ......
  • H5混合开发二维码扫描以及调用本地摄像头
    H5混合开发二维码扫描以及调用本地摄像头 [转]http://www.jianshu.com/p/c952b3a5e1d2今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触......
  • 在Java代码中更优雅地调用Kotlin
    -Kotlin与Java良好的互操作性是其能够快速普及的原因之一。从Java虽然可以访问Kotlin,但是通过下面这些技巧可以让对Kotlin的访问变得更加友好和地道@JvmStaticKotlin中可以使用objectclass创建单例objectAnalytics{funinit(){...}funsend(event:Event){...}......
  • mybatis 调用 oracle 带包存储过程(有out参数)
    https://blog.csdn.net/u010925982/article/details/102958001  1.先写xml映射文件<selectid="call"parameterType="java.util.HashMap"statementType="CALLABLE"resultType="java.util.HashMap"><!--call包名.方法名(参数)-......