24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

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 />

«

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!