X-Authentication-Warning: delorie.com: mail set sender to djgpp-bounces using -f From: "Rod Pemberton" 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: 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" 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