Subject: Re: kernel mem
To: Jason R Thorpe <>
From: David Ferlier <>
List: tech-kern
Date: 01/10/2003 00:19:34
On Thu, Jan 09, 2003 at 02:37:50PM -0800, Jason R Thorpe wrote:
> On Thu, Jan 09, 2003 at 11:34:32PM +0100, David Ferlier wrote:
>  > But let me ask another question. Does uvm_km_alloc alloc contiguous
>  > pages ? (it's not said in the man page, and i am unsure of the meaning
>  > of wired)
> No, it does not.  You should not need to allocate physically contiguous
> pages, in general.  You usually only need to do this for specific devices
> that have stupid DMA controllers, and in that case, you use the bus_dma(9)
> memory allocation primitives to do that.

I just need to copy 4ko from the disk (it's a block bitmap) in ram.

I'll show you what i did. don't pay attention to size, it costs
~ 12 ko (3 x86 pages)

struct vm_map vm_bbmap;
vaddr_t addr;
struct vm_map_entry *lmap;
int oc, len2;
long *ptr;
int written = 0;
void *data;

addr = uvm_km_zalloc (vm_bbmap, size);

now that i allocated, i copy previously readen data from disk stored in
bp->b_data in each space pointed by the member start of each vm_map_entry.

data = bp->b_data;

for (*lmap = vm_bbmap->header, oc = 0; written != SBSIZE && oc <
		vm_bbmap->nentries; oc += 1) {
	ptr = (long *) lmap->start; /* get adress of segment */
	len2 = lmap->end - lmap->start;
	memcpy ((void *)ptr, data, len);
	written += len;
	data += len;
	lmap = lmap->next;

What i want to know is : could i throw out all this stuff, and just do a :

memcpy (addr, bp->b_data, size);

Since pages allocated by uvm_km_alloc are not contiguous, what i think
is that it won't work (other memory will be written)

So what's the preferred way for what i want ?

Thanks in advance,


> -- 
>         -- Jason R. Thorpe <>


David Ferlier	-     ||	- Of Course It Runs NetBSD