Page 1 of 1
physical address
Posted: Sun Feb 01, 2009 5:45 am
by i586coder
Hi to all,
it's very long time since my last post here, in fact it's exams
anyway, i have some trouble with physical address in memory
in some modules in my previous kernel (e.g SVGA ) depend on segmentation (real mode), you know in this case i have only less than 1 MB, so i began convert those modules to un-real mode, the code look like this
Code: Select all
enableA20();
initFlat(); //setup GDT,...
asm{ .386p //protected mode
mov edi, 0xB8000 //<---
mov FS:[edi],'A'
}
this code will print
A in Konsole(where 0xB8000= 0xB800*0x10+offset),
but i don't know how to access the memory beyond 1 MB,
in other word what is the physical address to memory above 1 MB ?
to access the second mega byte in memory what i should type in address
Code: Select all
dword address= 0x???????? ;//pointer to second megaByte and so on
asm{ .386p //protected mode
mov edi, address
mov FS:[edi],'A'
}
any suggestion
...
Cheers
a.
T.d
Re: physical address
Posted: Sun Feb 01, 2009 7:33 am
by Hangin10
If you're in UnReal Mode, accessing physical memory doesn't require the use of segments, but they probably still add to the address, so it's most useful (or just plain easier) to zero the segment registers, and use the address size prefix (the assembler will do this for you) in order to do 32bit addressing (in UnReal Mode, you still have 16bit code).
The physical address for anything is just the physical address. The second megabyte is 0x100000, third 0x200000, etc, all the way up to however many physical address bits the processor supports.
(You speak of unreal mode, and then the comments say protected mode; which is it?)
Re: physical address
Posted: Sun Feb 01, 2009 11:23 am
by i586coder
first of all, thank you for replying,...
i will check it right now
Hangin10 wrote:
(You speak of unreal mode, and then the comments say protected mode; which is it?)
hmmm, about the comment
this directive is necessary to enable 32bit opcode in turbo C++ 3.1 e.g (LIDT,.... FS:[],GS:[],....)
since TC is 16bit compiler, & i need some 32bit opcodes
Cheers: ,
a.
T.d
Re: physical address
Posted: Sun Feb 01, 2009 11:29 am
by Hangin10
i586coder wrote:this directive is necessary to enable 32bit opcode in turbo C++ 3.1 e.g (LIDT,.... FS:[],GS:[],....)
since TC is 16bit compiler, & i need some 32bit opcodes
First, there's no difference in opcodes between 16 and 32 bit. If you're in a 16bit mode, a prefix byte is added before the instruction to make it 32bit, and if you're in a 32bit mode, the same prefix byte makes it a 16bit instruction.
If you're in UnReal Mode, this is going to cause problems, because you've told the assembler to make 32bit code when you're in a 16bit mode so it's not going to use the prefix byte needed. The code is actually using just DI rather than EDI, because you're assembler did not add the prefix byte because it thinks the default is 32 bits, when it's 16.
Sorry if this doesn't make much sense, I'm getting rather hungry and lunch isn't for another .5 hours
Re: physical address
Posted: Sun Feb 01, 2009 1:58 pm
by bewing
1. To be in Unreal mode, you need to have switched temporarily to 16bit pmode, and set up at least one segment register to point to a 16bit gdt entry, that points to upper memory.
2. When you switch back to Real mode, you cannot overwrite that segment register -- you need to use the values that were saved into it, when it was in pmode.
3. Use the ADDRESS SIZE override prefix (not the opcode override!) AND the segment register to access upper memory, with a 32bit address register (ebx, esi, edi, ebp).
Re: physical address
Posted: Mon Feb 02, 2009 1:13 am
by i586coder
Hangin10 wrote:i586coder wrote:this directive is necessary to enable 32bit opcode in turbo C++ 3.1 e.g (LIDT,.... FS:[],GS:[],....)
since TC is 16bit compiler, & i need some 32bit opcodes
First, there's no difference in opcodes between 16 and 32 bit. If you're in a 16bit mode, a prefix byte is added before the instruction to make it 32bit, and if you're in a 32bit mode, the same prefix byte makes it a 16bit instruction.
well, i used this code in 16bit compiler
Code: Select all
asm db 0x66
asm mov di,word ptr Address //MOV EDI,Address
asm db 0x67 //32 bit Address Prefix
asm db 0x64 //FS:
asm mov byte ptr [BX],al //=MOV FS:[EDI],AL
is the code above solve the problem
bewing wrote:
To be in Unreal mode, you need to have switched temporarily to 16bit pmode, and set up at least one segment register to point to a 16bit gdt entry, that points to upper memory.
I think my GDT_Table ,isn't bad to point upper memory
Code: Select all
unsigned long GDT_Table[]= {
0,0, //NULL - 00H
0x0000FFFF,0x00CF9A00, //Code32 - 08H Base=0 Limit=4G-1 Size=4G
0x0000FFFF,0x00CF9200 //Data32 - 10H Base=0 Limit=4G-1 Size=4G
};
initFlat(){
;
;
asm LGDT GDT_Table
:
:
// jump to protected mode & return
}
CheerS,
a.
T.d