Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
«<br />
«<br />
186 volume VI os16<br />
104.2.2 kernel/devices/dev_io.c<br />
Si veda la sezione 103.1.1.<br />
60001 |#include <br />
60002 |#include <br />
60003 |#include <br />
60004 |#include <br />
60005 |#include <br />
60006 |#include <br />
60007 |#include <br />
60008 |#include <br />
60009 |#include <br />
60010 |#include <br />
60011 |#include <br />
60012 |#include <br />
60013 |//----------------------------------------------------------------------<br />
60014 |ssize_t<br />
60015 |dev_io (pid_t pid, dev_t device, int rw, off_t offset,<br />
60016 | void *buffer, size_t size, int *eof)<br />
60017 |{<br />
60018 | int dev_major = major (device);<br />
60019 | if (rw != DEV_READ && rw != DEV_WRITE)<br />
60020 | {<br />
60021 | errset (EIO);<br />
60022 | return (-1);<br />
60023 | }<br />
60024 | switch (dev_major)<br />
60025 | {<br />
60026 | case DEV_MEM_MAJOR:<br />
60027 | return (dev_mem (pid, device, rw, offset, buffer, size,<br />
60028 | eof));<br />
60029 | case DEV_TTY_MAJOR:<br />
60030 | return (dev_tty (pid, device, rw, offset, buffer, size,<br />
60031 | eof));<br />
60032 | case DEV_CONSOLE_MAJOR:<br />
60033 | return (dev_tty (pid, device, rw, offset, buffer, size,<br />
60034 | eof));<br />
60035 | case DEV_DSK_MAJOR:<br />
60036 | return (dev_dsk (pid, device, rw, offset, buffer, size,<br />
60037 | eof));<br />
60038 | case DEV_KMEM_MAJOR:<br />
60039 | return (dev_kmem (pid, device, rw, offset, buffer, size,<br />
60040 | eof));<br />
60041 | default:<br />
60042 | errset (ENODEV);<br />
60043 | return (-1);<br />
60044 | }<br />
60045 |}<br />
104.2.3 kernel/devices/dev_kmem.c<br />
Si veda la sezione 103.1.3.<br />
70001 |#include <br />
70002 |#include <br />
70003 |#include <br />
70004 |#include <br />
70005 |#include <br />
70006 |#include <br />
70007 |#include <br />
70008 |#include <br />
70009 |#include <br />
70010 |#include <br />
70011 |#include <br />
70012 |#include <br />
70013 |//----------------------------------------------------------------------<br />
70014 |ssize_t<br />
70015 |dev_kmem (pid_t pid, dev_t device, int rw, off_t offset, void *buffer,<br />
70016 | size_t size, int *eof)<br />
70017 |{<br />
70018 | size_t size_real;<br />
70019 | inode_t *inode;<br />
70020 | sb_t *sb;<br />
70021 | file_t *file;<br />
70022 | void *start;<br />
70023 | //<br />
70024 | // Only read is allowed.<br />
70025 | //<br />
70026 | if (rw != DEV_READ)<br />
70027 | {<br />
70028 | errset (EIO); // I/O error.<br />
70029 | return ((ssize_t) -1);<br />
70030 | }<br />
70031 | //<br />
70032 | // Only positive offset is allowed.<br />
70033 | //<br />
70034 | if (offset < 0)<br />
70035 | {<br />
70036 | errset (EIO); // I/O error.<br />
70037 | return ((ssize_t) -1);<br />
70038 | }<br />
70039 | //<br />
70040 | // Read is selected (and is the only access allowed).<br />
70041 | //<br />
70042 | switch (device)<br />
70043 | {<br />
70044 | case DEV_KMEM_PS:<br />
70045 | //<br />
70046 | // Verify if the selected slot can be read.<br />
70047 | //<br />
70048 | if (offset >= PROCESS_MAX)<br />
70049 | {<br />
70050 | errset (EIO); // I/O error.<br />
70051 | return ((ssize_t) -1);<br />
70052 | }<br />
70053 | //<br />
70054 | // Correct the size to be read.<br />
70055 | //<br />
70056 | if (sizeof (proc_t) < size)<br />
70057 | {<br />
70058 | size = sizeof (proc_t);<br />
70059 | }<br />
70060 | // //<br />
70061 | // // Correct the size to be read.<br />
70062 | // //<br />
Script e sorgenti del kernel 187<br />
70063 | // size_real = ((sizeof (proc_t)) * (PROCESS_MAX - offset));<br />
70064 | // if (size_real < size)<br />
70065 | // {<br />
70066 | // size = size_real;<br />
70067 | // }<br />
70068 | //<br />
70069 | // Get the pointer to the selected slot.<br />
70070 | //<br />
70071 | start = proc_reference ((pid_t) offset);<br />
70072 | break;<br />
70073 | case DEV_KMEM_MMP:<br />
70074 | //<br />
70075 | // Correct the size to be read.<br />
70076 | //<br />
70077 | size_real = (MEM_MAX_BLOCKS/8);<br />
70078 | if (size_real < size)<br />
70079 | {<br />
70080 | size = size_real;<br />
70081 | }<br />
70082 | //<br />
70083 | // Get the pointer to the map.<br />
70084 | //<br />
70085 | start = mb_reference ();<br />
70086 | break;<br />
70087 | case DEV_KMEM_SB:<br />
70088 | //<br />
70089 | // Get a reference to the super block table.<br />
70090 | //<br />
70091 | sb = sb_reference (0);<br />
70092 | //<br />
70093 | // Correct the size to be read.<br />
70094 | //<br />
70095 | if (sizeof (sb_t) < size)<br />
70096 | {<br />
70097 | size = sizeof (sb_t);<br />
70098 | }<br />
70099 | //<br />
70100 | // Get the pointer to the selected super block slot.<br />
70101 | //<br />
70102 | start = &sb[offset];<br />
70103 | break;<br />
70104 | case DEV_KMEM_INODE:<br />
70105 | //<br />
70106 | // Get a reference to the inode table.<br />
70107 | //<br />
70108 | inode = inode_reference (0, 0);<br />
70109 | //<br />
70110 | // Correct the size to be read.<br />
70111 | //<br />
70112 | if (sizeof (inode_t) < size)<br />
70113 | {<br />
70114 | size = sizeof (inode_t);<br />
70115 | }<br />
70116 | //<br />
70117 | // Get the pointer to the selected inode slot.<br />
70118 | //<br />
70119 | start = &inode[offset];<br />
70120 | break;<br />
70121 | case DEV_KMEM_FILE:<br />
70122 | //<br />
70123 | // Get a reference to the file table.<br />
70124 | //<br />
70125 | file = file_reference (0);<br />
70126 | //<br />
70127 | // Correct the size to be read.<br />
70128 | //<br />
70129 | if (sizeof (file_t) < size)<br />
70130 | {<br />
70131 | size = sizeof (file_t);<br />
70132 | }<br />
70133 | //<br />
70134 | // Get the pointer to the selected inode slot.<br />
70135 | //<br />
70136 | start = &file[offset];<br />
70137 | break;<br />
70138 | default:<br />
70139 | errset (ENODEV); // No such device.<br />
70140 | return ((ssize_t) -1);<br />
70141 | }<br />
70142 | //<br />
70143 | // At this point, data is ready to be copied to the buffer.<br />
70144 | //<br />
70145 | memcpy (buffer, start, size);<br />
70146 | //<br />
70147 | // Return size read.<br />
70148 | //<br />
70149 | return (size);<br />
70150 |}<br />
104.2.4 kernel/devices/dev_mem.c<br />
Si veda la sezione 103.1.4.<br />
80001 |#include <br />
80002 |#include <br />
80003 |#include <br />
80004 |#include <br />
80005 |#include <br />
80006 |#include <br />
80007 |#include <br />
80008 |#include <br />
80009 |#include <br />
80010 |#include <br />
80011 |#include <br />
80012 |#include <br />
80013 |//----------------------------------------------------------------------<br />
80014 |ssize_t<br />
80015 |dev_mem (pid_t pid, dev_t device, int rw, off_t offset, void *buffer,<br />
80016 | size_t size, int *eof)<br />
80017 |{<br />
80018 | uint8_t *buffer08 = (uint8_t *) buffer;<br />
80019 | uint16_t *buffer16 = (uint16_t *) buffer;<br />
80020 | ssize_t n;<br />
80021 |<br />
80022 | if (device == DEV_MEM) // DEV_MEM<br />
80023 | {<br />
«