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. > > http://www.phoenix.com/resources/userman.pdf 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 _______________________________________________ Linuxbios mailing list [EMAIL PROTECTED] http://www.clustermatic.org/mailman/listinfo/linuxbios