mmap() for a cluster of pages

Gilles Pokam
1998-10-26T11:52:14Z

Hi,

I'm trying to developp my own driver. The problem is that i have to use a
large amount of contiguous memory. For this purpose, in the __get_free_pages()
function, i use an order of 4 (for example).

I have implemented the mmap(), nopage(), open() and release() operations of
the vma and file structures. Like mentionned in the book of Alessandro Rubini,
"Device Driver for Linux", when using more than one page size, the mmap()
is only able to mmap the first page of a page cluster.

I have tried to play with the usage count of the page, but i didn't succeed.
The problem is that, i don't think i have well understand what happens whith
the usage count when a page cluster is mapped !

That is how i was thinking:
I use __get_free_pages to allocates the memory, so the usage count of the
first page in the cluster is already incremented to 1, the rest are zero.
When mmap() calls the nopage() method to retrieve the faulting address, the
later also increments the usage count of the first page (count = 2).After
that, by the next call, the whole block is unloaded because the count of the
other page are 0. So i have tried to increment the usage count of the other
page in the open() method, before the nopage() as been called due to a
faulting address, but it didn't help me!

What happens exactly by the call of the mmap() ? Which steps are involved and
which function increments or decrements the usage count ?

I know for example that the whole block is unloaded after the first call
because the usage count of the other page are somewhere dropped to zero
(by the munmap ??), but i don't know when this step occurs during the mmap()
call.

I will be very honor to receive some information about it.

Thanx,

--
/_/_/_/_/_/_/_/_/_/_/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
POKAM TIENTCHEU Gilles,
Technical University Berlin | Room : FR 2068
Secretariat FR 2-2 | Voice: 030 - 314 73116
Franklinstrasse 28/29 , D-10587 Berlin | Email: pokam@cs.tu-berlin.de
/_/_/_/_/_/_/_/_/_/_/_/_/_//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/