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;