malloc.c
来自「著名的AT&T UNIX v6 源码」· C语言 代码 · 共 165 行
C
165 行
#include "../h/param.h"#include "../h/systm.h"#include "../h/uba.h"#include "../h/map.h"#include "../h/page.h"#include "../h/mem.h"/* * Allocate 'size' units from the given * map. Return the base of the allocated * space. * In a map, the addresses are increasing and the * list is terminated by a 0 size. * The swap map unit is 512 bytes. * Algorithm is first-fit. */malloc(mp, size)struct map *mp;{ register unsigned int a; register struct map *bp; for (bp=mp; bp->m_size; bp++) { if (bp->m_size >= size) { a = bp->m_addr; bp->m_addr += size; if ((bp->m_size -= size) == 0) { do { bp++; (bp-1)->m_addr = bp->m_addr; } while ((bp-1)->m_size = bp->m_size); } return(a); } } return(0);}/* * Free the previously allocated space aa * of size units into the specified map. * Sort aa into map and combine on * one or both ends if possible. */mfree(mp, size, a)struct map *mp;register unsigned int a;{ register struct map *bp; register unsigned int t; bp = mp; for (; bp->m_addr<=a && bp->m_size!=0; bp++); if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { (bp-1)->m_size += size; if (a+size == bp->m_addr) { (bp-1)->m_size += bp->m_size; while (bp->m_size) { bp++; (bp-1)->m_addr = bp->m_addr; (bp-1)->m_size = bp->m_size; } } } else { if (a+size == bp->m_addr && bp->m_size) { bp->m_addr -= size; bp->m_size += size; } else if (size) { do { t = bp->m_addr; bp->m_addr = a; a = t; t = bp->m_size; bp->m_size = size; bp++; } while (size = t); } }}/* * allocate memory * Note: the memory map is stored in the array * `memmap', one bit per page frame. If the * i'th bit of memmap is 0, then page frame i * is free (available), if 1, then it is allocated. * Up to NICMEM free page frame numbers are * stored in the array mem.m_pnum. */memall(base, size)register int *base;{ register int i, pos, ndx, mask; if (size <= 0 || size > freemem) return(0); if (mem.m_free < 0) panic("bad mem free-list"); for(i=size; --i>=0; ) { if (mem.m_free == 0) { pos = lastpos + 1; if (pos >= maxfree) pos = firstfree; while(mem.m_free<NICMEM) { if ((memmap[pos>>5]&masktab[pos&0x1f])==0) mem.m_pnum[mem.m_free++] = pos; if (pos == lastpos) break; if (++pos >= maxfree) pos = firstfree; } if (mem.m_free <= 0) panic("lost mem"); lastpos = pos; } pos = mem.m_pnum[--mem.m_free]; mask = masktab[pos&0x1f]; ndx = pos >> 5; if (memmap[ndx]&mask) panic("dup alloc"); memmap[ndx] |= mask; *base++ = pos; freemem--; } return(size);}/* * Free memory */memfree(base, size)register int *base, size;{ register int ndx, mask; while(--size>=0) { *base &= PG_PFNUM; if (*base<firstfree || *base>=maxfree) panic("bad mem free"); if (mem.m_free < NICMEM && mem.m_free >= 0) mem.m_pnum[mem.m_free++] = *base; ndx = *base >> 5; mask = masktab[*base++ & 0x1f]; if ((memmap[ndx]&mask)==0) panic("dup free"); memmap[ndx] &= ~mask; freemem++; }}/* * Initialize memory map */meminit(first, last){ firstfree = first; maxfree = lastpos = last; freemem = last - first; mem.m_free = 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?