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