2017-03-13 23 views
0

ARMv8-A에서 TLB 및 ASID에 대해 빠른 질문이 있습니다.
페이지의 설명/블록 설명자 (리프 MMU 테이블 항목)에는 ASID 식별자가없고 nG (비전 역) 비트 만 포함되어 있습니다. 이 페이지에는 ASID를 사용해야합니다.
- 레지스터 값과 일치하는 실제 ASID 값은 TLB에 있습니다. 페이지 보행이 발생하고 해당 엔트리가 TLB에 추가되면 (현재 ASID와 함께, 후속 TLB 룩업이 새 ASID가 일치 하는지를 확인할 때) 설정됩니다.ARMv8-A의 TLB에만 ASID가있는 이유는 무엇입니까? TLB에서 꺼내지 만 테이블에있는 메모리에 대한 비화되지 않은 액세스를 피하는 방법은 무엇입니까?

문맥 전환시 표를 업데이트하지 않으려면 ASID를 사용하고 싶습니다. 각 프로세스에는 상주 ASID 값이 있습니다. 프로세스 1 vaddr에서 일부 데이터 a1, 프로세스 2에서 vaddr a2. 1에서 2로 컨텍스트 스위치. 실행 중에 a1에 해당하는 TLB 항목이 꺼내집니다 (어떤 이유로). 프로세스 2는 a1에 액세스하고 TLB 누락이 발생하며 페이지 워크가 발생하고 ASID2 값 을 사용하여 프로세스 1의 항목을 성공 및 저장하여 프로세스 1의 데이터에 대한 프로세스 2 액세스 권한을 부여합니다.

무엇을 이해하지 못합니까? 테이블 업데이트를 피하면서 ASID 메카닉이 프로세스 1과 2 사이의 보안을 제공하면 안됩니까?

선택 사항 : 모든 프로그램에 동일한 가상 주소 (적어도 모든 프로그램의 진입 점 주소는 동일) 인 경우 .text 섹션이있는 경우 컨텍스트 전환 시마다 테이블을 업데이트해야합니까, 아니면 여러 항목을 가질 수 있습니까? 서로 다른 ASID를 사용하여 동일한 vaddr과 일치합니까?

답변

0

내가 ASID에 대해 오해 한 것 같습니다. @ artlessnoise 님의 의견에 감사드립니다.

내가 설명한 경우, 프로세스 2의 페이지를 어느 시점에서 매핑해야한다는 사실을 놓쳤습니다. 업데이트 테이블 -
:
(주소 a1에서, 내 예제 페이지를 포함), 를 공정 2의 페이지를 추가하고을 볼 수 없습니다해야하는 페이지 과정 2를 제거 - 변경

그래서 우리가 실제로하는 일은 이것이다 ASID이므로 이전 ASID가있는 캐시 된 값은 TLB
에서 사용할 수 없습니다. - 프로세스 2를 시작하십시오. 프로세스 1의 해당 페이지가 여전히 TLB에 캐시 된 경우 (ASID가 일치하지 않으므로) 무시됩니다. 두 경우 모두 페이지 넘김이 발생하며 업데이트 된 테이블에는 프로세스 2 액세스 가능 페이지 만 들어 있습니다.

따라서 2가 실행 중일 때 테이블이 제공하는 (주) 보안이 제공됩니다. 그리고 TLB의 추가 보안 만은 ASID 정비사가 제공하여 모든 컨텍스트에서 TLB를 플러시하지 못하도록합니다. 스위치.

편집 : 또 다른 (far-fetched) 해결책은 캐시되지 않은 페이지에 대한 페이지 보행을 비활성화하고 (대신 MMU 오류를 트리거하는), 프로세스가 비 액세스 페이지에 액세스 할 때마다 (커널에서) - 캐싱 페이지. 그것은 성능에 현명한 (설계와 마찬가지로) 끔찍한 것 같습니다.

+0

TLB의 ASID는 보안이 아니지만 지금 최적화하면 컨텍스트 스위치에서 전체 TLB를 플러시합니다. 모든 ** 프로세스는 고유 한 가상 - 물리적 메모리 매핑 **을 가지고 ASID OS가 없으면 프로세스 스위치에서 TLB의 모든 TLB 항목을 삭제합니다. ASID OS를 사용하면 경우에 따라 오래된 TLB 항목을 보관할 수 있습니다. – osgx

+1

@osgx 그건 정확히 내 대답에 무슨 뜻이야.내가 이전에 그것을 이해하지 못했던 이유는 TLB를 플러시하는 비용 (매우 낮은 - 많은 후속 페이지 워크를 유발 함)과 페이지 전환 (매우 낮음 - 단 두 개의 L1 요청 만) 비용을 과대 평가했다는 것입니다. – maxbc

+0

