Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 May 2000 09:29:27 -0400
From:      Coleman Kane <cokane@one.net>
To:        Poul-Henning Kamp <phk@critter.freebsd.dk>
Cc:        Peter Edwards <peter.edwards@openet-telecom.com>, hackers@FreeBSD.ORG, Coleman Kane <cokane@one.net>
Subject:   Re: mmap cdev function in device drivers
Message-ID:  <20000509092927.B3204@cokane.yi.org>
In-Reply-To: <24302.957866284@critter.freebsd.dk>; from phk@critter.freebsd.dk on Tue, May 09, 2000 at 05:58:53AM -0400
References:  <3917E087.B2477FA0@openet-telecom.com> <24302.957866284@critter.freebsd.dk>

next in thread | previous in thread | raw e-mail | index | archive | help
Poul-Henning Kamp had the audacity to say:
> A good example to look at is the pci/xrpu.c file, that driver
> barely does anything but a mmap.
> 
> Poul-Henning
> 

Hey, thanks. That's a great idea. I'll check that out. I've been leafing through
the rather monolithic meteor, brooktree, and even the PCI pcm code.

> In message <3917E087.B2477FA0@openet-telecom.com>, Peter Edwards writes:
> >Hi,
> >Just trying to take some of the aforementioned "magic" out of i386_btop
> >/ vtop :-)
> >
> >>    return( atop(vtophys(bktr->bigbuf) + offset) );
> >
> >atop  (I assume) stands for "address to page" (given a pointer, give the
> >number of the page it is in)
> >vtophys is "virtual to physical". (given a pointer in a virtual address
> >space, find out the physical address of the backing memory.)
> >
> >My understanding is that mmap(2) will allocate a portion of the calling
> >process's address space, and for each page it needs to map, will call
> >the device's mmap function, giving it the calculated offset (and the
> >protection attributes).
> >
> >The device's mmap returns the index of the physical page of the memory
> >to be inserted under the virtual addresses the process sees.
> >
> >simplified_mmap_syscall_for_device(dev_t device, size_t len, off_t
> >offset)
> >{
> >	caddr_t ptr = alloc_address_space(len);
> >
> >	assert(ptr % PAGESIZE == 0);
> >
> >	while (len) {
> >		pageno = device->mmap(offset); /* Call device's mmap */
> >		map_address_to_page(ptr, pageno);
> >		len -= PAGESIZE;
> >		offset += PAGESIZE;
> >		ptr += PAGESIZE;
> >	}
> >}
> >
> >So, the call above is returning the page number (of the physical address
> >(of bktr->bigbuf)).
> >
> >Of course, My ignorance will probably be corrected in due course!
> >--
> >Peter.
> >
> >
> >To Unsubscribe: send mail to majordomo@FreeBSD.org
> >with "unsubscribe freebsd-hackers" in the body of the message
> >
> 
> --
> Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
> phk@FreeBSD.ORG         | TCP/IP since RFC 956
> FreeBSD coreteam member | BSD since 4.3-tahoe    
> Never attribute to malice what can adequately be explained by incompetence.
> 

-- 
Coleman Kane
President, 
UC Free O.S. Users Group - http://pohl.ececs.uc.edu


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000509092927.B3204>