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

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

«

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

Saved successfully!

Ooh no, something went wrong!