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.

280 volume VI os16<br />

Script e sorgenti del kernel 281<br />

1860293 | //<br />

1860294 | // Copy inside the right position to be executed.<br />

1860295 | //<br />

1860296 | dev_io ((pid_t) 0, DEV_MEM, DEV_WRITE, memory_start, buffer,<br />

1860297 | (size_t) size_read, NULL);<br />

1860298 | }<br />

1860299 | for (eof = 0, memory_start = allocated_d.address,<br />

1860300 | inode_start = (header.segoff * 16), size_read = 0;<br />

1860301 | inode_start < inode->size && !eof;<br />

1860302 | inode_start += size_read)<br />

1860303 | {<br />

1860304 | memory_start += size_read;<br />

1860305 | //<br />

1860306 | // Read a block of memory<br />

1860307 | //<br />

1860308 | size_read = inode_file_read (inode, inode_start,<br />

1860309 | buffer, MEM_BLOCK_SIZE, &eof);<br />

1860310 | if (size_read < 0)<br />

1860311 | {<br />

1860312 | //<br />

1860313 | // Free memory and inode.<br />

1860314 | //<br />

1860315 | mb_free (allocated_i.address, allocated_i.size);<br />

1860316 | mb_free (allocated_d.address, allocated_d.size);<br />

1860317 | inode_put (inode);<br />

1860318 | errset (EIO);<br />

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

1860320 | }<br />

1860321 | dev_io ((pid_t) 0, DEV_MEM, DEV_WRITE, memory_start, buffer,<br />

1860322 | (size_t) size_read, NULL);<br />

1860323 | }<br />

1860324 | }<br />

1860325 | //<br />

1860326 | // The executable file was successfully loaded in memory:<br />

1860327 | // release the executable file inode.<br />

1860328 | //<br />

1860329 | inode_put (inode);<br />

1860330 | //<br />

1860331 | // Put environment data inside the stack.<br />

1860332 | //<br />

1860333 | new_sp -= env_data_size; //------------------------------- environment<br />

1860334 | mem_copy (address (seg_d (), (unsigned int) env_data),<br />

1860335 | (allocated_d.address + new_sp), env_data_size);<br />

1860336 | //<br />

1860337 | // Put arguments data inside the stack.<br />

1860338 | //<br />

1860339 | new_sp -= arg_data_size; //--------------------------------- arguments<br />

1860340 | mem_copy (address (seg_d (), (unsigned int) arg_data),<br />

1860341 | (allocated_d.address + new_sp), arg_data_size);<br />

1860342 | //<br />

1860343 | // Put envp[] inside the stack, updating all the pointers.<br />

1860344 | //<br />

1860345 | new_sp -= 2; //-------------------------------------------------- NULL<br />

1860346 | stack_element = NULL;<br />

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

1860348 | (allocated_d.address + new_sp),<br />

1860349 | &stack_element, (sizeof stack_element), NULL);<br />

1860350 | //<br />

1860351 | p_off = new_sp; //<br />

1860352 | p_off += 2; // Calculate memory pointers from<br />

1860353 | p_off += arg_data_size; // original relative pointers,<br />

1860354 | for (i = 0; i < envc; i++) // inside the environment array<br />

1860355 | { // of pointers.<br />

1860356 | envp[i] += p_off; //<br />

1860357 | } //<br />

1860358 | //<br />

1860359 | new_sp -= (envc * (sizeof (char *))); //---------------------- *envp[]<br />

1860360 | mem_copy (address (seg_d (), (unsigned int) envp),<br />

1860361 | (allocated_d.address + new_sp),<br />

1860362 | (envc * (sizeof (char *))));<br />

1860363 | //<br />

1860364 | // Save the envp[] location, needed in the following.<br />

1860365 | //<br />

1860366 | envp_address = new_sp;<br />

1860367 | //<br />

1860368 | // Put argv[] inside the stack, updating all the pointers.<br />

1860369 | //<br />

1860370 | new_sp -= 2; //-------------------------------------------------- NULL<br />

1860371 | stack_element = NULL;<br />

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

1860373 | (allocated_d.address + new_sp),<br />

1860374 | &stack_element, (sizeof stack_element), NULL);<br />

1860375 | //<br />

1860376 | p_off = new_sp; //<br />

1860377 | p_off += 2 ; // Calculate memory pointers<br />

1860378 | p_off += (envc * (sizeof (char *))); // from original relative<br />

1860379 | p_off += 2; // pointers, inside the<br />

1860380 | for (i = 0; i < argc; i++) // arguments array of<br />

1860381 | { // pointers.<br />

1860382 | argv[i] += p_off; //<br />

1860383 | } //<br />

1860384 | //<br />

1860385 | new_sp -= (argc * (sizeof (char *))); //---------------------- *argv[]<br />

1860386 | mem_copy (address (seg_d (), (unsigned int) argv),<br />

1860387 | (allocated_d.address + new_sp),<br />

1860388 | (argc * (sizeof (char *))));<br />

1860389 | //<br />

1860390 | // Save the argv[] location, needed in the following.<br />

1860391 | //<br />

1860392 | argv_address = new_sp;<br />

1860393 | //<br />

1860394 | // Put the pointer to the array envp[].<br />

1860395 | //<br />

1860396 | new_sp -= 2; //-------------------------------------------------- argc<br />

1860397 | stack_element = envp_address;<br />

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

1860399 | (allocated_d.address + new_sp),<br />

1860400 | &stack_element, (sizeof stack_element), NULL);<br />

1860401 | //<br />

1860402 | // Put the pointer to the array argv[].<br />

1860403 | //<br />

1860404 | new_sp -= 2; //-------------------------------------------------- argc<br />

1860405 | stack_element = argv_address;<br />

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

