delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2005/11/16/19:45:24

X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f
From: "Rod Pemberton" <donthave AT noreply DOT bit>
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Obtaining the physical address of a pointer using PMODE
Date: Wed, 16 Nov 2005 19:34:53 -0500
Organization: Aioe.org NNTP Server
Lines: 282
Message-ID: <dlgj6n$43s$1@domitilla.aioe.org>
References: <4379c36c_2 AT news DOT ecore DOT net>
NNTP-Posting-Host: pCFjXAYAthfOLF6YhIh1ZA.41.domitilla.aioe.org
X-Complaints-To: abuse AT aioe DOT org
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1441
X-Priority: 3
X-Newsreader: Microsoft Outlook Express 6.00.2800.1437
X-MSMail-Priority: Normal
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

"Roland Zitzke" <NZEONTQYRAHL AT spammotel DOT com> wrote in message
news:4379c36c_2 AT news DOT ecore DOT net...

> I read somewhere, that the pmode/dj extender has a fixed mapping of
pointers
> to physical memory.
> Thus, if I write something like
> unsigned char* p = malloc(1024);
> how can I obtain the physical location of the data pointed to by p,
provided
> that I use pmode?

All the virtual address in DJGPP are offset from some base address.  For any
virtual address in DJGPP, you can use three methods:
1) add __djgpp_base_address  (which is an int)
2) subtract __djgpp_conventional_base   (which is a #define)
3) call __dpmi_get_segment_base_address(_my_ds(), &base)  (where base is an
unsigned long)

PMODEDJ (pmodetsr.exe) is non-paging.  That means you don't have to use a
DPMI function call to map the memory you are about to access.  Basically,
you have a mapped 4Gb page.  With CWSDPMI, you must use a DPMI call to map
the  memory into the DPMI hosts paging tables.  If you don't map the memory
with CWSDPMI, you'll get a SIGSEGV error.

Fortunately, there are some selectors setup in DJGPP that we can use or we'd
need to call these five functions:
      1)  __dpmi_allocate_ldt_descriptors()
      2)  __dpmi_set_descriptor_access_rights()
      3)  __dpmi_set_segment_base_address()
      4)  __dpmi_set_segment_limit()
      5)  __dpmi_allocate...memory...()
            or  __dpmi_map...memory...()
            or  __dpmi_physical_address_mapping()

We have a number of selector to choose from:
cs                      _my_cs(), selector for code segment
ds  data for cs    _my_ds(), selector for data segment used by gcc
ss  same as ds    _my_ss(), selector for stack segment
es  same as ds    selector for psp segment used by gcc
fs                       selector unused, but used for farptrs (farpeek,
farpoke)
gs                      selector for dos segment (1M+64k), and used by libc
dsa alias for ds   __djgpp_ds_alias, automatically mirrors ds
dsl is gs              __djgpp_dos_sel
dds is gs             _dos_ds
cms is gs            _go32_conventional_mem_selector()

__djgpp_nearptr_enable() can be used to boost the segment limit to 4Gb for
cs,ds,es,ss,and dsa
__dpmi_set_segment_limit(_selector_, 0xFFFFFFFFU) can be used to boost the
segment limit to 4Gb for _dos_ds, etc.

Basically, one has a choice of using _dos_ds or _my_ds().  By
default, _dos_ds allows access to all data below 1Mb+64k and
_my_ds() allows access to all data in the program space.  The
advantage of _dos_ds is that it has a base address of zero (0)
e.g., physical addressing, and can be boosted to a 4Gb limit.
It's disadvantage is that special functions instead of standard
C pointers must be used.  The advantage of _my_ds() is that it
can be boosted to a 4Gb limit and standard C pointers can be used.
It's disadvantage is that an offset must be subtracted for physical
addresses.  Using fs has the same issues as _dos_ds.  Allocating
a new local selector provides no advantages over using _dos_ds
or _my_ds().  In all cases, if a paging DPMI server is used, the
memory must be allocated or mapped by the DPMI server first.



Rod Pemberton

PS.   The following 9 tables show what the selector defaults, selectors
after nearptr enable, and selectors after set segment limit for CWSDPMI,
PMODEDJ, and CWSDPR0:

CWSDPMI defaults
selector 0x00a7 : select= cs, base=0x10000000, limit=0x0009ffff,
flags=0x40fb
selector 0x00af : select= ds, base=0x10000000, limit=0x0009ffff,
flags=0x40f3
selector 0x00af : select= ss, base=0x10000000, limit=0x0009ffff,
flags=0x40f3
selector 0x00af : select= es, base=0x10000000, limit=0x0009ffff,
flags=0x40f3
selector 0x008f : select= fs, base=0x00007c00, limit=0x0000ffff,
flags=0x40f3
selector 0x00bf : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00b7 : select=dsa, base=0x10000000, limit=0x0009ffff,
flags=0x40f3
selector 0x00bf : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00bf : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00bf : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3

