volatile 키워드는 volatile 키워드로 지정된 주소 공간에 대해서 read operation이 발생할때 마다 매번 주소 공간에서 read 합니다. 보통 gcc는 최적화 과정에서 어떤 변수 또는 주소 공간에 대해서 이전에 그 주소 공간의 값을 레지스터로 읽어 왔고, 프로세서가 명시적으로 해당 변수의 값을 변경하지 않았다면 다시 주소 공간에서 읽어오지 않고 레지스터에 읽어온 값을 사용하게 되어 있습니다. barrier() 같은 경우에 다음과 같은 매크로로 define 되어 있습니다.

#define barrier() __asm__ __volatile__("": : :"memory")

보면 아무런 operation도 없는 inline assembly 코드입니다. 콜론(':')으로 구분된 "memory" 표기되어 있는 세번째 필드는 clobber 필드라고 해서 해당 inline assembly가 수행된 후 값이 변경되는 것들을 기입합니다. 

gcc는 clobber 필드에 기
입된 내용을 토대로 다음 코드를 생성하면서 최적화를 수행하는데 일반적으로 값이 변경된 것들에 대해서는 어떤 값으로 변경 된지에 대한 정보가 없기 때문에 최적화를 수행할 수 없습니다. 
clobber 필드에 "memory"라고 표기 하는것은 모든 메모리 타입 저
장 장치(모든 레지스터, 모든 프래그, 모든 메모리 등)의 값이 변경됨을 의미합니다.  gcc는 이럴경우 __asm__ __volatile__("": : :"memory") 경계를 넘어가는 최적화 또는 instruction scheduling을 수행하지 않습니다.  때문에 __asm__ __volatile__("": : :"memory")를 사용하면 이전 코드의 수행 완료를 보장 할 수 있고 이후 코드가 __asm__ __volatile__("": : :"memory") 이전에 수행 되는 것을 방지 할 수 있습니다.

'리눅스커널' 카테고리의 다른 글

[ setup_processor ] arch/arm/kernel/setup.c  (0) 2009.10.02
[ setup_arch ] arch/arm/kernel/setup.c  (0) 2009.10.02
Memory Barrier  (0) 2009.10.02
[ __turn_mmu_on ] arch/arm/kernel/head.S  (0) 2009.10.02
[ __enable_mmu ] arch/arm/kernel/head.S  (0) 2009.10.02
Posted by blee
,