tag puddletag programacion mp3tag kid3 editar easytag linux linux-kernel

puddletag - ¿Cómo se puede utilizar el mismo programa de Linux para cargar direcciones de memoria varias veces en diferentes procesos que se ejecutan simultáneamente?



mp3tag ubuntu (2)

La respuesta es que cada proceso tiene sus propias tablas de página. Se cambian cuando se cambian los procesos.

Más información en http://www.informit.com/articles/article.aspx?p=101760&seqNum=3 .

El núcleo cambia las tablas de página cuando ocurre un cambio de contexto. En los sistemas operativos donde el kernel está mapeado en cada proceso, las páginas del kernel pueden permanecer. Por otro lado, los sistemas operativos (32 bits) que proporcionan 4GiB a los procesos de los usuarios tienen que hacer un cambio de contexto al entrar en el kernel (un syscall) también.

Si bien el direccionamiento virtual no requiere que diferentes procesos tengan diferentes tablas de página (la dependencia va en la dirección opuesta), no puedo pensar en ningún sistema operativo actual que no le dé a cada proceso sus propias tablas de página.

Estoy estudiando la ejecución del proceso en Linux 2.6.32 en un cuadro de 64 bits. Mientras estudiaba los resultados de /proc/$PID/maps , observé una cosa:

$ cat /proc/2203/maps | head -1 00400000-004d9000 r-xp 00000000 08:02 1050631 /bin/bash $ cat /proc/27032/maps | head -1 00400000-00404000 r-xp 00000000 08:02 771580 /sbin/getty

Parece que el archivo de maps para todos los programas muestra que el código ejecutable para cada programa se carga en un bloque de memoria que comienza en 0x00400000 .

Entiendo que estas son direcciones virtuales. Sin embargo, no entiendo cómo estas direcciones pueden ser las mismas para múltiples procesos que se ejecutan simultáneamente. ¿Cuál es la razón detrás de usar una dirección de inicio común para cargar todos los procesos, y cómo distingue el sistema operativo entre el punto de carga virtual de un proceso de otro?

Editar:

Desde mi entendimiento de la virtualización del espacio de direcciones usando paginación, pensé que parte de la dirección virtual se usaba para buscar la dirección física de un bloque de memoria (un cuadro) utilizándolo para indexar una o más tablas de páginas. Considera este caso. La dirección parece de 32 bits (esto es otra cosa que me desconcierta: ¿por qué las direcciones del programa son de 32 bits, pero las direcciones de las bibliotecas cargadas son de 64 bits?). Al dividir la dirección en diez, diez y doce bits correspondientes a la entrada del directorio de páginas, la entrada de la tabla de páginas y el desplazamiento de página, respectivamente, 0x00400000 no debe significar siempre "entrada de directorio de página 1, entrada de tabla de páginas 0, desplazamiento 0", no importa qué programa realiza la traducción de direcciones?

Una forma en que puedo ver cómo se puede hacer esto es si el sistema operativo modificó la entrada del directorio de páginas n. ° 1 para apuntar a la tabla de páginas correspondiente al programa cada vez que se realiza un cambio de tarea. Si ese es el caso, parece una gran complejidad añadida, dado que el código del programa es independiente de la posición, ¿no será más fácil simplemente cargar el programa en una dirección virtual arbitraria e ir desde allí?


P: Entiendo que estas son direcciones virtuales.

Un bien...

P: Sin embargo, no entiendo cómo estas direcciones pueden ser iguales para múltiples procesos que se ejecutan simultáneamente.

A: Pensé que acababas de decir que entendías "direcciones virtuales";)?

P: ¿Cuál es la razón detrás de usar una dirección de inicio común para cargar todos los procesos?

R: Recuerde, es una dirección virtual , no una dirección física. ¿Por qué no tener alguna dirección de inicio estándar?

Y recuerde: no desea que la dirección de inicio sea "0": hay muchas direcciones virtuales específicas (especialmente aquellas bajo 640K) que un proceso podría querer mapear como si fuera una dirección física.

Aquí hay un buen artículo que toca algunos de estos temas. Incluyendo "e_entry":

Cómo se ejecuta main () en Linux