内存管理——线性内存,进程空间

低2G为进程空间

开始地址结束地址大小属性
00xFFFFF1M保留
0x1000000x102FFF不固定位置、大小
0x1030000x143FFF不固定位置、大小
0x400000主程序文件不固定位置、大小
加载dll不固定位置、大小
0x7ffdd000TIB位置,大小编译时固定
0x7FFFE000系统与用户共享数据块位置,大小编译时固定
0x7FFFF0000x7FFFFFFF4K进程空间管理列表位置,大小编译时固定

 

一个新进程创建后,第一个执行函数为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 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;
}

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻雀123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值