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