2004-10-06 16:57:47

by Michael Baumann

[permalink] [raw]
Subject: Problem trying to implement mmap for device on 2.4

Sorry if this is too much of a noob question - do point me to the right place
if you can.
System: PPC on VME
Attempting driver for 3rd party NVRAM board - it's meant to be used as
a data-store/system-state recorder. Will be used by more than one
processor in the system - each processor is to use a "chunk" of the RAM
as it's scratch space. Or that's the plan.

Based on what I thought I understood from Rubini&Corbet 2nd Edition
I created a simple module, that provided a mmap method - after reserving
the region via request_mem_region.

mapping was done with a simple remap_page_range()

In userland, the mmap system call is made, with MAP_FIXED
and the kernel immediately fails the call with "cannot allocate memory" -
never even getting to my implementation of the mmap call. Apparently
dying somewhere during "the good deal of work" Rubini talks about.
If I don't use MAP_FIXED, things 'work', but I need that fixed location,
I'm obviously trying to map the RAM into user space for access.


I'm assuming I'm missing something simple in the setup, somewhere.
Any help/pointers/ even insults accepted - I'm in a tough spot here.


--
--
#include <std_disclaimer>
Michael Baumann 9518974841
Optivus Technology, Inc.


2004-10-06 17:24:55

by Richard B. Johnson

[permalink] [raw]
Subject: Re: Problem trying to implement mmap for device on 2.4

On Wed, 6 Oct 2004, Michael Baumann wrote:

> Sorry if this is too much of a noob question - do point me to the right place
> if you can.
> System: PPC on VME
> Attempting driver for 3rd party NVRAM board - it's meant to be used as
> a data-store/system-state recorder. Will be used by more than one
> processor in the system - each processor is to use a "chunk" of the RAM
> as it's scratch space. Or that's the plan.
>
> Based on what I thought I understood from Rubini&Corbet 2nd Edition
> I created a simple module, that provided a mmap method - after reserving
> the region via request_mem_region.
>
> mapping was done with a simple remap_page_range()
>
> In userland, the mmap system call is made, with MAP_FIXED
> and the kernel immediately fails the call with "cannot allocate memory" -
> never even getting to my implementation of the mmap call. Apparently
> dying somewhere during "the good deal of work" Rubini talks about.
> If I don't use MAP_FIXED, things 'work', but I need that fixed location,
> I'm obviously trying to map the RAM into user space for access.
>

If you have implimented mmap() in your driver, you use MAP_FILE.
You receive a pointer to your data-space in your board.

>
> I'm assuming I'm missing something simple in the setup, somewhere.
> Any help/pointers/ even insults accepted - I'm in a tough spot here.
>
>
> --
> --

MAP_FIXED is for when you have some physical memory location you
need to access (like a screen buffer at 0x000b8000).

Cheers,
Dick Johnson
Penguin : Linux version 2.6.5-1.358-noreg on an i686 machine (5537.79 BogoMips).
Note 96.31% of all statistics are fiction.