arch3.c

来自「虚拟地址空间基于文件的操作系统」· C语言 代码 · 共 67 行

C
67
字号
#include"kernel.h"
#include"../memory/memory.h"
#define  WRONG_MEMORY_BODY	(-1)

char *kernel_get_thread_parameter(int thread_id)
{
	extern char _end;
	unsigned int x;
	x=(int)(&_end);
	x=x+PAGE_SIZE;
	x=x&(0xfffff000);
	x=x|(0xc0000000);
	thread_id=2*thread_id;
	return (char *)(x+thread_id*PAGE_SIZE);
}

extern int page_dir[],page_0[];

void notify_physical_block_switch(int thread_id,
	struct thread_physical_block *pb)
{
	int p;

	if((pb->stack_memory_id<0)||(pb->stack_block_id<0))
		p=(int)kernel_get_thread_parameter(thread_id);
	else
		p=(int)get_block_base(pb->stack_memory_id,
			pb->stack_block_id);
	p=(p&(0x3ffff000))|(0x07);page_0[0]=p;

	if((pb->memory_id<0)||(pb->block_id<0))
		p=(int)kernel_get_thread_parameter(thread_id)+PAGE_SIZE;
	else 
		p=(int)get_block_base(pb->memory_id,pb->block_id);
	p=(p&(0x3ffff000))|(0x07);page_0[1]=p;

	reload_cr3_flag++;
	return;
}


char *get_block_base(int memory_base_id,int block_id)
{
	return	kernel_get_thread_parameter(THREAD_NUMBER+1)
		+PAGE_SIZE*block_id;
}

#define STEP	64
int get_memory_amount(int memory_body_id)
{
	int i,j,*p;
	
	if(memory_body_id!=0)
		return WRONG_MEMORY_BODY;
	for(i=0;;i++){
		p=(int *)get_block_base(memory_body_id,i);
		for(j=0;j<1024;j=j+(STEP%1024),p=p+(STEP%1024)){
			*p=0x5a5a5a5a;
			if((*p)!=0x5a5a5a5a)
				return i;
			*p=0xa5a5a5a5;
			if((*p)!=0xa5a5a5a5)
				return i;
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?