// kern/process/proc.c// do_execve - call exit_mmap(mm)&put_pgdir(mm) to reclaim memory space of current process// - call load_icode to setup new memory space accroding binary prog.intdo_execve(constchar*name,intargc,constchar**argv){static_assert(EXEC_MAX_ARG_LEN >= FS_MAX_FPATH_LEN);struct mm_struct *mm =current->mm;if(!(argc >=1&& argc <= EXEC_MAX_ARG_NUM)){return-E_INVAL;}char local_name[PROC_NAME_LEN +1];memset(local_name,0,sizeof(local_name));char*kargv[EXEC_MAX_ARG_NUM];constchar*path;int ret =-E_INVAL;lock_mm(mm);if(name ==NULL){snprintf(local_name,sizeof(local_name),"<null> %d",current->pid);}else{if(!copy_string(mm, local_name, name,sizeof(local_name))){unlock_mm(mm);return ret;}}if((ret =copy_kargv(mm, argc, kargv, argv))!=0){unlock_mm(mm);return ret;} path = argv[0];unlock_mm(mm);files_closeall(current->filesp);/* sysfile_open will check the first argument path, thus we have to use a user-space pointer, and argv[0] may be incorrect */int fd;if((ret = fd =sysfile_open(path, O_RDONLY))<0){goto execve_exit;}if(mm !=NULL){lcr3(boot_cr3);if(mm_count_dec(mm)==0){exit_mmap(mm);put_pgdir(mm);mm_destroy(mm);}current->mm =NULL;} ret=-E_NO_MEM;;if((ret =load_icode(fd, argc, kargv))!=0){goto execve_exit;}put_kargv(argc, kargv);set_proc_name(current, local_name);return0;execve_exit:put_kargv(argc, kargv);do_exit(ret);panic("already exit: %e.\n", ret);}