| plan 9 kernel history: overview | file list | diff list |
1991/0802/port/page.c (diff list | history)
| 1991/0801/sys/src/9/port/page.c:51,82 – 1991/0802/sys/src/9/port/page.c:51,101 (short | long | prev | next) | ||
| 1991/0705 | } | |
| 1991/0425 | ||
| 1990/0227 | /* | |
| 1991/0802 | * Called to allocate permanent data structures, before calling pageinit(). * We assume all of text+data+bss is in the first memory bank. | |
| 1990/0227 | */ void* ialloc(ulong n, int align) { ulong p; | |
| 1991/0802 | ulong *ap; | |
| 1990/0227 | ||
| 1990/1212 | if(palloc.active && n!=0) | |
| 1990/0227 | print("ialloc bad\n"); | |
| 1991/0606 |
| |
| 1991/0801 |
| |
| 1991/0802 | if(palloc.addr0 == 0){ palloc.addr0 = ((ulong)&end)&~KZERO; palloc.addr1 = conf.base1; } | |
| 1991/0801 | ||
| 1990/0227 |
| |
| 1991/0606 |
| |
| 1991/0802 | /* * try first bank */ p = align ? PGROUND(palloc.addr0) : palloc.addr0; if(p+n > conf.base0 + (conf.npage0<<PGSHIFT)){ /* * no room in first bank, try second bank */ if(conf.npage1 <= 0) panic("keep bill joy away 1"); p = align ? PGROUND(palloc.addr1) : palloc.addr1; ap = &palloc.addr1; } else ap = &palloc.addr0; | |
| 1991/0606 | ||
| 1990/1211 |
| |
| 1991/0802 | if(p >= conf.maxialloc) panic("keep bill joy away 2"); | |
| 1991/0705 | ||
| 1991/0802 | /* * zero it */ memset((void*)(p|KZERO), 0, n); /* * don't put anything else into a page aligned ialloc */ *ap = align ? PGROUND(p+n) : (p+n); | |
| 1990/0227 | return (void*)(p|KZERO); } | |
| 1991/0801/sys/src/9/port/page.c:83,126 – 1991/0802/sys/src/9/port/page.c:102,156 | ||
| 1990/0227 | void pageinit(void) { | |
| 1991/0802 | ulong np, addr, lim; | |
| 1991/0705 | ulong i, vmem, pmem; | |
| 1990/0227 | Page *p; | |
| 1991/0802 | /* * calculate an upper bound to the number of pages structures * we'll need (np). */ np = (conf.npage0<<PGSHIFT) - (palloc.addr0 - conf.base0); np += (conf.npage1<<PGSHIFT) - (palloc.addr1 - conf.base1); np = np>>PGSHIFT; | |
| 1990/0227 |
| |
| 1991/0705 |
| |
| 1990/0227 |
| |
| 1991/0802 | * allocate Page structs (no more ialloc's allowed after this). * np is useless after this ialloc since we've just eaten up * some pages for the Page structures. | |
| 1990/0227 | */ | |
| 1991/0802 | palloc.head = ialloc(np*sizeof(Page), 0); palloc.active = 1; | |
| 1990/0227 |
| |
| 1991/0705 |
| |
| 1990/0227 |
| |
| 1991/0802 | /* * for each page in each bank, point a page structure to * the page and chain it into the free list */ p = palloc.head; addr = palloc.addr0 = PGROUND(palloc.addr0); lim = conf.base0 + (conf.npage0<<PGSHIFT); for(; addr < lim; addr += BY2PG){ | |
| 1990/0227 | p->next = p+1; p->prev = p-1; | |
| 1990/1211 |
| |
| 1991/0705 |
| |
| 1991/0802 | p->pa = addr; p++; | |
| 1990/0227 | } | |
| 1991/0802 | addr = palloc.addr1 = PGROUND(palloc.addr1); lim = conf.base1 + (conf.npage1<<PGSHIFT); for(; addr < lim; addr += BY2PG){ p->next = p+1; p->prev = p-1; p->pa = addr; p++; } palloc.tail = p - 1; | |
| 1990/0227 | palloc.head->prev = 0; palloc.tail->next = 0; | |
| 1991/0802 | palloc.user = palloc.freecount = p - palloc.head; pmem = palloc.user*BY2PG/1024; vmem = pmem + ((conf.nswap)*BY2PG)/1024; print("%lud free pages, %dK bytes, swap %dK bytes\n", palloc.user, pmem, vmem); | |
| 1990/0227 | } Page* | |