시스템의 부팅후 지난 시간을 알고 싶습니다.
글쓴이: uribery / 작성시간: 화, 2006/12/19 - 9:34오후
안녕하세요.
부팅후 지난 시간을 알고 싶습니다.
수십 ms, 단위의 값이 필요하기 때문에
sysinfo 함수는 적합하지 않더군요.
현재는 fopen("/proc/uptime"...) 를 이용하고 있습니다만.
/proc/uptime 관련해서 fopen, fclose가 빈번하게 일어나는 것도 그리 마음에 안들어서요.
시스템의 날짜, 시간은 바뀔수 있기때문에 gettimeofday() 함수를 이용하기도 어렵습니다.
sysinfo에서처럼 부팅후 시간을 불러오는 함수는 없을까요?
그럼 좋은 하루 보내세요. ^^
Forums:
RTC
fopen("/proc/uptime"...) + Real Time Clock을 사용하심이..
인텔 계열의 CPU를 사용하고 계신다면..
time stamp counter 를 이용하시면 되겠습니다..
CPU 내의 time tick 저장하는 Register 입니다....
long long type으로 읽어들여야하는 64비트 크기로 되어있고..
register에서 time stamp counter 값을 얻어내셨다면..
이 값은 CPU의 cycle 수 임으로..
CPU 의 HZ 값에 따라서 수식을 적용하시면 되겠습니다..
부팅시 time stamp counter를 읽으시고 저장하시고..
값이 필요할 때 마다... 현재 값에서 부팅 시 값을 빼..
Nano 초 등으로 변환해 적용하시면 되겠습니다..
/usr/include/asm or /usr/include/asm-i386 or
/usr/include/asm-x86_64/ 디렉토리내의
msh.h 에
#define rdtsc(low, high) \
__asm__ __volatile__("rdtsc":"=a"(low),"=d"(high)
이 정의되어있으며...
low와 hight 는 long 형으로 지정해서 읽어서..
long long 으로 쓰시던지 아니면..
struct rdtsc_val {
long low;
long high;
};
형식으로 사용하시면 되겠습니다...
nano second 로의 변환은 ..
tsc.c 에 정의되어 있는..
cycle_2_ns(..) 를 사용하셔도 될 것 같은데...
어쨋든...
도움이 되셨는지 모르겠네요..
사용자 영역에서 jiffies 값을 참소할 방법은 없을까요?
intel 계열인데 x86이 아니라 xscale입니다. TT
아무래도 어셈이 들어간것으로 보아서는 x86이고 커널 영역에서 사용할 수 있는 방법같습니다.
빈번하게 참조하는 관계로 fopen("/proc/uptime"..)을 피하고 싶어서요.
fgets, sscanf 쓰는것도 웬지 불필요한 일을 하는 기분이 들구요.
그냥 참조하는것보다 fopen을 통하면 웬지 성능 저하가 많을것 같은 느낌이 듭니다.
책도 좀 찾아보았는데, jiffies 값을 참조하면 유용할것 같은데, 사용자 영역에서 참조할수있는 방법을 없을까요?
감사합니다. ^^
수십 ms정도의
수십 ms정도의 정확도가 필요한 프로그램이라면 /proc/uptime을 사용하는것이 제일 좋은 방법인것 같습니다. disk에서 불러오는것도 아니라서 open하고 잃어오는데에 버려지는 시간은 충분히 무시할수 있습니다. open이 문제라면 한번 open해 놓고 lseek을 사용해도 되는것이구요..
단지 "느낌"상 꺼림직 해서 피하고 싶거나 parse하는데 걸리는게 번거로워서라면 간단한 커널모듈을 만들어서 jiffies를 보낼수도 있겠지만, uptime이 존재하는데 그럴 필요는 없겠지요.
예. uptime이 제일 무난한것 같군요.
아 fopen문제는 전에 framebuffer 관련 예제를 살펴보다가 보니
memory에 있는 것이지만
fopen으로 제어할때와 mmap로 제어할때 fopen쪽에서는 꽤나 부하가 많이 걸리는 것을 보아서요.
그래서 가능하면 fopen을 안쓰고 가능한 방법이 있지않을까해서요.
가능하면 sscanf와 같은 라이브러리 호출없이 하고 싶었는데, 적절한 방법이 없나보네요.
답변감사합니다. ^^
read/write() 와 mmap 과의
read/write() 와 mmap 과의 차이를 헷갈리셨나봅니다.
mmap() 도 open() 은 해야 가능합니다.
그리고 mmap() 은 모든 것이 PAGE_SIZE 로 align 되어 있기 때문에 만병통치약은 아닙니다.
read() 가 부담되신다면 간단한 character device (misc 를 이용하면 쉽겠지요) 를 만드셔서 mmap() 를 제공하시면 됩니다.
다만, uptime 자료를 저장할 공간으로 PAGE_SIZE align 된 공간만큼을 할당해야 한다는 것을 주의하세요.
설사 xscale 이 아니라 x86 이라 하더라도 /proc/uptime 에서 제공하는 것과 같은 자료를 참조하셔야 합니다.
CPU 의 tick 레지스터는 overflow 로 인한 wrapping 이 일어납니다.
실제 wrapping 이 일어날 시... arch 에 따라 구현의 차이가 있지만 arm 의 경우 systime 도 수십ms 정도의 오차가 생깁니다.
해당 부분을 보면 type casting 을 사용 예측(?)제어를 하는 트릭을 보실 수 있을 겁니다.
물론 jiffies 도 wrapping 됩니다. 2.6 의 64bit jiffies 는 상당이 크긴 하지만요.
댓글 달기