2012-01-17 2 views
1

세그먼트 오류가 발생하면 할당되지 않았거나 보호 된 메모리에 액세스한다는 의미입니다. 그러나 커널이나 CPU는이를 어떻게 알 수 있습니까? 하드웨어에 의해 구현됩니까? 어떤 데이터 구조가 CPU를 검색 할 필요가 있습니까? 일련의 메모리가 할당되면 어떤 데이터 구조를 수정해야합니까?커널은 세그먼트 오류에 대해 어떻게 알고 있습니까?

답변

2

세부 사항은 플랫폼에 따라 다르지만 일반적으로 MMU는 잘못된 메모리 액세스를 시도 할 때 예외 (인터럽트)를 생성하므로 커널이이를 인터럽트 서비스의 일부로 처리합니다 루틴.

+0

잘못된 메모리 란 무엇입니까? – venuswu

+0

"잘못된 메모리 * 액세스 *"는 여러 가지 이유로 유효하지 않을 수 있습니다. 읽기 전용 메모리에 쓰기를 시도하거나, 실행 불가능한 메모리에서 코드를 실행하거나, 연관된 페이지가 할당되지 않은 주소를 읽거나 쓰려고합니다. –

1

일반적으로 프로세스가 CPU에서 실제로 처리 할 수없는 메모리에 액세스하려고하면 오류가 발생합니다. OS에 메모리 액세스 위반을 알리는 하드웨어입니다. 그런 다음 OS 커널이 예외를 발생시킨 프로세스에 신호를 보냅니다.

1

질문의 두 번째 부분에 대답하려면 하드웨어와 OS에 따라 다릅니다. 일반적인 시스템 (예 : x86)에서는 세그먼트 상대 주소를 가상 주소로 변환하기 위해 세그먼트 레지스터 (전역 또는 로컬 디스크립터 테이블을 통해)를 참조합니다 (일반적으로, 항상 그렇진은 않지만 현대 x86 운영 체제에서는 작동하지 않습니다). 시스템), 다음 (MMU는이 비트를 실제로 수행하지만 x86에서는 CPU 부분) 페이지 테이블을 참조하여 해당 가상 주소를 실제 주소로 변환합니다. 현재 표시된 것으로 표시되지 않은 페이지를 만날 때 (현재 비트가 페이지 디렉토리에 설정되지 않은 경우) 예외가 발생합니다. OS가이 예외를 처리하면 포기하거나 (실수 나 패닉을 일으킬 때 볼 수있는 segfault 신호를 발생 시킴) 페이지 테이블을 수정하여 메모리를 유효하게 만들고 예외에서 계속 진행합니다. 일반적으로 OS에는 어떤 페이지가 유효하고 페이지를 가져올 수 있는지 나타내는 부기가 있습니다. 이것이 요구 페이징이 발생하는 방법입니다.

+0

"잘못된 메모리"란 무엇입니까? – venuswu

+0

죄송합니다. 분명히해야합니다. 내 대답을 업데이 트하지만이 컨텍스트에서 의미하는 것은 "페이지 테이블에 표시된 것으로 표시되지 않은 메모리"입니다. CPU가 가상 주소를 실제 주소로 변환하려고하면 페이지 테이블의 현재 비트를 검사하고 (페이지 테이블의 많은 계층이 있음) 페이지가 존재하지 않으면 페이지 예외가 발생합니다 x86에서). OS는 메모리를 현재 상태로 만들고, 어떤 방법을 선택 하든지, 실행을 다시 시작하거나, 코어 덤핑과 같은 다른 작업을 수행 할 수 있습니다. – Stewart

0

모두 특정 아키텍처에 따라 다르지만 페이징 된 가상 메모리가있는 모든 아키텍처는 기본적으로 동일하게 작동합니다. 각 할당 된 메모리 페이지의 가상 - 물리적 매핑을 설명하는 메모리에 데이터 구조가 있습니다. 모든 메모리 액세스에 대해 CPU/MMU 하드웨어는 해당 테이블을 조회하여 매핑을 찾습니다. 이것은 끔찍하게 느릴 것입니다. 따라서 속도를 높이기위한 하드웨어 캐시가 있습니다.

관련 문제