delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/01/23/15:58:48

From: diaz AT margaux DOT inria DOT fr (diaz daniel)
Newsgroups: comp.os.msdos.djgpp
Subject: mmap() or equivalent ???
Date: 23 Jan 1997 10:02:04 GMT
Organization: INRIA Rocquencourt
Lines: 55
Distribution: world
Message-ID: <5c7cus$m8k@news-rocq.inria.fr>
NNTP-Posting-Host: tobago.inria.fr
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

Hello,

I have developped a compiler for a Prolog under linux. It translates Prolog
to asm. Then as produces an object file. This .o file needs to be linked with
a library (containing the prolog engine + builtin prolog predicates). This
library has been written in C.  Now I'd like to port it under w95. DJGPP
seems a the simplest tool to use.  However, the linux system use the mmap()
facility to avoid to test for stack overflows. I explain this in few words:
the prolog engine needs 3 stacks which are widely used. A software test to
detect overflows is very costly and should be icorporated in too parts of my
code. So I use a hardware detection.  I use the mmap() function which "maps"
a file in memory so readings and writings on this file come down to
read/write the memory. I use the device /dev/zero (which always returns 0 on
1st reading and does not "repercut" the writings).  I then mmap() a big space
(sum of the size of the 3 stacks + 3 pages) and I munmap() the page just
after each stack.  I recall that munmap gives back a page to the MMU. So we
have:


     +------------+
     | free page  |
     +------------+
     |     :      |
     |  stack #3  |<- sp3
     |     :      |
     +------------+
     | free page  |
     +------------+
     |     :      |
     |  stack #2  |<- sp2
     |     :      |
     +------------+
     | free page  |
     +------------+
     |     :      |
     |  stack #1  |<- sp1
     |     :      |
     +------------+

So as soon as an overflow occurs (trying to read/write just after a stack)
the MMU trigger a signal SIGSEGV. I just recove it via an handler set by the
signal() function. In this function I recove the fault addr and then I detect
which stack has overflowed.

Q: how could I do this (or equivalent) under DJGPP ?

Thank you for you attention.


-- 
Daniel Diaz
INRIA Rocquencourt - 78153 Le Chesnay Cedex
FRANCE               tel: +33 1 39 63 52 67
                email: Daniel DOT Diaz AT inria DOT fr
============================================

- Raw text -


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