2012-01-13 10 views
7

Cómo se escribe el código de llamada del sistema de horquilla. Quiero saber algunos detalles de cómo una función puede devolver dos valores diferentes y eso a dos procesos diferentes. En resumen, ¿quiere saber cómo se implementa la llamada del sistema de horquillas?Implementación de horquilla

+3

Puede probar y ver el código fuente del kernel de Linux ... – fge

+1

¿Se siente cómodo con la idea de que el sistema operativo puede crear procesos y puede elegir qué áreas de memoria asignar al espacio de direcciones de cada proceso? –

+0

¿Qué punto tiene esta pregunta? – Svisstack

Respuesta

9

Lo ha explicado diciendo que es una llamada al sistema. Es el trabajo del sistema operativo hacer todo ese trabajo, y el sistema operativo puede hacer prácticamente lo que quiera fuera del contexto de su programa o las reglas del lenguaje en el que lo esté implementando. Aquí hay un ejemplo simple de cómo podría hacerlo. suceda:

  1. programa llama fork() llamada al sistema
  2. kernel llamada al sistema tenedor duplica el proceso que se ejecuta el programa
  3. el núcleo establece el valor de retorno para la llamada al sistema para el programa original y el duplicado (PID el duplicado y 0, respectivamente)
  4. El núcleo pone ambos procesos en la cola del planificador
  5. Como cada proceso está programado, el kernel 'regresa' a cada uno de los dos programas.
-1

En forma fácil, por ejemplo, el proceso se clona en fork() función con Moving IP/EIP/RIP registro para omitir alguna instrucción en funciones que pueden ser:

return pid; 
return 0; 

primer proceso se ejecutará primero instrucción y función pop de la pila, el segundo proceso comenzará pero a partir de la segunda instrucción devolviendo 0.

+0

Creo que es solo el kernel que devuelve diferentes valores de la llamada al sistema para cada proceso. – tangrs

+0

Ambos procesan la horquilla desde el mismo punto cuando llama a fork(). No sé a qué se refiere con el "segundo" proceso (padre o hijo) pero es incorrecto – iantonuk

2

Hay un comentario en el folleto de código fuente Unix V6 para universidades anotado por Ken Thomps y Dennis Ritchie describiendo cómo funciona el doble retorno. El comentario termina con la siguiente oración:

No se espera que usted entienda esto.

+0

IIRC que se refirió a la asamblea utilizada para eso, no a la idea de regresar dos veces. – ninjalj

7

La respuesta de Carl fue genial. Me gustaría agregar que en muchos sistemas operativos los valores de retorno se pasan en uno de los registros. En la arquitectura x86, este registro podría ser eax. En la arquitectura ARM, este registro podría ser R0, etc.

Cada proceso también tiene un Bloque de control de proceso (PCB), que almacena los valores de registros en el momento de alguna interrupción, llamada de sistema o ocurrió la excepción y se pasó el control al sistema operativo. La próxima vez que se programa el proceso, los valores de los registros se restauran desde PCB.

Ahora, cuando tenedor() sucede, el sistema operativo puede hacer:

child_process->PCB[return_value_register] = 0; 
parrent_process->PCB[return_value_register] = child_pid; 

lo tanto, cuando se reprograman los procesos, cada uno de ellos ven un valor de retorno diferente.

Como ejemplo, puede ver xv6's implementation of fork. Allí, el proceso principal todavía está en estado de ejecución, por lo que devuelve el valor de retorno del padre utilizando una declaración de devolución simple. Pero establece el valor del registro EAX para el proceso hijo a 0, por lo que cuando está prevista proceso hijo que ve 0 como valor de retorno:

// Clear %eax so that fork returns 0 in the child. 
np->tf->eax = 0; 

Tenga en cuenta que devuelven 0 también se compilará a algo así como "mov eax, 0".

Actualización: Acabo de implementar fork() para un hobby OS que estoy haciendo. Puede ver el código fuente here.

Cuestiones relacionadas