mmap()

Kamal R. Prasad kamalp at acm.org
Tue Dec 7 08:51:48 PST 2004


John-Mark Gurney wrote:

>Kamal R. Prasad wrote this message on Mon, Dec 06, 2004 at 11:16 +0530:
>  
>
>>John-Mark Gurney wrote:
>>
>>    
>>
>>>Kamal R. Prasad wrote this message on Sun, Dec 05, 2004 at 00:38 +0530:
>>>
>>>
>>>      
>>>
>>>>I wrote an mmap() interface for a USB device. But when I made a call to 
>>>>it using mmap(), I saw that mmap interface is called 3-4 times. The 
>>>>calls are being made from within mmap() i.e. sys/vm/vm_mmap.c. Can 
>>>>someone tell me if there is something like a re-try going on for some 
>>>>reason?
>>>>        
>>>>
>>>>From userspace, I called it as 
>>>      
>>>
>>>>addr = mmap(NULL, 1024, PROT_READ, MAP_SHARED, fd, 0);
>>>>The version of OS is Freebsd 5.3(stable).
>>>>  
>>>>
>>>>        
>>>>
>>>each mmap call will be called whenever the kernel needs to map that
>>>specific page..  say you map 16k of your device...  it won't map any
>>>of the 16k until the first time it is accessed, then it will call the
>>>mmap routine for each page as it is accessed...  it is also possible that
>>>memory for the mappings needs to be reclaimed, at which point those page
>>>mappings will be reaped, and your mmap function will be called again when
>>>they need to be accessed again..
>>>
>>>
>>>
>>>      
>>>
>>Thanks. But then, the mmap'ed() address was yet to be used by the user 
>>space and I don't see the need for multiple calls to my interface almost 
>>as if in a while loop.  Is there any return value from the mmap() 
>>interface that could trigger another call? I am returning 0 after 
>>setting the param to vtophys(kernel virtual address).
>>    
>>
>
>You are suppose to return 0 on success (that the permission are correct
>and doable i.e. that you can write when the write bit is set) and put
>the phys adder in paddr...
>
>  
>
There was a bug in my  interface routine which probably resulted in too 
many calls.
Something like *paddr=vtophys(base) instead of 
*paddr=vtophys(base+offset) should result in lots of calls to the interface.

>If you look at sys/vm/device_pager.c, you'll see that on line 139, it
>makes sure that the permissions are correct for the entire mapping
>(that the user doesn't try to map for writing a read-only mapping)...
>
>Then later at line 222, is when the actual mapping gets done..
>
>  
>
Thanks. My mmap interface is not strict about permissions [just denies 
PROT_EXEC].

regards
-kamal



More information about the freebsd-hackers mailing list