低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;
}