tecnicas sistemas segmentacion primer ppt peor paginacion operativos memoria mejor gestion funciones asignacion ajuste administrador administracion c memory readonly

sistemas - ¿Cómo se implementa la memoria de solo lectura en C?



primer ajuste mejor ajuste peor ajuste (7)

Oí eso en C, si lo hago.

char *s = "hello world".

El "hola mundo" se almacena realmente en la memoria de solo lectura.

No soy tan claro acerca de la memoria de sólo lectura. ¿Cuál es la explicación? ¿Es como una bandera para el compilador que le dice al compilador que no escriba en esa sección?


Como han mencionado otras personas, si el contenido de las cadenas constantes se almacenan en la memoria de solo lectura está determinado por el sistema operativo, el compilador y la arquitectura del chip.

Más precisamente, el estándar C especifica que se considera que las cadenas citadas tienen el tipo "const char []" (o palabras a ese efecto, no tengo el estándar a mano).

Cualquier código que intente modificar el contenido de dicha cadena está invocando un comportamiento indefinido. Eso significa que, literalmente, cualquier cosa puede suceder en ese momento, y el proveedor del compilador ni siquiera tiene que documentar lo que puede suceder.

En la práctica, esto significa que un programa C o C ++ que quiere ser portátil debe evitar modificar cadenas constantes.

En general, el compilador no le permitirá modificar el contenido de las variables "const", por lo que puede considerar que "const" significa "solo lectura" en la mayoría de los casos. Desafortunadamente, hay una excepción especial para char * y const char *, en gran parte por razones históricas. Eso significa que el código de esta manera:

char *x = "Hello, World"; *x = ''h'';

se compilará sin error ni advertencia, aunque invoque un comportamiento indefinido.


Cuando escribe char s[10]="sneha" ; está asignando 10 bytes de espacio de almacenamiento (no en la memoria, la memoria solo aparece en la imagen cuando ejecuta su programa) en su archivo de objeto. Esta es la asignación estática de memoria (en tiempo de compilación).

Pero cuando escribes char *s="sneha"; no está asignando ningún espacio de almacenamiento para almacenar "sneha" . Se almacenará en la sección LEER SOLAMENTE. Pero el puntero s se almacena en una sección diferente en función de donde se declara. Pero está apuntando a los DATOS DE SOLO LECTURA "sneha" . Así que si intentas escribir en él obtendrás un error de segmentación.

Por ejemplo:

char *s = "sneha"; s[1] = ''N''; printf("%s",s); // you expecting output sNeha, // but you get a seg fault since it is READ ONLY DATA


Esa no es una característica del lenguaje C, sino una característica del compilador / vinculador y el sistema operativo que trabajan juntos.

Cuando compilas dicho código ocurre lo siguiente:

  • El compilador colocará la cadena en una sección de datos de solo lectura.

  • El enlazador recopila todos los datos en dichas secciones de solo lectura y los coloca en un solo segmento. Este segmento reside en el archivo ejecutable y está marcado con un atributo de "solo lectura".

  • Ahora viene el cargador del ejecutable del sistema operativo. Carga el ejecutable (o lo asigna a la memoria para ser más exactos). Una vez hecho esto, el cargador recorre las secciones y establece los permisos de acceso para cada segmento. Para un segmento de datos de solo lectura, lo más probable es que deshabilite la ejecución de código y el acceso de escritura. El código (por ejemplo, sus funciones) obtiene derechos de ejecución pero no tiene acceso de escritura. Los datos ordinarios, como las variables estáticas, tienen acceso de lectura y escritura, etc.

Así es como lo hacen los sistemas operativos modernos.

Como se dijo, no es una característica del lenguaje C. Si compila el mismo problema para DOS, por ejemplo, el programa se ejecutará pero no será posible la protección contra escritura, ya que el cargador de DOS no conoce las secciones de solo lectura.


La memoria de solo lectura verdadera es implementada por el subsistema de memoria del sistema operativo. El sistema operativo puede marcar ciertas páginas como de solo lectura.

En el binario, el compilador puede indicar al sistema operativo qué partes del ejecutable deben colocarse en las páginas de solo lectura frente a las de lectura-escritura.


Los ejecutables contienen dos partes: una sección .data, que contiene variables globales, y una sección .text, que contiene el código de máquina real.

Las cadenas se colocan en la sección de datos. Lo que hace C cuando ve "Hello world" es que coloca la cadena "Hello world" en el mismo ejecutable, y reemplaza la instancia de "Hello world" en el programa con la dirección donde esa cadena termina siendo cargada.

Dicho esto, no estoy seguro de por qué es de solo lectura; teóricamente, un programa debería poder modificar su propia memoria.


Podrías probar algo como

s[4] = ''0'';

y ver si dice "hola w0rld" cuando llamas

puts(s);

Si causa una falla de segmentación inmediata o una excepción de prevención de ejecución de datos, entonces probablemente sea de solo lectura. (Si el sistema te permite salirse con la suya, no es una buena idea).