2013-03-19 4 views
17

DSB, DMB 및 ISB는 지침의 순서 변경 방지를위한 방벽이라는 것을 알고 있습니다. 나는 또한 그들 각각에 대해 아주 좋은 설명을 많이 찾을 수 있지만, 그것들을 사용해야하는 경우를 상상하기는 꽤 어렵다.ARM의 장애물 (DSB, DMB, ISB)의 실제 사용 사례

또한 오픈 소스 코드에서 나는 때때로 그 장벽을 보지만 사용 이유를 이해하는 것은 어렵습니다. 다음과 같이 그냥 예를 들어, 리눅스 커널 3.7 tcp_rcv_synsent_state_process 기능에, 선이있다 : smp_mb()가 기본적으로 DMB

if (unlikely(po->origdev)) 
      sll->sll_ifindex = orig_dev->ifindex; 
    else 
      sll->sll_ifindex = dev->ifindex; 

    smp_mb(); 

    if (po->tp_version <= TPACKET_V2) 
      __packet_set_status(po, h.raw, status); 

입니다. 실생활에 대한 몇 가지 예를 들려 주시겠습니까? 장벽에 대해 더 많이 이해하는 데 도움이됩니다.

+0

이 질문은 최근 예제입니다. http://stackoverflow.com/q/15003405/1163019 – auselen

+0

Cortex 프로그래머 가이드에는 장벽 (11.2) 섹션이 있습니다. http://infocenter.arm.com/help/topic/com.arm.doc.den0013c/index.html – auselen

+1

매우 광범위한 질문이므로 아직 닫으려고합니다. – auselen

답변

26

죄송합니다. 이미 묻고있는 것처럼 간단한 예제를 제공하지 않을 것입니다. 이미 리눅스 소스 코드를 살펴 보았으므로 돌아 다니는 사람들이 많기 때문입니다. 도움. 부끄럽지 않은 사람은 처음에는 메모리 액세스 문제로 인해 처음에는 혼란 스럽습니다. :)

주로 응용 프로그램 개발자 인 경우에는 그다지 걱정하지 않아도됩니다. 동시성 프레임 워크를 사용하면 문제를 해결할 수 있습니다.

주로 장치 드라이버 개발자 인 경우 이전 코드를 사용하여 코드에 영향을 주었던 (인터럽트 원본을 지우고 DMA 설명자를 작성한) 코드에 종속 될 때마다 다른 액세스가 수행됩니다 (인터럽트를 다시 활성화하고 DMA 트랜잭션을 시작).

동시성 프레임 워크 (또는 디버깅)를 개발하는 과정에 있다면 주제를 조금 더 읽어야 할 것입니다. 그러나 질문은 즉각적인 필요보다는 피상적 인 호기심을 암시합니다. 동시성 프레임 워크에서 제공하는 프리미티브를 기반으로하지 않고 스레드간에 데이터를 전달하는 고유 한 방법을 개발하는 경우 모든 의도와 목적을 위해 동시성 프레임 워크가 필요합니다.그 조금 너무 하드 코어, 나는 조금의 3 부분으로 블로그 시리즈를 쓴라면 Memory Barriers: a Hardware View for Software Hackers

:

폴 맥킨은 어떤 효과가 실제로 프로세서가 메모리 장벽에 대한 필요성과에 우수한 논문을 썼다 더 가볍고 ARM 전용 뷰로 끝납니다. 첫 번째 부분은 Memory access ordering - an introduction입니다.

그러나 특히 ARM 아키텍처의 경우 예를 들어 구체적으로 나열한 경우 Barrier Litmus Tests and Cookbook보다 훨씬 좋을 수 있습니다.

여분-여분의 빛 프로그래머의 관점과 완전히 구조적으로 정확하지 버전은 다음과 같습니다

  • DMB - 메모리 액세스가 다른 메모리 액세스와 관련하여 주문 필요로 할 때마다.
  • DSB - 프로그램 실행이 진행되기 전에 메모리 액세스가 완료되어야 할 때마다.
  • ISB - 메모리 패치가 업데이트되거나 실행될 코드를 작성한 후와 같이 프로그램의 특정 지점 이후에 명령 페치가 명시 적으로 수행되어야하는 경우. (실제로는이 시점에서 "미리 가져온 지침을 버리십시오").
4

보통 메모리 액세스가 특정 순서로 발생하는지 확인해야하는 경우 메모리 장벽을 사용해야합니다. 이는 여러 가지 이유로 필요 할 수 있습니다. 일반적으로 두 개 이상의 프로세스/스레드 또는 하드웨어 구성 요소가 동일한 메모리 구조에 액세스 할 때 필요합니다. 일관성을 유지해야합니다.

이것은 DMA 전송에 자주 사용됩니다. 간단한 DMA 제어 구조는 다음과 같습니다

struct dma_control { 
    u32 owner; 
    void * data; 
    u32 len; 
}; 

소유자는 일반적으로 OWNER_CPU 또는 OWNER_HARDWARE 같은 설정됩니다이 구조 작업을 허용 두 참가자의 사람을 나타냅니다. 이 변경

코드는 일반적으로 그래서이

dma->data = data; 
dma->len = length; 
smp_mb(); 
dma->owner = OWNER_HARDWARE; 

처럼 같은 것, 렌은 항상 소유권 이전에 설정된 데이터는 DMA 하드웨어로 옮겨진됩니다. 그렇지 않으면 CPU가 메모리 액세스를 재정렬하기 때문에 엔진이 업데이트되지 않은 포인터 또는 길이와 같은 오래된 데이터를 가져올 수 있습니다.

다른 코어에서 실행중인 프로세스 또는 스레드도 마찬가지입니다. 또한 비슷한 방식으로 의사 소통을 할 수 있습니다.

2

간단한 요구 사항 중 하나는 스핀 록입니다. compare-and-swap (또는 ARM의 경우 LDREX/STREX)을 사용하고 장벽이없는 스핀 록을 구현하면 프로세서는 메모리에서 추론하여 값을로드하고 계산 된 값을 메모리에 지연 저장하고 둘 중 어느 것도 필요하지 않습니다 명령 스트림의로드/저장 순으로 나열됩니다.

특히 DMB는 DMB 주변의 메모리 액세스 순서 변경을 방지합니다. DMB가 없으면 프로세서는 스핀 록이 해제 된 후 저장소를 스핀 록으로 보호 된 메모리로 다시 정렬 할 수 있습니다. 또는 프로세서가 스핀 록이 실제로 잠기거나 스핀 록이 다른 컨텍스트에 의해 잠기기 전에 메모리를 스핀 록으로 보호 할 수 있습니다.

unixsmurf는 이미 지적했으나 Barrier Litmus Tests and Cookbook을 가리킨다. 그것은 장벽을 사용해야하는 곳과 이유를 보여주는 좋은 예입니다.