You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
264 volume VI os16<br />
Script e sorgenti del kernel 265<br />
«<br />
1580022 | //<br />
1580023 | bsize = 0x10000L / MEM_BLOCK_SIZE;<br />
1580024 | }<br />
1580025 | else if (size % MEM_BLOCK_SIZE)<br />
1580026 | {<br />
1580027 | bsize = size / MEM_BLOCK_SIZE + 1;<br />
1580028 | }<br />
1580029 | else<br />
1580030 | {<br />
1580031 | bsize = size / MEM_BLOCK_SIZE;<br />
1580032 | }<br />
1580033 |<br />
1580034 | for (i = 0; i < (MEM_MAX_BLOCKS - bsize) && !found; i++)<br />
1580035 | {<br />
1580036 | for (j = 0; j < bsize; j++)<br />
1580037 | {<br />
1580038 | found = !mb_block_status (i+j);<br />
1580039 | if (!found)<br />
1580040 | {<br />
1580041 | i += j;<br />
1580042 | break;<br />
1580043 | }<br />
1580044 | }<br />
1580045 | }<br />
1580046 |<br />
1580047 | if (found && (j == bsize))<br />
1580048 | {<br />
1580049 | alloc_addr = i - 1;<br />
1580050 | alloc_addr *= MEM_BLOCK_SIZE;<br />
1580051 | alloc_size = bsize * MEM_BLOCK_SIZE;<br />
1580052 | alloc_size = mb_alloc (alloc_addr, (size_t) alloc_size);<br />
1580053 | if (alloc_size address = alloc_addr;<br />
1580067 | allocated->segment = alloc_addr / 16;<br />
1580068 | allocated->size = (size_t) alloc_size;<br />
1580069 | }<br />
1580070 | return (0);<br />
1580071 | }<br />
1580072 | else<br />
1580073 | {<br />
1580074 | errset (ENOMEM);<br />
1580075 | return (-1);<br />
1580076 | }<br />
1580077 |}<br />
1580078 |//----------------------------------------------------------------------<br />
1580079 |static int<br />
1580080 |mb_block_status (int block)<br />
1580081 |{<br />
1580082 | int i = block / 16;<br />
1580083 | int j = block % 16;<br />
1580084 | uint16_t mask = 0x8000 >> j;<br />
1580085 | return ((int) (mb_table[i] & mask));<br />
1580086 |}<br />
104.8.4 kernel/memory/mb_free.c<br />
Si veda la sezione 103.7.<br />
1590001 |#include <br />
1590002 |#include <br />
1590003 |#include <br />
1590004 |#include <br />
1590005 |//----------------------------------------------------------------------<br />
1590006 |static int mb_block_set0 (int block);<br />
1590007 |//----------------------------------------------------------------------<br />
1590008 |void<br />
1590009 |mb_free (addr_t address, size_t size)<br />
1590010 |{<br />
1590011 | unsigned int bstart;<br />
1590012 | unsigned int bsize;<br />
1590013 | unsigned int bend;<br />
1590014 | unsigned int i;<br />
1590015 | addr_t block_address;<br />
1590016 | if (size == 0)<br />
1590017 | {<br />
1590018 | //<br />
1590019 | // Zero means the maximum size.<br />
1590020 | //<br />
1590021 | bsize = 0x10000L / MEM_BLOCK_SIZE;<br />
1590022 | }<br />
1590023 | else<br />
1590024 | {<br />
1590025 | bsize = size / MEM_BLOCK_SIZE;<br />
1590026 | }<br />
1590027 |<br />
1590028 | bstart = address / MEM_BLOCK_SIZE;<br />
1590029 |<br />
1590030 | if (size % MEM_BLOCK_SIZE)<br />
1590031 | {<br />
1590032 | bend = bstart + bsize;<br />
1590033 | }<br />
1590034 | else<br />
1590035 | {<br />
1590036 | bend = bstart + bsize - 1;<br />
1590037 | }<br />
1590038 |<br />
1590039 | for (i = bstart; i > j;<br />
1590061 | if (mb_table[i] & mask)<br />
1590062 | {<br />
1590063 | mb_table[i] = mb_table[i] & ~mask;<br />
1590064 | return (1);<br />
1590065 | }<br />
1590066 | else<br />
1590067 | {<br />
1590068 | return (0); // The block is already set to 0 inside the map!<br />
1590069 | }<br />
1590070 |}<br />
104.8.5 kernel/memory/mb_reference.c<br />
Si veda la sezione 103.7.<br />
1600001 |#include <br />
1600002 |#include <br />
1600003 |//----------------------------------------------------------------------<br />
1600004 |uint16_t *<br />
1600005 |mb_reference (void)<br />
1600006 |{<br />
1600007 | return mb_table;<br />
1600008 |}<br />
1600009 |<br />
104.8.6 kernel/memory/mb_table.c<br />
Si veda la sezione 103.7.<br />
1610001 |#include <br />
1610002 |#include <br />
1610003 |//----------------------------------------------------------------------<br />
1610004 |uint16_t mb_table[MEM_MAX_BLOCKS/16]; // Memory blocks map.<br />
1610005 |//----------------------------------------------------------------------<br />
104.8.7 kernel/memory/mem_copy.c<br />
Si veda la sezione 103.7.<br />
1620001 |#include <br />
1620002 |#include <br />
1620003 |#include <br />
1620004 |//----------------------------------------------------------------------<br />
1620005 |void<br />
1620006 |mem_copy (addr_t orig, addr_t dest, size_t size)<br />
1620007 |{<br />
1620008 | segment_t seg_orig = orig / 16;<br />
1620009 | offset_t off_orig = orig % 16;<br />
1620010 | segment_t seg_dest = dest / 16;<br />
1620011 | offset_t off_dest = dest % 16;<br />
1620012 | ram_copy (seg_orig, off_orig, seg_dest, off_dest, size);<br />
1620013 |}<br />
104.8.8 kernel/memory/mem_read.c<br />
Si veda la sezione 103.7.<br />
1630001 |#include <br />
1630002 |#include <br />
1630003 |#include <br />
1630004 |//----------------------------------------------------------------------<br />
1630005 |size_t<br />
1630006 |mem_read (addr_t start, void *buffer, size_t size)<br />
1630007 |{<br />
1630008 | unsigned int segment = start / 16;<br />
1630009 | unsigned int offset = start % 16;<br />
1630010 | unsigned long int end;<br />
1630011 | end = start;<br />
1630012 | end += size;<br />
1630013 | if (end > 0x000FFFFFL)<br />
1630014 | {<br />
1630015 | size = 0x000FFFFFL - start;<br />
1630016 | }<br />
1630017 | ram_copy (segment, offset, seg_d (), (unsigned int) buffer, size);<br />
1630018 | return (size);<br />
1630019 |}<br />
104.8.9 kernel/memory/mem_write.c<br />
Si veda la sezione 103.7.<br />
1640001 |#include <br />
1640002 |#include <br />
1640003 |#include <br />
1640004 |//----------------------------------------------------------------------<br />
1640005 |size_t<br />
1640006 |mem_write (addr_t start, void *buffer, size_t size)<br />
1640007 |{<br />
1640008 | unsigned int segment = start / 16;<br />
1640009 | unsigned int offset = start % 16;<br />
1640010 | unsigned long int end;<br />
1640011 | end = start;<br />
1640012 | end += size;<br />
1640013 | if (end > 0x000FFFFFL)<br />
1640014 | {<br />
1640015 | size = 0x000FFFFFL - start;<br />
«<br />
«<br />
«<br />
«<br />
«