1. Memory Corruption

1.1. 정의

  • 프로그래머의 의도나 프로그래밍 언어의 설계 의도와 달리 메모리 상의 내용이 수정되는 경우를 의미

1.2. 발생 원인

  • 환경적 요소
    • EMI
    • heat
    • radiation
  • 하드웨어 결함
    • power fluctuation
    • power failures
    • memory cell faults
    • address line shorts
  • 소프트웨어 결함
    • software erroneously modifying memory

1.3. 해결 방법

  • H/W적 측면 : UPS나 디커플링 커패시터를 통해 전원 안정화 혹은 MMU / MPU 활용
  • S/W적 측면 : BDR(backup and Disaster Recovery) 설계

2. Solution in Software

2.1 CRC 검사를 통한 데이터 무결성 확인

  • CRC(cyclic redundancy check) : 데이터 무결성을 확인하는 검사 방식 CRC
  • Data Write : Message + CheckSum(Remainder) bit 붙어서 쓴다.
  • Date Read : CheckSum bit가 포함된 Message를 CRC bit로 나누었을 때 0이면 올바른 데이터이며 그렇지 않으면 Memory Corruption이 발생했음을 확인 가능

2.2 Backup block을 통한 Redundancy 보장

Flow Chart

SOL

Code

  • (1) Main / Backup block 둘다 잘못된 경우
    • Default 설정 값 -> Main / Backup block
      static ConfigErrorCode
      proc_in_error(void)
      {
        block = configDefault;
        block.crc = Crc32_calc((const uint8_t *)&block.data,
                           sizeof(ConfigData), 0xffffffff);
        NVMem_storeData(CONFIG_MAIN_ADDR, sizeof(Config),
                    (const uint8_t *)&block);
        NVMem_storeData(CONFIG_BACKUP_ADDR, sizeof(Config),
                    (const uint8_t *)&block);
        return CORRUPT_DATA;
      }
      
  • (2) Main block만 잘못된 경우
    • Backup block -> Main block
      static ConfigErrorCode
      proc_recovery(void)
      {
        block = backupBlock;
        NVMem_storeData(CONFIG_MAIN_ADDR, sizeof(Config),
                    (const uint8_t *)&block);
        return RECOVER_DATA;
      }
      
  • (3) Backup block만 잘못된 경우
    • Main block -> Backup block
      static ConfigErrorCode
      proc_backup(void)
      {
        NVMem_storeData(CONFIG_BACKUP_ADDR, sizeof(Config),
                    (const uint8_t *)&block);
        return BACKUP_DATA;
      }
      
  • (4) Main block 과 Backup block CRC 설정 값 검사
    • 설정 값이 다를 경우, Main block 내용이 가장 최근 내용이므로 Main block으로 값 덮어씀
      static ConfigErrorCode
      proc_cmp(void)
      {
        ConfigErrorCode res = NO_ERRORS;
        if (main.readCRC != backup.readCRC)
        {
        res = proc_backup();
        }
        return res;
      }
      

      3. Solution in Hardware

      Memory Protection Unit

  • RTOS에서 Task를 처리하기 위해 필요한 공유 자원들을 효율적으로 관리하기 위해 MPU를 활용한다.

Before Using MPU

image

After Using MPU

image

Detecting Stack Overflow using RedZone

  • RTOS에서는 Task 마다 고유의 Stack을 가지고 있다.
  • Stack으로 인해 RTOS 기반 시스템들은 Stack Overflow 문제를 자주 겪는데, MPU를 통해 이를 해결할 수 있다.

image

  • 다음 MPU Region의 Task Stack으로 부터 Stack Overflow 검출 가능
  • Stack Overflow를 검출하기 위해 RedZone이라는 메모리 공간 따로 할당한다.

Alternate way to Detect Stack Overflow

image

  • 각각의 Stack의 크기를 2의 지수배로 똑같은 크기로 설정하면 RedZone을 할당하지 않고서도 Stack Overflow를 검출할 수 있다.
  • 이 경우에는 Stack 크기를 일정한 크기로 미리 설정해 두는 것이 복잡한 상황이 될 수 있다.
  • 같은 프로세스 내에서 여러 Task를 할당하지 못하게 된다.

4. Reference