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.

284 volume VI os16<br />

Script e sorgenti del kernel 285<br />

1880006 |{<br />

1880007 | pid_t pid;<br />

1880008 | pid_t zombie;<br />

1880009 | memory_t allocated_i;<br />

1880010 | memory_t allocated_d;<br />

1880011 | int status;<br />

1880012 | int fdn;<br />

1880013 | //<br />

1880014 | // Find a free PID.<br />

1880015 | //<br />

1880016 | for (pid = 1; pid < PROCESS_MAX; pid++)<br />

1880017 | {<br />

1880018 | if (proc_table[pid].status == PROC_EMPTY)<br />

1880019 | {<br />

1880020 | break;<br />

1880021 | }<br />

1880022 | }<br />

1880023 | if (pid >= PROCESS_MAX)<br />

1880024 | {<br />

1880025 | //<br />

1880026 | // There is no free pid.<br />

1880027 | //<br />

1880028 | errset (ENOMEM); // Not enough space.<br />

1880029 | return (-1);<br />

1880030 | }<br />

1880031 | //<br />

1880032 | // Before allocating a new process, must check if there are some<br />

1880033 | // zombie slots, still with original segment data: should reset<br />

1880034 | // it now!<br />

1880035 | //<br />

1880036 | for (zombie = 1; zombie < PROCESS_MAX; zombie++)<br />

1880037 | {<br />

1880038 | if ( proc_table[zombie].status == PROC_ZOMBIE<br />

1880039 | && proc_table[zombie].segment_d != -1)<br />

1880040 | {<br />

1880041 | proc_table[zombie].segment_i = -1; // Reset<br />

1880042 | proc_table[zombie].address_i = -1L; // memory<br />

1880043 | proc_table[zombie].size_i = 0; // allocation<br />

1880044 | proc_table[zombie].segment_d = -1; // data<br />

1880045 | proc_table[zombie].address_d = -1L; // to<br />

1880046 | proc_table[zombie].size_d = 0; // impossible<br />

1880047 | proc_table[zombie].sp = 0; // values.<br />

1880048 | }<br />

1880049 | }<br />

1880050 | //<br />

1880051 | // Allocate memory: code and data segments.<br />

1880052 | //<br />

1880053 | if (proc_table[ppid].segment_i == proc_table[ppid].segment_d)<br />

1880054 | {<br />

1880055 | //<br />

1880056 | // Code segment and Data segment are the same<br />

1880057 | // (same I&D).<br />

1880058 | //<br />

1880059 | status = mb_alloc_size (proc_table[ppid].size_i, &allocated_i);<br />

1880060 | if (status < 0)<br />

1880061 | {<br />

1880062 | errset (ENOMEM); // Not enough space.<br />

1880063 | return ((pid_t) -1);<br />

1880064 | }<br />

1880065 | allocated_d.address = allocated_i.address;<br />

1880066 | allocated_d.segment = allocated_i.segment;<br />

1880067 | allocated_d.size = allocated_i.size;<br />

1880068 | }<br />

1880069 | else<br />

1880070 | {<br />

1880071 | //<br />

1880072 | // Code segment and Data segment are different<br />

1880073 | // (different I&D).<br />

1880074 | // Only the data segment is allocated.<br />

1880075 | //<br />

1880076 | status = mb_alloc_size (proc_table[ppid].size_d, &allocated_d);<br />

1880077 | if (status < 0)<br />

1880078 | {<br />

1880079 | errset (ENOMEM); // Not enough space.<br />

1880080 | return ((pid_t) -1);<br />

1880081 | }<br />

1880082 | //<br />

1880083 | // Code segment is the same from the parent process.<br />

1880084 | //<br />

1880085 | allocated_i.address = proc_table[ppid].address_i;<br />

1880086 | allocated_i.segment = proc_table[ppid].segment_i;<br />

1880087 | allocated_i.size = proc_table[ppid].size_i;<br />

1880088 | }<br />

1880089 | //<br />

1880090 | // Copy the process in memory.<br />

1880091 | //<br />

1880092 | if (proc_table[ppid].segment_i == proc_table[ppid].segment_d)<br />

1880093 | {<br />

1880094 | //<br />

1880095 | // Code segment and data segment are the same:<br />

1880096 | // must copy all.<br />

1880097 | //<br />

1880098 | // Copy the code segment: if the size is zero,<br />

1880099 | // it means 0x10000 bytes (65536 bytes).<br />

1880100 | //<br />

1880101 | if (proc_table[ppid].size_i == 0)<br />

1880102 | {<br />

1880103 | //<br />

1880104 | // Copy 0x10000 bytes with two steps.<br />

1880105 | //<br />

1880106 | mem_copy (proc_table[ppid].address_i,<br />

1880107 | allocated_i.address, 0x8000);<br />

1880108 | mem_copy ((proc_table[ppid].address_i + 0x8000),<br />

1880109 | (allocated_i.address + 0x8000), 0x8000);<br />

1880110 | }<br />

1880111 | else<br />

1880112 | {<br />

1880113 | //<br />

1880114 | // Normal copy.<br />

1880115 | //<br />

1880116 | mem_copy (proc_table[ppid].address_i, allocated_i.address,<br />

1880117 | proc_table[ppid].size_i);<br />

1880118 | }<br />

1880119 | }<br />

1880120 | else<br />

1880121 | {<br />

1880122 | //<br />

1880123 | // Code segment and data segment are different:<br />

1880124 | // copy only the data segment.<br />

1880125 | //<br />

1880126 | // Copy the data segment in memory: if the size is zero,<br />

1880127 | // it means 0x10000 bytes (65536 bytes).<br />

1880128 | //<br />

1880129 | if (proc_table[ppid].size_d == 0)<br />

1880130 | {<br />

1880131 | //<br />

1880132 | // Copy 0x10000 bytes with two steps.<br />

1880133 | //<br />

1880134 | mem_copy (proc_table[ppid].address_d,<br />

1880135 | allocated_d.address, 0x8000);<br />

1880136 | mem_copy ((proc_table[ppid].address_d + 0x8000),<br />

1880137 | (allocated_d.address + 0x8000), 0x8000);<br />

1880138 | }<br />

1880139 | else<br />

1880140 | {<br />

1880141 | //<br />

1880142 | // Normal copy.<br />

1880143 | //<br />

1880144 | mem_copy (proc_table[ppid].address_d, allocated_d.address,<br />

1880145 | proc_table[ppid].size_d);<br />

1880146 | }<br />

1880147 | }<br />

1880148 | //<br />

1880149 | // Allocate the new PID.<br />

1880150 | //<br />

1880151 | proc_table[pid].ppid = ppid;<br />

1880152 | proc_table[pid].pgrp = proc_table[ppid].pgrp;<br />

1880153 | proc_table[pid].uid = proc_table[ppid].uid;<br />

1880154 | proc_table[pid].euid = proc_table[ppid].euid;<br />

1880155 | proc_table[pid].suid = proc_table[ppid].suid;<br />

1880156 | proc_table[pid].device_tty = proc_table[ppid].device_tty;<br />

1880157 | proc_table[pid].sig_status = 0;<br />

1880158 | proc_table[pid].sig_ignore = 0;<br />

1880159 | proc_table[pid].usage = 0;<br />

1880160 | proc_table[pid].status = PROC_CREATED;<br />

1880161 | proc_table[pid].wakeup_events = 0;<br />

1880162 | proc_table[pid].wakeup_signal = 0;<br />

1880163 | proc_table[pid].wakeup_timer = 0;<br />

1880164 | proc_table[pid].segment_i = allocated_i.segment;<br />

1880165 | proc_table[pid].address_i = allocated_i.address;<br />

1880166 | proc_table[pid].size_i = proc_table[ppid].size_i;<br />

1880167 | proc_table[pid].segment_d = allocated_d.segment;<br />

1880168 | proc_table[pid].address_d = allocated_d.address;<br />

1880169 | proc_table[pid].size_d = proc_table[ppid].size_d;<br />

1880170 | proc_table[pid].sp = sp;<br />

1880171 | proc_table[pid].ret = 0;<br />

1880172 | proc_table[pid].inode_cwd = proc_table[ppid].inode_cwd;<br />

1880173 | proc_table[pid].umask = proc_table[ppid].umask;<br />

1880174 | strncpy (proc_table[pid].name,<br />

1880175 | proc_table[ppid].name, PATH_MAX);<br />

1880176 | strncpy (proc_table[pid].path_cwd,<br />

1880177 | proc_table[ppid].path_cwd, PATH_MAX);<br />

1880178 | //<br />

1880179 | // Increase inode references for the working directory.<br />

1880180 | //<br />

1880181 | proc_table[pid].inode_cwd->references++;<br />

1880182 | //<br />

1880183 | // Duplicate valid file descriptors.<br />

1880184 | //<br />

1880185 | for (fdn = 0; fdn < OPEN_MAX; fdn++)<br />

1880186 | {<br />

1880187 | if ( proc_table[ppid].fd[fdn].file != NULL<br />

1880188 | && proc_table[ppid].fd[fdn].file->inode != NULL)<br />

1880189 | {<br />

1880190 | //<br />

1880191 | // Copy to the forked process.<br />

1880192 | //<br />

1880193 | proc_table[pid].fd[fdn].fl_flags<br />

1880194 | = proc_table[ppid].fd[fdn].fl_flags;<br />

1880195 | proc_table[pid].fd[fdn].fd_flags<br />

1880196 | = proc_table[ppid].fd[fdn].fd_flags;<br />

1880197 | proc_table[pid].fd[fdn].file<br />

1880198 | = proc_table[ppid].fd[fdn].file;<br />

1880199 | //<br />

1880200 | // Increment file reference.<br />

1880201 | //<br />

1880202 | proc_table[ppid].fd[fdn].file->references++;<br />

1880203 | }<br />

1880204 | }<br />

1880205 | //<br />

1880206 | // Change segment values inside the stack: DS==ES; CS.<br />

1880207 | //<br />

1880208 | dev_io ((pid_t) 0, DEV_MEM, DEV_WRITE,<br />

1880209 | (allocated_d.address + proc_table[pid].sp + 14),<br />

1880210 | &allocated_d.segment, (sizeof allocated_d.segment), NULL);<br />

1880211 | dev_io ((pid_t) 0, DEV_MEM, DEV_WRITE,<br />

1880212 | (allocated_d.address + proc_table[pid].sp + 16),<br />

1880213 | &allocated_d.segment, (sizeof allocated_d.segment), NULL);<br />

1880214 | dev_io ((pid_t) 0, DEV_MEM, DEV_WRITE,<br />

1880215 | (allocated_d.address + proc_table[pid].sp + 20),<br />

1880216 | &allocated_i.segment, (sizeof allocated_i.segment), NULL);<br />

1880217 | //<br />

1880218 | // Set it ready.<br />

1880219 | //<br />

1880220 | proc_table[pid].status = PROC_READY;<br />

1880221 | //<br />

1880222 | // Return the new PID.<br />

1880223 | //<br />

1880224 | return (pid);<br />

1880225 |}<br />

104.9.24 kernel/proc/proc_sys_kill.c<br />

Si veda la sezione 103.8.23.<br />

1890001 |#include <br />

1890002 |#include <br />

1890003 |//----------------------------------------------------------------------<br />

1890004 |int<br />

1890005 |proc_sys_kill (pid_t pid_killer, pid_t pid_target, int sig)<br />

1890006 |{<br />

1890007 | uid_t euid = proc_table[pid_killer].euid;<br />

«

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

Saved successfully!

Ooh no, something went wrong!