24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

«<br />

«<br />

«<br />

«<br />

262 volume VI os16<br />

104.7.4 kernel/main/menu.c<br />

Si veda la sezione 103.6.<br />

1530001 |#include <br />

1530002 |#include <br />

1530003 |//----------------------------------------------------------------------<br />

1530004 |void<br />

1530005 |menu (void)<br />

1530006 |{<br />

1530007 | k_printf (<br />

1530008 |".------------------------------------------------------------------.\n"<br />

1530009 |"| [h] show this menu |\n"<br />

1530010 |"| [p] process status and memory map |\n"<br />

1530011 |"| [1]..[9] kill process 1 to 9 |\n"<br />

1530012 |"| [A]..[F] kill process 10 to 15 |\n"<br />

1530013 |"| [l] send SIGCHLD to process 1 |\n"<br />

1530014 |"| [a]..[c] run programs ‘/bin/aaa’ to ‘/bin/ccc’ in parallel |\n"<br />

1530015 |"| [f] system file status |\n"<br />

1530016 |"| [n], [N] list of active inodes |\n"<br />

1530017 |"| [m], [M] mount/umount ‘/dev/dsk1’ at ‘/usr/’ |\n"<br />

1530018 |"| [x] exit interaction with kernel and start ‘/bin/init’ |\n"<br />

1530019 |"| [q] quit kernel |\n"<br />

1530020 |"‘------------------------------------------------------------------’\n"<br />

1530021 |);<br />

1530022 |<br />

1530023 |}<br />

104.7.5 kernel/main/run.c<br />

Si veda la sezione 103.6.<br />

1540001 |#include <br />

1540002 |#include <br />

1540003 |#include <br />

1540004 |#include <br />

1540005 |//----------------------------------------------------------------------<br />

1540006 |pid_t<br />

1540007 |run (char *path, char *argv[], char *envp[])<br />

1540008 |{<br />

1540009 | pid_t pid;<br />

1540010 | //<br />

1540011 | pid = fork ();<br />

1540012 | if (pid == -1)<br />

1540013 | {<br />

1540014 | k_perror (NULL);<br />

1540015 | }<br />

1540016 | else if (pid == 0)<br />

1540017 | {<br />

1540018 | execve (path, argv, envp);<br />

1540019 | k_perror (NULL);<br />

1540020 | _exit (0);<br />

1540021 | }<br />

1540022 | return (pid);<br />

1540023 |}<br />

1540024 |<br />

104.8 os16: «kernel/memory.h»<br />

Si veda la sezione 103.7.<br />

1550001 |#ifndef _KERNEL_MEMORY_H<br />

1550002 |#define _KERNEL_MEMORY_H 1<br />

1550003 |<br />

1550004 |#include <br />

1550005 |#include <br />

1550006 |#include <br />

1550007 |//----------------------------------------------------------------------<br />

1550008 |#define MEM_BLOCK_SIZE 256 // 0x0100<br />

1550009 |#define MEM_MAX_BLOCKS 2560 // 655360/256 = 0xA0000/0x0100 = 0x0A00<br />

1550010 |<br />

1550011 |extern uint16_t mb_table[MEM_MAX_BLOCKS/16]; // Memory blocks map.<br />

1550012 |//----------------------------------------------------------------------<br />

1550013 |typedef unsigned long int addr_t;<br />

1550014 |typedef unsigned int segment_t;<br />

1550015 |typedef unsigned int offset_t;<br />

1550016 |//----------------------------------------------------------------------<br />

1550017 |typedef struct {<br />

1550018 | addr_t address;<br />

1550019 | segment_t segment;<br />

1550020 | size_t size;<br />

1550021 |} memory_t;<br />

1550022 |//----------------------------------------------------------------------<br />

1550023 |addr_t address (segment_t segment, offset_t offset);<br />

1550024 |//----------------------------------------------------------------------<br />

1550025 |uint16_t *mb_reference (void);<br />

1550026 |ssize_t mb_alloc (addr_t address, size_t size);<br />

1550027 |void mb_free (addr_t address, size_t size);<br />

1550028 |int mb_alloc_size (size_t size, memory_t *allocated);<br />

1550029 |//----------------------------------------------------------------------<br />

