unsigned long 
virtual_to_physical( unsigned long virtual_address, 
                     unsigned long dir_address ) 
{
	
	unsigned long address;
	
	unsigned long *dir = (unsigned long *) dir_address;

	unsigned long tmp;
	
	int d = (int) virtual_address >> 22 & 0x3FF;
    int t = (int) virtual_address >> 12 & 0x3FF;
    int o = (int) (virtual_address & 0xFFF);

	//temos o endereço da pt junto com as flags.
	tmp = (unsigned long) dir[d];
	
	unsigned long *pt = (unsigned long *) (tmp & 0xFFFFF000);
	
	//encontramos o endereço base do page frame.
	tmp = (unsigned long) pt[t];	
	
	address = (tmp & 0xFFFFF000);
	
	return (unsigned long) (address + o);	
};