메뉴 건너뛰기

NEOS 예제 코드

MMU 테이블 설정하는 예제

관리자1 2017.01.09 10:15 조회 수 : 68

NEOS 운영체제는 MMU(Memory Management Unit)을 사용합니다.

 

메모리맵핑은 Physical Memory와 Virtual Address가 1:1로 맵핑되어집니다.

 

MMU가 운영체제 시작시 ON 되어 있는 상태로 동작되므로 만약 새롭게 추가한 Device Memory I/O 영역이 MMU의 페이지 테이블에 존재하지 않을 경우

 

Read/Write를 수행하면 Page Fault (x86), Data Abort(ARM) Exception이 발생합니다.

 

만약 위와 같은 Exception이 발생하면  BspMemoryMap.c 파일에 접근할 메모리 영역을 아래처럼 추가하면 됩니다. 

 

참고로 Device Memory I/O 영역은 Non-Cacheable 상태이여야 하므로 속성에 MEMORY_READ | MEMORY_WRITE 속성만 지정하면 됩니다.

 

PhysicalMemoryRange physicalMemoryRange[] =
{
        /* SDRAM Area */
        {
            SYS_MEM_PHYS_BASE,
            SYS_MEM_VIRT_BASE,
            SYS_MEM_SIZE,
            MEMORY_READ | MEMORY_WRITE | MEMORY_CACHEABLE,
            "System Memory"
        },
        /* I/O Peripherals */
        {
            SYS_IO_REG_BASE,
            SYS_IO_REG_BASE,
            SYS_IO_REG_SIZE,
            MEMORY_READ | MEMORY_WRITE,
            "I/O Peripherals"
        },
        /* Exception area */
        {
            ONCHIP_MEM_BASE,
            ONCHIP_MEM_BASE,
            ONCHIP_MEM_SIZE,
            MEMORY_READ | MEMORY_WRITE,
            "Onchip memeory"
        },
        /* CPU Private Bus Registers */
        {
            SYS_CPU_BUS_REG_BASE,
            SYS_CPU_BUS_REG_BASE,
            SYS_CPU_BUS_REG_SIZE,
            MEMORY_READ | MEMORY_WRITE,
            "CPU Private Bus Registers"
        },
        /* SLCR registers */
        {
            SYS_SLCR_REG_BASE,
            SYS_SLCR_REG_BASE,
            SYS_SLCR_REG_SIZE,
            MEMORY_READ | MEMORY_WRITE,
            "SLCR registers"
        },
        /* PS System registers */
        {
            SYS_PS_REG_BASE,
            SYS_PS_REG_BASE,
            SYS_PS_REG_SIZE,
            MEMORY_READ | MEMORY_WRITE,
            "PS System registers"
         },
};

 

위로