Q&A 게시판

리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)

TLB Coherency

작성자
송대영
작성일
2019-05-15 21:47
조회
751
안녕하세요?
ARM Linux 페이지테이블과 TLB에 관련하여 질문이 있습니다.
현재 Cortex-A9 sabre lite 보드(쿼드코어)를 사용하고 있습니다.

멀티코어 시스템에서 각 코어마다 MMU를 가지며 MMU 내부에는 TLB가 존재합니다.

1. 각 코어마다 존재하는 L1 캐시 데이터가 dirty 되는 경우 coherency를 위해 flush 되는 것처럼,
TLB가 다른 코어들의 TLB와 다른 경우 TLB도 flush 되고 coherency되는지 궁금합니다.

2. 만약 TLB 프로세스를 실행하는 코어가 많아 질수록 TLB coherency를 위해 TLB flush가 많아질거라 예상합니다.
문영일님은 어떻게 생각하시는지 궁금합니다.

언제나 친절한 답변 감사드립니다.
잘 부탁드리겠습니다.
전체 2
  • 2019-05-17 10:47
    안녕하세요?

    TLB flush 관련해서는 대부분의 개발자분들이 잠깐 보고 넘어가는데, 어려운 문제임에도 집중하시니 앞으로도 좋은 성과가 예상됩니다.

    예상하신 것처럼 TLB cohrency 작업은 필수입니다. 그런데 TLB coherency는 하드웨어가 자동으로 수행하지 않습니다. 따라서 소프트웨어에서 각 cpu 들의 TLB의 flush를 요청해야 합니다. 이러한 요청은 대표적으로 flush_tlb_all() 코드를 통해 수행됩니다.

    TLB flush를 필요로하는 주요 작업은 다음과 같습니다.
    1) 매핑 갱신(페이지 테이블 엔트리 갱신)
    2) 다른 vm을 사용하는 태스크 context switch

    위와 같은 TLB 플러시 작업은 비동기로 수행되지만 cpu들 간에 TLB coherency를 위해 작업이 완료될 때 까지 모든 코어가 대기하도록 dsb(isb) 명령을 사용하여 sync를 맞추는 과정에서 대단히 높은 cost가 발생합니다. 또한 모든 cpu들을 대상으로 수행하므로 cpu 코어 수가 많아지면 많아질 수록 매우 느려집니다.

    커널에서 TLB 플러시를 줄이기 위해 몇 가지 회피 또는 지연시켜 한 번에 처리하는 방법을 사용합니다. 다음과 같은 기법들을 설명합니다.
    1) 매핑 삭제 요청이 오면 바로 처리하지 않고 이들을 모아서 한 번에 처리하는 purge 방법등을 사용합니다.
    2) armv7 아키텍처 이상에서는 TLB에 ASID(32bit에서 8비트, 64bit에서 16비트) 기능을 지원하므로, 커널은 asid genertion이 다른 task의 context switch 시도 시에만 한정하여 flush 합니다.

    감사합니다.

  • 2019-05-17 11:26
    친절한 답변 감사합니다.
    이해하는데 큰 도움이 되었습니다.