userseg.c文件中Load_User_Program()函数的功能通过加载可执行文件镜像创建新进程的User_Context结构

代码如下:

int Load_User_Program(char *exeFileData, ulong_t exeFileLength,

    struct Exe_Format *exeFormat, const char *command,

    struct User_Context **pUserContext)

{

  

    // TODO("Load a user executable into a user memory space using segmentation");



    unsigned int i;    

    struct User_Context *userContext = NULL;



    /* 要分配的最大内存空间 */    

    ulong_t maxva = 0;    

    /* 计算用户态进程所需的最大内存空间 */    

    for (i = 0; i < exeFormat->numSegments; i++)    

    {        

        struct Exe_Segment *segment = &exeFormat->segmentList[i];       

        ulong_t topva = segment->startAddress + segment->sizeInMemory;       

        if (topva > maxva) maxva = topva;

    }

    /* 程序参数数目 */    

    unsigned int numArgs;    

    /* 获取参数块的大小 */    

    ulong_t argBlockSize;    

    Get_Argument_Block_Size(command, &numArgs, &argBlockSize);    

    /* 用户进程大小 = 参数块总大小 + 进程堆栈大小(8192) */    

    ulong_t size = Round_Up_To_Page(maxva) + DEFAULT_USER_STACK_SIZE;    

    /* 参数块地址 */    

    ulong_t argBlockAddr = size;    

    size += argBlockSize;    

    /* 按相应大小创建一个进程 */    

    userContext = Create_User_Context(size);    

    /* 如果进程创建失败则返回错误信息 */    

    if (userContext == NULL)    

    {                  

        return -1;    

    }



    /* 将用户程序中的各段内容复制到分配的用户内存空间 */    

    for (i = 0; i < exeFormat->numSegments; i++)    

    {       

        struct Exe_Segment *segment = &exeFormat->segmentList[i];       

        memcpy(userContext->memory + segment->startAddress,               

                exeFileData + segment->offsetInFile,               

                segment->lengthInFile);   

    }



    /* 格式化参数块 */    

    Format_Argument_Block(userContext->memory + argBlockAddr, numArgs, argBlockAddr, command);    

    /* 初始化数据段、堆栈段及代码段信息 */    

    userContext->entryAddr = exeFormat->entryAddr;    

    userContext->argBlockAddr = argBlockAddr;    

    userContext->stackPointerAddr = argBlockAddr;



    /* 将初始化完毕的 User_Context 赋给*pUserContext */    

    *pUserContext = userContext;



    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值