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 -