programing

C에서 읽기 전용 메모리는 어떻게 구현됩니까?

muds 2023. 11. 2. 22:08
반응형

C에서 읽기 전용 메모리는 어떻게 구현됩니까?

제가 C에서 들어본적어도.

char *s = "hello world". 

"헬로 월드"는 실제로 읽기 전용 메모리에 저장됩니다.

읽기 전용 메모리에 대해서는 잘 모릅니다.설명이 어떻게 됩니까?그것은 컴파일러에게 해당 섹션에 쓰지 말라고 말하는 컴파일러에 대한 플래그와 같은 것입니까?

그것은 C 언어의 특징이 아니라 컴파일러/링커와 운영 체제가 함께 작동하는 특징입니다.

이러한 코드를 컴파일하면 다음과 같은 일이 발생합니다.

  • 컴파일러는 문자열을 읽기 전용 데이터 섹션에 넣을 것입니다.

  • 링커는 이러한 읽기 전용 섹션의 모든 데이터를 수집하여 단일 세그먼트에 넣습니다.이 세그먼트는 실행 파일에 있으며 "읽기 전용" 속성으로 플래그 지정됩니다.

  • 이제 운영 체제 실행 파일 로더가 등장합니다.실행 파일을 로드하거나 더 정확하게는 메모리에 매핑합니다.이렇게 하면 로더는 섹션을 이동하고 각 세그먼트에 대한 액세스 권한을 설정합니다.읽기 전용 데이터 세그먼트의 경우 코드 실행 및 쓰기 액세스를 비활성화할 가능성이 높습니다.코드(예: 함수)는 실행 권한을 얻지만 쓰기 권한은 얻지 못합니다.정적 변수와 같은 일반적인 데이터는 읽기 및 쓰기 액세스 등을 수행합니다.

이것이 현대 운영 체제가 하는 방식입니다.

말씀하신 것처럼 C 언어의 특징은 아닙니다.예를 들어 DOS에 대해 동일한 문제를 컴파일하면 프로그램이 실행되지만 DOS 로더가 읽기 전용 섹션에 대해 알지 못하기 때문에 쓰기 보호는 불가능합니다.

실행 파일에는 전역 변수가 포함된 .data 섹션과 실제 컴퓨터 코드가 포함된 .text 섹션의 두 부분이 있습니다.

문자열은 .data 섹션에 배치됩니다.C가 "Hello world"를 볼 때 하는 일은 실행 파일 자체에 "Hello world" 문자열을 넣고 프로그램의 "Hello world" 인스턴스를 해당 문자열이 로드되는 주소로 대체하는 것입니다.

그렇다고 해도, 왜 읽기 전용인지 잘 모르겠습니다. 이론적으로 프로그램은 자신의 메모리를 수정할 수 있어야 합니다.

진정한 읽기 전용 메모리는 OS의 메모리 서브시스템에 의해 구현됩니다.OS는 특정 페이지를 읽기 전용으로 표시할 수 있습니다.

바이너리에서 컴파일러는 실행 파일의 어떤 부분을 읽기 전용 대 읽기-쓰기 메모리 페이지에 배치해야 하는지 OS에 알려줄 수 있습니다.

당신이 글을 쓸때char s[10]="sneha"; 개체 파일에 10바이트의 저장 공간(메모리가 아니라 프로그램을 실행할 때만 메모리가 그림으로 표시됨)을 할당합니다.이것은 (컴파일 시) 메모리의 정적 할당입니다.

하지만 당신이 글을 쓸때char *s="sneha";저장할 저장소 공간을 할당하지 않았습니다."sneha". READ ONLY 섹션에 저장됩니다.하지만 포인터는s선언된 위치에 따라 다른 섹션에 저장됩니다.그러나 읽기 전용 데이터를 가리키고 있습니다."sneha". 따라서 여기에 적으려고 하면 세그멘테이션 오류가 발생합니다.

예를 들어,

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 

리눅스에서 이것을 하는 방법의 예는 Mark Mitchell, Jeffrey Olham 및 Alex Samuel의 Advanced Linux Programming 179페이지입니다.

당신은 다음과 같은 것을 시도할 수 있습니다.

s[4] = '0';

전화할 때 '안녕하세요 w0ld'라고 써있는지 확인해보세요

puts(s);

즉시 Segmentation Fault(세그먼트화 오류) 또는 Data Execution Prevention(데이터 실행 방지) 예외를 발생시키는 경우에는 읽기 전용일 수 있습니다. (시스템에서 이 문제를 해결할 수 있게 해준다면 좋은 방법이 아닙니다.)

다른 사람들이 언급한 것처럼, 일정한 문자열의 내용이 읽기 전용 메모리에 저장되는지 여부는 운영 체제, 컴파일러, 칩 아키텍처에 의해 결정됩니다.

더 정확하게 말하면, C 표준은 인용된 문자열이 "constchar[]" 유형을 갖는 것으로 간주된다고 명시합니다. (또는 그와 같은 의미의 단어는 현재 표준을 가지고 있지 않습니다.)

이러한 문자열의 내용을 수정하려는 코드는 정의되지 않은 동작을 호출합니다.이는 말 그대로 그 시점에서 모든 일이 일어날 수 있다는 것을 의미하며, 컴파일러 공급자는 발생할 수 있는 일을 문서화할 필요조차 없습니다.

실제로 휴대용을 원하는 C 또는 C++ 프로그램은 일정한 문자열을 수정하지 않아야 합니다.

일반적으로 컴파일러에서는 "const" 변수의 내용을 수정할 수 없으므로 대부분의 경우 "const"를 "읽기 전용"을 의미하는 것으로 간주할 수 있습니다.유감스럽게도 역사적인 이유로 인해 char *와 constar *에 대한 특별한 예외가 있습니다.이 코드는 다음과 같습니다.

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

정의되지 않은 동작을 호출하더라도 오류나 경고 없이 컴파일됩니다.

언급URL : https://stackoverflow.com/questions/1704893/how-is-read-only-memory-implemented-in-c

반응형