2012-04-26 1 views
1

세그멘테이션 오류에서 위키 백과를 읽고 다음 코드와 문을 사용했습니다. 이 코드가 포함 된 프로그램이 컴파일 될 때읽기 전용으로 표시된 프로그램 실행 파일

int main(void) 
{ 
    char *s = "hello world"; 
    *s = 'H'; 
} 

는 문자열 "안녕하세요 세계는"프로그램 실행 파일의 섹션에 배치 읽기 전용으로 를 표시; 로드 될 때 운영 체제는 다른 문자열 및 상수 데이터를 메모리의 읽기 전용 세그먼트에 넣습니다. 이 실행되면 변수 s가 문자열의 위치를 ​​가리 키도록 설정되고 변수를 통해 H 문자를 메모리 에 쓰려고 시도하여 세그먼트 오류가 발생합니다. 이러한 프로그램을 컴파일러와 컴파일 할 때 컴파일 타임에 읽기 전용 위치 할당을 확인하지 않습니다.

내 질문에 대한 파일 사용 권한이 있습니다. 즉, 실행 파일을 읽기 전용으로 표시하고 읽고 쓸 때 등의 질문이 있으십니까?

파일 사용 권한에 대해 모두 알고 싶습니다. 명시 적으로 파일 사용 권한을 변경할 수 있습니까?

+0

파일이라고하면 여기에 스택을 의미합니까? – noMAD

+2

실행중인 프로그램 내의 파일 액세스 권한과 메모리 액세스 권한은 관련이 없습니다. 실행 가능 프로그램을 쓰기 가능으로 표시해도 텍스트 페이지는 읽기/쓰기로 매핑되지 않습니다. 반대로, 읽기 전용으로 표시해도 데이터 페이지가 예기치 않게 읽기 전용으로 매핑되지 않습니다. – geekosaur

+0

파일 권한이 어떻게 관련이 있는지 잘 모르겠습니다 - 위키 문서는 메모리 * 페이지의 권한을 참조합니다. POSIX 시스템에서'mprotect() '와 같은 시스템 고유의 방법으로 페이지 권한을 변경할 수 있습니다. – FatalError

답변

5

"hello world"는 의 읽기 전용 섹션에 저장됩니다. 실행 파일의 특정 부분에 기록하는 기능은 디스크의 실행 파일에 기록하는 기능과 관련이 없습니다.

+0

은 모두 메모리의 읽기 전용 섹션에 저장된 실행 파일입니까? – IndieProgrammer

+0

실행 파일의 메모리가 모두 읽기 전용 인 것은 아닙니다. 예를 들어,'i = 0; i = 2' 인 경우, 'i'는 읽기 - 쓰기 메모리에 저장됩니다 (컴파일러가이를 한 할당으로 최적화하지 않는다고 가정). – Venge

+0

@IndieProgrammer 기본적으로 yes입니다.실행 파일에서로드 할 수있는 세그먼트의 특성입니다. 기본적으로 텍스트 (= 코드) 세그먼트는 읽기 전용으로 표시되지만 이것을 무시할 수 있습니다. 읽기 전용 세그먼트의 장점은 잘못된 코드로부터 보호하는 것뿐만 아니라 실행중인 여러 인스턴스의 메모리 이미지간에 더 쉽게 공유 할 수 있다는 것입니다. – geekosaur

2

당신은이 질문에서 얘기하는 3 개 관련이없는 개념이 있습니다 (일부 OS 지원, 즉 윈도우)

  • 파일 속성 - 그 중 하나가 읽기 전용입니다. 정상적으로 파일이 열리는 방식을 관리합니다. 파일을 수정할 수있는 권한이있는 사용자는 원하는대로 파일 속성을 변경할 수 있습니다.
  • 파일 권한 (대부분의 OS에서 지원). 지정된 사용자가 액세스/수정 권한을 가지고 있고 일부 시스템에서는 파일을 실행하는 경우
  • 메모리 페이지의 메모리 보호 속성. 가상 메모리를 구현하는 대부분의 OS에서 지원됩니다. 메모리의 각 페이지 (즉, 4Kb 블록)는 CPU와 함께 OS의 메모리 관리 부분에 의해 설정되고 시행되는 속성 (즉, 판독, 기록, 실행)의 세트를 얻는다. 대부분의 최신 CPU는 메모리 조작을 검증하기 위해이 페이지 속성을 직접 사용합니다.

e.e. Windows에서 VirtualProtect 함수를 사용하여 프로그램의 주소 공간에 할당 된 주어진 메모리 블록에 어떤 속성이 있어야하는지 지정할 수 있습니다.