Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 09 May 2000 10:55:19 +0100
From:      Peter Edwards <peter.edwards@openet-telecom.com>
To:        hackers@freebsd.org
Cc:        Coleman Kane <cokane@one.net>
Subject:   Re: mmap cdev function in device drivers
Message-ID:  <3917E087.B2477FA0@openet-telecom.com>
References:  <20000508020139.A10146@cokane.yi.org> <XFMail.000508154727.doconnor@gsoft.com.au> <20000508133654.A2018@cokane.yi.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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




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