1860407 | (allocated_d.address + new_sp),<br />

1860408 | &stack_element, (sizeof stack_element), NULL);<br />

1860409 | //<br />

1860410 | // Put argc inside the stack.<br />

1860411 | //<br />

1860412 | new_sp -= 2; //-------------------------------------------------- argc<br />

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

1860414 | (allocated_d.address + new_sp),<br />

1860415 | &argc, (sizeof argc), NULL);<br />

1860416 | //<br />

1860417 | // Set the rest of the stack.<br />

1860418 | //<br />

1860419 | new_sp -= 2; //------------------------------------------------- FLAGS<br />

1860420 | stack_element = 0x0200;<br />

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

1860422 | (allocated_d.address + new_sp),<br />

1860423 | &stack_element, (sizeof stack_element), NULL);<br />

1860424 | new_sp -= 2; //---------------------------------------------------- CS<br />

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

1860426 | (allocated_d.address + new_sp),<br />

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

1860428 | new_sp -= 2; //---------------------------------------------------- IP<br />

1860429 | stack_element = 0;<br />

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

1860431 | (allocated_d.address + new_sp),<br />

1860432 | &stack_element, (sizeof stack_element), NULL);<br />

1860433 | new_sp -= 2; //---------------------------------------------------- ES<br />

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

1860435 | (allocated_d.address + new_sp),<br />

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

1860437 | new_sp -= 2; //---------------------------------------------------- DS<br />

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

1860439 | (allocated_d.address + new_sp),<br />

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

1860441 | new_sp -= 2; //---------------------------------------------------- DI<br />

1860442 | stack_element = 0;<br />

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

1860444 | (allocated_d.address + new_sp),<br />

1860445 | &stack_element, (sizeof stack_element), NULL);<br />

1860446 | new_sp -= 2; //---------------------------------------------------- SI<br />

1860447 | stack_element = 0;<br />

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

1860449 | (allocated_d.address + new_sp),<br />

1860450 | &stack_element, (sizeof stack_element), NULL);<br />

1860451 | new_sp -= 2; //---------------------------------------------------- BP<br />

1860452 | stack_element = 0;<br />

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

1860454 | (allocated_d.address + new_sp),<br />

1860455 | &stack_element, (sizeof stack_element), NULL);<br />

1860456 | new_sp -= 2; //---------------------------------------------------- BX<br />

1860457 | stack_element = 0;<br />

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

1860459 | (allocated_d.address + new_sp),<br />

1860460 | &stack_element, (sizeof stack_element), NULL);<br />

1860461 | new_sp -= 2; //---------------------------------------------------- DX<br />

1860462 | stack_element = 0;<br />

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

1860464 | (allocated_d.address + new_sp),<br />

1860465 | &stack_element, (sizeof stack_element), NULL);<br />

1860466 | new_sp -= 2; //---------------------------------------------------- CX<br />

1860467 | stack_element = 0;<br />

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

1860469 | (allocated_d.address + new_sp),<br />

1860470 | &stack_element, (sizeof stack_element), NULL);<br />

1860471 | new_sp -= 2; //---------------------------------------------------- AX<br />

1860472 | stack_element = 0;<br />

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

1860474 | (allocated_d.address + new_sp),<br />

1860475 | &stack_element, (sizeof stack_element), NULL);<br />

1860476 | //<br />

1860477 | // Close process file descriptors, if the ‘FD_CLOEXEC’ flag<br />

1860478 | // is present.<br />

1860479 | //<br />

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

1860481 | {<br />

1860482 | if (proc_table[pid].fd[0].file != NULL)<br />

1860483 | {<br />

1860484 | if (proc_table[pid].fd[0].fd_flags & FD_CLOEXEC)<br />

1860485 | {<br />

1860486 | fd_close (pid, fdn);<br />

1860487 | }<br />

1860488 | }<br />

1860489 | }<br />

1860490 | //<br />

1860491 | // Select device for standard I/O, if a standard I/O stream must be<br />

1860492 | // opened.<br />

1860493 | //<br />

1860494 | if (proc_table[pid].device_tty != 0)<br />

1860495 | {<br />

1860496 | device = proc_table[pid].device_tty;<br />

1860497 | }<br />

1860498 | else<br />

1860499 | {<br />

1860500 | device = DEV_TTY;<br />

1860501 | }<br />

1860502 | //<br />

1860503 | // Prepare missing standard file descriptors. The function<br />

1860504 | // ‘file_stdio_dev_make()’ arranges the value for ‘errno’ if<br />

1860505 | // necessary. If a standard file descriptor cannot be allocated,<br />

1860506 | // the program is left without it.<br />

1860507 | //<br />

1860508 | if (proc_table[pid].fd[0].file == NULL)<br />

1860509 | {<br />

1860510 | file = file_stdio_dev_make (device, S_IFCHR, O_RDONLY);<br />

1860511 | if (file != NULL) // stdin<br />

1860512 | {<br />

1860513 | proc_table[pid].fd[0].fl_flags = O_RDONLY;<br />

1860514 | proc_table[pid].fd[0].fd_flags = 0;<br />

1860515 | proc_table[pid].fd[0].file = file;<br />

1860516 | proc_table[pid].fd[0].file->offset = 0;<br />

1860517 | }<br />

1860518 | }<br />

1860519 | if (proc_table[pid].fd[1].file == NULL)<br />

1860520 | {<br />

1860521 | file = file_stdio_dev_make (device, S_IFCHR, O_WRONLY);<br />

1860522 | if (file != NULL) // stdout<br />

1860523 | {<br />

1860524 | proc_table[pid].fd[1].fl_flags = O_WRONLY;

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

Saved successfully!

Ooh no, something went wrong!