세그먼트 오류가 발생하면 할당되지 않았거나 보호 된 메모리에 액세스한다는 의미입니다. 그러나 커널이나 CPU는이를 어떻게 알 수 있습니까? 하드웨어에 의해 구현됩니까? 어떤 데이터 구조가 CPU를 검색 할 필요가 있습니까? 일련의 메모리가 할당되면 어떤 데이터 구조를 수정해야합니까?커널은 세그먼트 오류에 대해 어떻게 알고 있습니까?
답변
세부 사항은 플랫폼에 따라 다르지만 일반적으로 MMU는 잘못된 메모리 액세스를 시도 할 때 예외 (인터럽트)를 생성하므로 커널이이를 인터럽트 서비스의 일부로 처리합니다 루틴.
일반적으로 프로세스가 CPU에서 실제로 처리 할 수없는 메모리에 액세스하려고하면 오류가 발생합니다. OS에 메모리 액세스 위반을 알리는 하드웨어입니다. 그런 다음 OS 커널이 예외를 발생시킨 프로세스에 신호를 보냅니다.
질문의 두 번째 부분에 대답하려면 하드웨어와 OS에 따라 다릅니다. 일반적인 시스템 (예 : x86)에서는 세그먼트 상대 주소를 가상 주소로 변환하기 위해 세그먼트 레지스터 (전역 또는 로컬 디스크립터 테이블을 통해)를 참조합니다 (일반적으로, 항상 그렇진은 않지만 현대 x86 운영 체제에서는 작동하지 않습니다). 시스템), 다음 (MMU는이 비트를 실제로 수행하지만 x86에서는 CPU 부분) 페이지 테이블을 참조하여 해당 가상 주소를 실제 주소로 변환합니다. 현재 표시된 것으로 표시되지 않은 페이지를 만날 때 (현재 비트가 페이지 디렉토리에 설정되지 않은 경우) 예외가 발생합니다. OS가이 예외를 처리하면 포기하거나 (실수 나 패닉을 일으킬 때 볼 수있는 segfault 신호를 발생 시킴) 페이지 테이블을 수정하여 메모리를 유효하게 만들고 예외에서 계속 진행합니다. 일반적으로 OS에는 어떤 페이지가 유효하고 페이지를 가져올 수 있는지 나타내는 부기가 있습니다. 이것이 요구 페이징이 발생하는 방법입니다.
"잘못된 메모리"란 무엇입니까? – venuswu
죄송합니다. 분명히해야합니다. 내 대답을 업데이 트하지만이 컨텍스트에서 의미하는 것은 "페이지 테이블에 표시된 것으로 표시되지 않은 메모리"입니다. CPU가 가상 주소를 실제 주소로 변환하려고하면 페이지 테이블의 현재 비트를 검사하고 (페이지 테이블의 많은 계층이 있음) 페이지가 존재하지 않으면 페이지 예외가 발생합니다 x86에서). OS는 메모리를 현재 상태로 만들고, 어떤 방법을 선택 하든지, 실행을 다시 시작하거나, 코어 덤핑과 같은 다른 작업을 수행 할 수 있습니다. – Stewart
모두 특정 아키텍처에 따라 다르지만 페이징 된 가상 메모리가있는 모든 아키텍처는 기본적으로 동일하게 작동합니다. 각 할당 된 메모리 페이지의 가상 - 물리적 매핑을 설명하는 메모리에 데이터 구조가 있습니다. 모든 메모리 액세스에 대해 CPU/MMU 하드웨어는 해당 테이블을 조회하여 매핑을 찾습니다. 이것은 끔찍하게 느릴 것입니다. 따라서 속도를 높이기위한 하드웨어 캐시가 있습니다.
- 1. 리눅스에서 세그멘테이션 오류에 대해
- 2. 이 오류에 대해 어떻게해야합니까?
- 3. 어떻게 wordpress의 기능에 대해 알고 계십니까?
- 4. 좋은 이벤트 관리 소프트웨어에 대해 알고 있습니까?
- 5. 오류에 대해 사용자에게 알리는 함수
- 6. 자바 바이트 코드 해석기에 대해 알고 있습니까?
- 7. 누구나 합리적인 테이블 뷰에 대해 알고 있습니까?
- 8. 레일스 "공지 사항"플러그인에 대해 알고 있습니까?
- 9. ASP.NET MVC 코드 생성기에 대해 알고 있습니까?
- 10. 누구나 CSS 분석 도구에 대해 알고 있습니까?
- 11. 누구나 IE7 에뮬레이터에 대해 알고 있습니까?
- 12. EC2의 최신 리눅스 커널은 무엇입니까?
- 13. 리눅스 커널은 더티 페이지를 어떻게 찾아 낼 수 있습니까?
- 14. 단일 파일 및 관련 오류에 대해 pyinotify
- 15. nil 클래스 오류에 대해 정의되지 않은 메서드를 어떻게 디버깅합니까?
- 16. 유닉스 커널은 어떻게 파일 오프셋을 변환합니까?
- 17. PDO 트리거 오류에 대해 예외가 발생하지 않습니다.
- 18. avaloq 스크립트에 대해 알고 계십니까?
- 19. visualstudio는 현재 프로젝트의 유형을 어떻게 알고 있습니까?
- 20. 자바 스크립트는 어떻게 오류에 반응합니까?
- 21. 최대 절전 모드 LazyInitialization 오류에 대해
- 22. 어떻게 세그먼트 컨트롤러에 이벤트를 쓸 수 있습니까?
- 23. 400 오류에 대해 ErrorDocument를 사용하는 방법은 무엇입니까?
- 24. C++ 문자열 유형 세그먼트 화 오류에 대한 포인터
- 25. 내 C 코드의 세그먼트 화 오류에 도움이 필요합니다
- 26. Eclipse가 알려지지 않은 오류에 대해 경고합니다.
- 27. XmlDocument.Validate가 여러 오류에 대해 실행되지 않습니다.
- 28. 구문 분석 오류에 대해 yyerror를 사용하는 방법
- 29. CUDA 커널은 CudaDeviceSynchronize
- 30. lua에는 thread라는 이름의 유형이 있습니다. 아무도 이것에 대해 알고 있습니까?
잘못된 메모리 란 무엇입니까? – venuswu
"잘못된 메모리 * 액세스 *"는 여러 가지 이유로 유효하지 않을 수 있습니다. 읽기 전용 메모리에 쓰기를 시도하거나, 실행 불가능한 메모리에서 코드를 실행하거나, 연관된 페이지가 할당되지 않은 주소를 읽거나 쓰려고합니다. –