On Sun, Oct 27, 2002 at 07:05:58PM -0500, Adam Sulmicki wrote:
you can find nice example how to use it in linux sources (some file in linux/arch/i386/boot, head.S IIRC)
Using it is the easy part, I had to implement it. Fortunately that project got dropped before I tore all my hair off. :)
For example the description in Phoenix's user manual is just plain wrong :/ It will describe an single GDT entry, but it will not say how many entries and what is meaning of each entry.
Some resource, huh? Good thing we have RB.
And don't forget the 32-bit opcodes when in pmode.
Isn't that dependent on D/B flag in appropriate GDT entry? So if I set 16 b it D/B flag in the CS entry, I still should be able to use 16 bit code, even if in 32 bit mode.
Yes! This is, of course, absolutely correct. I just wasn't familiar enough with the descriptor flags. Now I actually know enough to make my own DOS extender. :) (Well, probably not, but a little closer.)
I haven't found a complete descriptor description so I'll post an attempt here. It's basically just different parts of 386intel.txt put together. (That file sure isn't very well structured. Much like the architecture itself I guess. :)
DESC STRUC lim_0_15 DW 0 ; limit bits (0..15) bas_0_15 DW 0 ; base bits (0..15) bas_16_23 DB 0 ; base bits (16..23) access DB 0 ; access byte ; access := P DPL RES1 TYPE [A] ; P:1 Segment present (eg. for swapping to disk) ; DPL:2 Descriptor Privilege Level ; RES1:1 Means this is an application (as opposed to system) segment #if RES1.value ; TYPE:3 Indicates what kind of segment this is and the intended use ; A:1 Accessed bit, set by CPU when the segment is used #else ; TYPE:4 Indicates what kind of segment this is and the intended use #endif gran DB 0 ; granularity byte ; gran := G (B|D|X) O AVL lim_16_19 ; G:1 0=>byte granularity, 1=>page(4k) granularity #if RES1.value #if IS_DATA_SEGMENT ; B:1 Big segment (affects segment bounds) #else ; D:1 Default, determines default operand-size for code segments #endif /* IS_DATA_SEGMENT */ #else ; X:1 unknown, unused? #endif /* RES1.value */ ; O:1 unknown, used for protection? ; AVL:1 Available for use by systems programmers ; lim_16_19:4 limit bits (16..19) bas_24_31 DB 0 ; base bits (24..31) DESC ENDS
//Peter