低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文章来源:https://www.toymoban.com/news/detail-837057.html
6、转换用户态文章来源地址https://www.toymoban.com/news/detail-837057.html
//此函数在进程空间中运行,在整个进程生存期都不会退出,
//无法调用独属于进程的全局变量。
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 main
while (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;
}
到了这里,关于内存管理——线性内存,进程空间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!