maxbc, 예, 요점은 * 최적화 *입니다. 자세한 내용은 [ "운영체제 : 세 개의 쉬운 부분"] (http://pages.cs.wisc.edu/~remzi/OSTEP/) (Remzi H Arpaci-Dusseau 및 Andrea C. Arpaci-Dusseau) ch. 19 "vm-tlb": http://pages.cs.wisc.edu/~remzi/OSTEP/vm-tlbs.pdf#page=9 "*이 오버 헤드를 줄이려면 주소 공간 식별자 (ASID) 필드를 TLB * " – osgx

2

프로세스 1 일부 데이터는 vaddr a1, 프로세스 2는 vaddr a2. I 컨텍스트 스위치가 1에서 2로 전환됩니다. 실행 중에 a1 에 해당하는 TLB 항목이 추출됩니다 (어떤 이유로). 프로세스 2가 a1을 액세스하고 TLB 누락이 발생하면 페이지 워크가 발생하고 ASID2 값을 사용하여 프로세스 1의 항목 을 성공 및 저장하여 프로세스 2의 프로세스 1에 대한 액세스 권한을 부여합니다.

프로세스 1이 vaddr a1에 액세스하려고하면 실제로는 vaddr_a1_with_asid_P1로 표시된 주소입니다. 프로세스 2가 vaddr a1에 액세스하려고하면 실제로는 vaddr_a1_with_asid_P2로 표시된 주소입니다. TLB에서 각 TLB 항목에는 vaddr 및 프로세스 ASID 정보가 모두 들어 있습니다.

"프로세스 2가 a1에 액세스하면 TLB 누락이 발생하고 페이지 워크가 발생하고 ASID2 값을 사용하여 프로세스 2의 항목을 성공 및 저장합니다"라는 메시지가 표시되지 않습니다.

동일한 vaddr a1에 대해서도 두 개의 다른 프로세스 액세스 a1은 두 개의 다른 TLB 항목을 생성합니다. 하나는 ASID P1로 표시되고 다른 하나는 ASID P2로 표시됩니다.

옵션 질문 : 내 모든 프로그램이 같은 가상 주소에서 텍스트 섹션이있는 경우, (적어도, 모든 프로그램이 같은 진입 점 주소가) 나는 테이블마다 I 컨텍스트 스위치를 업데이트해야 할 또는 다른 개의 ASID를 사용하여 동일한 vaddr과 일치하는 항목을 여러 개 가질 수 있습니까?

Actullay, OS에서주의해야합니다. 예를 들어 Linux OS는 고유 한 ASID를 프로세스에 할당합니다.8 비트 또는 16 비트 ASID 레지스터의 경우 총 ASID 범위가 제한됩니다.

모든 ASID가 사용될 때 Linux OS는 전체 TLB를 무효화하고 0에서 ASID 번호를 두 번째 루프의 시작으로 다시 할당합니다.

+0

ARMv8-A PG를 인용 (12-4 페이지) : "[...] TLB는 최근에 액세스 한 페이지 변환의 캐시입니다." 따라서 어떤 캐시와 마찬가지로 언제든지 항목을 추출 할 수 있으며 특정 ASID 바인딩 (TLB에만 존재)을 잃어 버릴 수 있습니다. 그 후에 TLB 항목이 누락되면 테이블 워크가 발생하여 CURRENT asid를 새로 추가 된 TLB 항목에 할당합니다 (12-27 페이지 참조). NB : OS를 쓰고 있습니다. – maxbc

+0

@maxbc 답변과 귀하의 의견은 모두 정확합니다. TLB는 '내용 주소 지정 가능 캐시 (content addressable cache)'입니다. 태그는 'a1'주소뿐만 아니라 ASID입니다. p1/p2가 모두 'a1'에 액세스하면 TLB에 두 개의 항목이 할당됩니다. 특정 버전에 액세스하려면 운영 체제가 ASID를 올바르게 설정해야합니다. 또 다른 방법은 액세스 권한 만있는 세 번째 매핑을 만드는 것입니다. 이 경우 각 프로세스 'a1'주소에 대해 '수퍼 VA'별칭 매핑을 사용하게됩니다. 또한 프로세스 변경시 페이지 테이블을 업데이트해야합니다. 첫 번째 레벨 항목도 캐싱됩니다. –

+2

ASID의 이점은 일관된 데이터를 유지하기 위해 TLB 및 D/I 캐시를 플러시/무효화 할 필요가 없다는 것입니다. 운영체제는 컨텍스트 스위치를 사용하여 관리해야합니다. '문맥 전환 할 때마다 테이블을 업데이트해야합니까?' 네 그럼요. TLB/캐시에 있는지 여부는 어떻게 알 수 있습니까? 매번 테이블을 만들 필요가 없으며 L1 항목 만 변경하면됩니다. 만나다; [MMU 및 페이지 테이블] (http://stackoverflow.com/questions/9929755/do-multi-core-cpus-share-the-mmu-and-page-tables/33239191#33239191) –