1550030 |void mem_copy (addr_t orig, addr_t dest, size_t size);<br />

1550031 |size_t mem_read (addr_t start, void *buffer, size_t size);<br />

1550032 |size_t mem_write (addr_t start, void *buffer, size_t size);<br />

1550033 |//----------------------------------------------------------------------<br />

1550034 |<br />

1550035 |#endif<br />

104.8.1 kernel/memory/address.c<br />

Si veda la sezione 103.7.<br />

1560001 |#include <br />

1560002 |//----------------------------------------------------------------------<br />

1560003 |addr_t<br />

1560004 |address (segment_t segment, offset_t offset)<br />

1560005 |{<br />

1560006 | addr_t a;<br />

1560007 | a = segment;<br />

1560008 | a *= 16;<br />

1560009 | a += offset;<br />

1560010 | return (a);<br />

1560011 |}<br />

1560012 |<br />

Script e sorgenti del kernel 263<br />

1560013 |<br />

1560014 |<br />

1560015 |<br />

1560016 |<br />

1560017 |<br />

1560018 |<br />

1560019 |<br />

1560020 |<br />

104.8.2 kernel/memory/mb_alloc.c<br />

Si veda la sezione 103.7.<br />

1570001 |#include <br />

1570002 |#include <br />

1570003 |#include <br />

1570004 |#include <br />

1570005 |//----------------------------------------------------------------------<br />

1570006 |static int mb_block_set1 (int block);<br />

1570007 |//----------------------------------------------------------------------<br />

1570008 |ssize_t<br />

1570009 |mb_alloc (addr_t address, size_t size)<br />

1570010 |{<br />

1570011 | unsigned int bstart;<br />

1570012 | unsigned int bsize;<br />

1570013 | unsigned int bend;<br />

1570014 | unsigned int i;<br />

1570015 | ssize_t allocated = 0;<br />

1570016 | addr_t block_address;<br />

1570017 |<br />

1570018 | if (size == 0)<br />

1570019 | {<br />

1570020 | //<br />

1570021 | // Zero means the maximum size.<br />

1570022 | //<br />

1570023 | bsize = 0x10000L / MEM_BLOCK_SIZE;<br />

1570024 | }<br />

1570025 | else<br />

1570026 | {<br />

1570027 | bsize = size / MEM_BLOCK_SIZE;<br />

1570028 | }<br />

1570029 |<br />

1570030 | bstart = address / MEM_BLOCK_SIZE;<br />

1570031 |<br />

1570032 | if (size % MEM_BLOCK_SIZE)<br />

1570033 | {<br />

1570034 | bend = bstart + bsize;<br />

1570035 | }<br />

1570036 | else<br />

1570037 | {<br />

1570038 | bend = bstart + bsize - 1;<br />

1570039 | }<br />

1570040 |<br />

1570041 | for (i = bstart; i > j;<br />

1570066 | if (mb_table[i] & mask)<br />

1570067 | {<br />

1570068 | return (0); // The block is already set to 1 inside the map!<br />

1570069 | }<br />

1570070 | else<br />

1570071 | {<br />

1570072 | mb_table[i] = mb_table[i] | mask;<br />

1570073 | return (1);<br />

1570074 | }<br />

1570075 |}<br />

104.8.3 kernel/memory/mb_alloc_size.c<br />

Si veda la sezione 103.7.<br />

1580001 |#include <br />

1580002 |#include <br />

1580003 |#include <br />

1580004 |#include <br />

1580005 |//----------------------------------------------------------------------<br />

1580006 |static int mb_block_status (int block);<br />

1580007 |//----------------------------------------------------------------------<br />

1580008 |int<br />

1580009 |mb_alloc_size (size_t size, memory_t *allocated)<br />

1580010 |{<br />

1580011 | unsigned int bsize;<br />

1580012 | unsigned int i;<br />

1580013 | unsigned int j;<br />

1580014 | unsigned int found = 0;<br />

1580015 | addr_t alloc_addr;<br />

1580016 | ssize_t alloc_size;<br />

1580017 |<br />

1580018 | if (size == 0)<br />

1580019 | {<br />

1580020 | //<br />

1580021 | // Zero means the maximum size.<br />

«<br />

«

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

Saved successfully!

Ooh no, something went wrong!