OS이야기

지피 - jiffy

НooпeУ 2011. 10. 17. 13:08
jiffy는 순간이라는 의미를 가지고 있다.
jiffies는 <linux/jiffies.h>에 다음과 같은 변수로 선언돼있다.

extern usigned long volatile jiffies;

  74#define __jiffy_data __attribute__((section(".data")))
  75
  76/*
  77 * The 64-bit value is not atomic - you MUST NOT read it
  78 * without sampling the sequence number in xtime_lock.
  79 * get_jiffies_64() will do this for you as appropriate.
  80 */
  81extern u64 __jiffy_data jiffies_64;
  82extern unsigned long volatile __jiffy_data jiffies;

unsigned long time_stamp = jiffies; //현재
unsigned long next_tick = jiffies + _1; // 현재로부터 하나의 tick
unsigned long later = jiffies + 5 * HZ; //현재로부터 5초후 


지피의 내부 표현
jiffy는 unsigned long 타입이기 때문에, 32비트에서는 32비트의 길이를 가진다. 100HZ에서 만약 실행된다면 497일 이후에
오버플로우가 발생한다. 그러나 1000HZ이면 49.7일만에 발생한다.

이 문제점을 해결하기 위해 linker를 이용하여 해결하엿다.

extern unsigned long volatile jiffies;

또 다른 변수가 마찬가지로 <linux/jiffies.h>에 정의되어 있다.
extern u64 jiffies_64;

ld(1) 스크립트는 주 커널 이미지(arch/i386/kernel/vmliunx.lds.S)를 링크하기 위해 사용된 후,
jiffies변수를 jiffies_64변수의 시작에 오버레이한다.

jiffies를 사용하는 코드는 jiffies_64의 하단 32비트만을 읽게 된다.
또한 함수 get_jiffies_64()를 이용해 전체 64비트 값을 읽을 수도 있따.