PMODEDJ defaults
selector 0x03f0 : select= cs, base=0x00110000, limit=0x0009ffff,
flags=0x509b
selector 0x03e8 : select= ds, base=0x00110000, limit=0x0009ffff,
flags=0x5093
selector 0x03e8 : select= ss, base=0x00110000, limit=0x0009ffff,
flags=0x5093
selector 0x03e8 : select= es, base=0x00110000, limit=0x0009ffff,
flags=0x5093
selector 0x00e0 : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x5093
selector 0x03d8 : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03e0 : select=dsa, base=0x00110000, limit=0x0009ffff,
flags=0x5093
selector 0x03d8 : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03d8 : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03d8 : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0x9093

CWSDPR0 defaults
selector 0x00a4 : select= cs, base=0x10000000, limit=0x0009ffff,
flags=0x409b
selector 0x00ac : select= ds, base=0x10000000, limit=0x0009ffff,
flags=0x4093
selector 0x00ac : select= ss, base=0x10000000, limit=0x0009ffff,
flags=0x4093
selector 0x00ac : select= es, base=0x10000000, limit=0x0009ffff,
flags=0x4093
selector 0x008c : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x4093
selector 0x00bc : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00b4 : select=dsa, base=0x10000000, limit=0x0009ffff,
flags=0x4093
selector 0x00bc : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00bc : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00bc : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0xc093


CWSDPMI after __djgpp_nearptr_enable();
selector 0x00a7 : select= cs, base=0x10000000, limit=0xffffffff,
flags=0xc0fb
selector 0x00af : select= ds, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00af : select= ss, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00af : select= es, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x008f : select= fs, base=0x00007c00, limit=0x0000ffff,
flags=0x40f3
selector 0x00bf : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00b7 : select=dsa, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00bf : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00bf : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3
selector 0x00bf : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0xc0f3

PMODEDJ after __djgpp_nearptr_enable();
selector 0x03f0 : select= cs, base=0x00110000, limit=0xffffffff,
flags=0xd09b
selector 0x03e8 : select= ds, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03e8 : select= ss, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03e8 : select= es, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x00e0 : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x5093
selector 0x03d8 : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03e0 : select=dsa, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03d8 : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03d8 : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0x9093
selector 0x03d8 : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0x9093

CWSDPR0 after __djgpp_nearptr_enable();
selector 0x00a4 : select= cs, base=0x10000000, limit=0xffffffff,
flags=0xc09b
selector 0x00ac : select= ds, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00ac : select= ss, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00ac : select= es, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x008c : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x4093
selector 0x00bc : select= gs, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00b4 : select=dsa, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00bc : select=dsl, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00bc : select=dds, base=0x00000000, limit=0x0010ffff,
flags=0xc093
selector 0x00bc : select=cms, base=0x00000000, limit=0x0010ffff,
flags=0xc093


CWSDPMI after __djgpp_nearptr_enable();
          and __dpmi_set_segment_limit(_dos_ds, 0xFFFFFFFFU);
selector 0x00a7 : select= cs, base=0x10000000, limit=0xffffffff,
flags=0xc0fb
selector 0x00af : select= ds, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00af : select= ss, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00af : select= es, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x008f : select= fs, base=0x00007c00, limit=0x0000ffff,
flags=0x40f3
selector 0x00bf : select= gs, base=0x00000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00b7 : select=dsa, base=0x10000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00bf : select=dsl, base=0x00000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00bf : select=dds, base=0x00000000, limit=0xffffffff,
flags=0xc0f3
selector 0x00bf : select=cms, base=0x00000000, limit=0xffffffff,
flags=0xc0f3

PMODEDJ after __djgpp_nearptr_enable();
          and __dpmi_set_segment_limit(_dos_ds, 0xFFFFFFFFU);
selector 0x03f0 : select= cs, base=0x00110000, limit=0xffffffff,
flags=0xd09b
selector 0x03e8 : select= ds, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03e8 : select= ss, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03e8 : select= es, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x00e0 : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x5093
selector 0x03d8 : select= gs, base=0x00000000, limit=0xffffffff,
flags=0x9093
selector 0x03e0 : select=dsa, base=0x00110000, limit=0xffffffff,
flags=0xd093
selector 0x03d8 : select=dsl, base=0x00000000, limit=0xffffffff,
flags=0x9093
selector 0x03d8 : select=dds, base=0x00000000, limit=0xffffffff,
flags=0x9093
selector 0x03d8 : select=cms, base=0x00000000, limit=0xffffffff,
flags=0x9093

CWSDPR0 after __djgpp_nearptr_enable();
          and __dpmi_set_segment_limit(_dos_ds, 0xFFFFFFFFU);
selector 0x00a4 : select= cs, base=0x10000000, limit=0xffffffff,
flags=0xc09b
selector 0x00ac : select= ds, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00ac : select= ss, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00ac : select= es, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x008c : select= fs, base=0x00007c40, limit=0x0000ffff,
flags=0x4093
selector 0x00bc : select= gs, base=0x00000000, limit=0xffffffff,
flags=0xc093
selector 0x00b4 : select=dsa, base=0x10000000, limit=0xffffffff,
flags=0xc093
selector 0x00bc : select=dsl, base=0x00000000, limit=0xffffffff,
flags=0xc093
selector 0x00bc : select=dds, base=0x00000000, limit=0xffffffff,
flags=0xc093
selector 0x00bc : select=cms, base=0x00000000, limit=0xffffffff,
flags=0xc093




- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019