读书笔记---莱昂氏UNIX源代码分析(三.初始化、进程初始化)
时间:2010-09-21 来源:zhaocen
1.文件malloc.c
此文件仅由两个过程组成:m a l l o c ( 2 5 2 8 ) , m f r e e ( 2 5 5 6 )这两个过程涉及两类存储资源的分配和释放,
这两类存储资源是:
• 主存:它以3 2个字( 6 4字节)为单位。
• 盘交换区(disk swap area):它以2 5 6字( 5 1 2字节)为单位。
对于这两类资源的每一类,各有一些资源图( c o r e m a p或s w a p m a p )记录可用区列表。
指向相应资源图的一个指针作为参数传递给“ m a l l o c”和“m f r e e”,于是这两个过程无需了解它们正处理的资源的类型。
“c o r e m a p”和“s w a p m a p”都是类型为“ m a p”的结构数组,
“m a p”在2 5 1 5行说明。该结构由两个字符指针,亦即无符号整型组成。
struct map { char *m_size; char *m_addr; }
对“c o r e m a p”和“s w a p m a p”的说明分别位于0 2 0 3行和0 2 0 4行。
0203 int coremap[CMAPSIZ]; 0204 int swapmap[SMAPSIZ];
在这里,完全忽略了“m a p”结构—这是一种程序设计捷径,由于装入程序并不检测这一点,所以可以进行这种形式的说明。
在“c o r e m a p”和“s w a p m a p”中的实际列表元素数分别是“C M A P S I Z / 2”和“S M A P S I Z / 2”。
源代码:
malloc(mp, size) struct map *mp; { register int a; register struct map *bp;
//给bp赋值,并以bp的大小当作循环结束条件(map最后一个区域大小为0)
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) //将bp的大小赋值给bp-1区域 return(a); } } return(0); }
/*此过程将一个存储区返回给由“ m p”指定的“资源图”,该区的长度为“ s i z e”,其起始地址为“a a”。此过程的体由一行“ f o r”语句和占多行的一条“ i f”语句组成。*/
2556: mfree(mp, size, aa)
2557: struct map *mp;
2558: {
2559: register struct map *bp;
2560: register int t;
2561: register int a;
2562:
2563: a = aa;
//bp赋值,循环终止条件为,bp区域的起始地址小于或等于a的起始地址 AND bp的大小不等于0
//特别注意for循环最后的;号 2564: for (bp = mp; bp->m_addr<=a && bp->m_size!=0; bp++);
//如果正被返回的区域与列表上一区域相邻 2565: if (bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { 2566: (bp-1)->m_size =+ size; //将上一区域长度加上返回区域长度
//如果正被返回的区域与列表下一区域相邻 2567: if (a+size == bp->m_addr) { 2568: (bp-1)->m_size =+ bp->m_size; //将上一区域长度加上下一区域长度
//合并一个区域后,循环将后面所有区域向前移动
2569: while (bp->m_size) {
2570: bp++;
2571: (bp-1)->m_addr = bp->m_addr;
2572: (bp-1)->m_size = bp->m_size;
2573: }
2574: }
2575: } else {
//如果正被返回区域与下一区域相邻,则合并两个区域
2576: if (a+size == bp->m_addr && bp->m_size) {
2577: bp->m_addr =- size;
2578: bp->m_size =+ size;
2579: } else if (size) do {
2580: t = bp->m_addr;
2581: bp->m_addr = a;
2582: a = t;
2583: t = bp->m_size;
2584: bp->m_size = size;
2585: bp++;
2586: } while (size = t);
2587: }
2588: }
2.文件prc.c