低2G为进程空间
开始地址 | 结束地址 | 大小 | 属性 | |
0 | 0xFFFFF | 1M | 保留 | |
0x100000 | 0x102FFF | 栈 | 不固定位置、大小 | |
0x103000 | 0x143FFF | 堆 | 不固定位置、大小 | |
0x400000 | 主程序文件 | 不固定位置、大小 | ||
加载dll | 不固定位置、大小 | |||
0x7ffdd000 | TIB | 位置,大小编译时固定 | ||
0x7FFFE000 | 系统与用户共享数据块 | 位置,大小编译时固定 | ||
0x7FFFF000 | 0x7FFFFFFF | 4K | 进程空间管理列表 | 位置,大小编译时固定 |
一个新进程创建后,第一个执行函数为proc_startup,该函数过程如下
1、初始化进程空间管理器,该数据放在0x7FFFF000固定位置
2、建立堆,全局变量,放在系统栈中,
3、建立文件列表,全局变量,
4、加载主文件
5、根据主文件加载DLL
6、转换用户态
//此函数在进程空间中运行,在整个进程生存期都不会退出,
//无法调用独属于进程的全局变量。
void proc_startup()
{//以下变量为一个进程的全局变量,保存在系统栈中PThread_Stack_Data ptsd=(PThread_Stack_Data)(lpCurrentThread->initialStack-MAIN_STRCK_PARAM);//进入该函数,进程空间已经切换//初始化进程空间管理器mem_user_virtual_init((PMEMORY_BASIC_INFORMATION)(MBI_USER_BASE));//建立 堆;ptsd->heap=mem_heap_create((PMEMORY_BASIC_INFORMATION)(MBI_USER_BASE),2,0x4000,0x4000);ptsd =(PThread_Stack_Data)(lpCurrentThread->initialStack-MAIN_STRCK_PARAM);ptsd->lpFilseList=(LPLISTS)mem_heap_alloc(ptsd->heap,0,sizeof(LISTS));list_init(ptsd->lpFilseList);FATFS fs;f_mount (&fs, "0:", 0 );//1、将文件加载,PXosHandel xh= krLoadLibrary(getCurrentProcess()->filepath);//初始化进程空间,//线性空间为私有DWORD pfile=xh->addr;PIMAGE_NT_HEADERS pnh=(PIMAGE_NT_HEADERS)(((PIMAGE_DOS_HEADER)pfile)->e_lfanew+pfile);//load_file(ptsd->heap,ptsd->lpFilseList,getCurrentProcess()->filepath)asm("call %0": :"r"(pnh->OptionalHeader.AddressOfEntryPoint+pfile));//2、call mainwhile (1){print_farmat_msg("m");}
}
HANDLE get_main_heap()
{return ((PThread_Stack_Data)(lpCurrentThread->initialStack-MAIN_STRCK_PARAM))->heap;
}
LPLISTS get_main_file_list()
{return ((PThread_Stack_Data)(lpCurrentThread->initialStack-MAIN_STRCK_PARAM))->lpFilseList;
}