www.pudn.com > LFYOS.zip > arch3.c


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