2011-11-18 4 views
5

MIPS 아키텍처에 대한 연구를하고 있으며, mips에서 제공하는 제한된 명령어와 메모리 보호로 운영 체제가 어떻게 구현되는지 궁금합니다. 나는 운영체제가 특정 주소 범위가 실행되는 것을 어떻게 막을 지 궁금하다. 예를 들어 운영 체제가 PC를 특정 범위에서 작동하도록 제한 할 수 있습니까? 즉, 동적으로 할당 된 메모리에서 실행하는 것과 같은 것을 방지 할 수 있습니까?MIPS 메모리 실행 방지

마음에 처음 떠오른 것은 TLB이지만 TLB는 메모리 쓰기 방지 (및 실행되지 않음) 만 제공합니다.

OS별로 처리 할 수있는 방법을 전혀 알지 못합니다. 모든 명령어가 예외로 이어지고 PC가 정상적인 주소에 있는지 확인하기 위해 수많은 사이클이 구워지기 때문입니다. 범위.

누구든지 알고 있다면 어떻게 일반적으로 이루어 집니까? 그것은 초기화 동안 하드웨어에 의해 어떻게 든 처리됩니까? (예를 들어 주소 범위가 주어지고 범위를 벗어난 경우 예외가 발생합니다)

답변

2

보호 검사의 대부분은 하드웨어, CPU 자체로 수행되므로 필요하지 않습니다. OS 측면에서 많은 관여.

OS는 메모리 범위에 CPU가 내부적으로 캐시하는 읽기, 쓰기, 실행 및 사용자/커널 권한과 관련된 특수 테이블 (페이지 테이블 또는 세그먼트 설명자 등)을 설정합니다.

CPU는 모든 명령에 대해 메모리 액세스가 OS 설정 권한을 준수하는지 확인하고 모든 것이 정상이면 계속 수행합니다. 이러한 권한을 위반하려는 시도가있을 경우 CPU는 예외 처리 (CPU I/O 장치의 외부 인터럽트와 유사한 인터럽트 형태)를 발생시킵니다. 대부분의 경우 OS는 문제가 발생하면 문제의 애플리케이션을 종료합니다.

다른 경우에는 처리하고 겉으로보기에 깨진 코드를 작동 시키려고합니다. 이러한 경우 중 하나는 가상 온 디스크 메모리를 지원합니다. OS는 물리적 메모리로 백업되지 않고 데이터가 디스크의 어딘가에있을 때 영역을 비 존재/접근 불가능으로 표시합니다. 응용 프로그램이 해당 영역을 사용하려고 시도하면 OS는이 메모리 영역에 액세스하려고 시도한 명령의 예외를 캐치하고 실제 메모리가있는 영역을 백업하고 디스크의 데이터로 채우고 디스크의 현재/액세스 가능으로 표시 한 다음 다시 시작합니다 예외가 발생했습니다. 운영 체제의 메모리가 부족할 때마다 특정 범위의 데이터를 디스크로 오프로드하고 해당 범위를 다시 비공개/액세스 불가능으로 표시하고 다른 용도로 해당 영역에서 메모리를 회수 할 수 있습니다.

OS 커널 외부에서 실행되는 소프트웨어에 액세스 할 수없는 CPU 메모리 범위로 하드 코드 된 특정 항목이있을 수도 있으며 CPU가 여기에서도 쉽게 확인할 수 있습니다. MIPS는 이전 즉, 주소가 주소 공간의 상단 2기가바이트에서 이 허용되지 않습니다 설명 정도에 메모리 보호 기능을 제공

3.4.2 메모리 보호 :

이것은 MIPS (from "Application Note 235 - Migrating from MIPS to ARM")의 경우 것 같다 사용자 모드 일 때. 세분화 된 보호 체제가 가능하지 않습니다.

enter image description here

This document 목록 "MEM - 데이터 가져 오기에 페이지 오류, 잘못 정렬 된 메모리 액세스, 메모리 보호 위반"다른 MIPS 예외들.

특정 버전의 MIPS CPU에 더 이상의 세분화 된 보호 검사가 없으면 OS에 의해 상당한 비용이들 때만 에뮬레이트 될 수 있습니다. OS는 명령에 의한 코드 명령을 실행하거나 코드를 삽입 된 주소 및 액세스 검사와 거의 동등한 코드로 변환하여 원래 코드 대신 실행해야합니다.

2

이것은 실제로 TLB에서 수행됩니다. No Execute Bits (NX bits)은 불과 몇 년 전에 인기를 얻었으므로 오래된 MIPS 프로세서는이를 지원하지 않습니다. MIPS architecture (릴리스 3)의 최신 버전과 SmartMIPS Application-Specific ExtensionXI (실행 금지)이라는 이름으로 옵션 기능으로 지원됩니다.

이 기능이없는 칩을 사용하면 운이 없게됩니다. Alex가 이미 말했듯이이 기능을 에뮬레이션하는 간단한 방법은 없습니다.