time함수를 사용해야 하는데, 없는거 같아서....
아무래도....gettimeofday같은 으로 해야할듯...한데....
커널 함수 매뉴얼 보려면 documentation디렉토리에 있는것 밖에는 없나요?
너무 불편해요...
혹시 그걸 매뉴얼로 바꾸는 방법은 없는지요? (man 말이죠...)
움, 보통 커널함수들이 sys나 do같은게 붙어서 헤깔려요...
잉....
절대적인 시간 대신에
두 절대적인 시간의 차이를 원한다면,
jiffies 변수를 사용하면 됩니다.
j1 = jiffies; /* code */ j2 = jiffies; diff_jiffies = j2-j1; diff_milli_seconds = diff_jiffies*1000/HZ;
마지막 변수는 j1시점과 j2시점의 시간차이를 milli초 단위로 가지게 됩니다.
절대적인 시간을 구하고 싶다면,
struct timeval tv; do_gettimeofday(&tv);
이렇게 하면 되는것 같네요.
참 그리고 커널이 제공하는 시스템 콜은 커널함수명이
sys_systemcall 이런식으로 되어 있습니다.
이런 함수는 대부분 do_systemcall 이런식의 커널함수를 사용하여
구현되어 있습니다.
따라서 커널에서 어떤 시스템 콜을 사용하고 싶으시다면,
sys_...함수를 보고, do_...를 호출하는 부분을 잘(?) 흉내내면 될듯 합니다..-_-;;
계속 열씸히 해서 결과 보여드리께요...^^ 감사합니다.
- by swhong in jgdr.net -
do_gettimeofday()함수를 사용했습니다.
struct timeval tmp; do_gettimeofday(&tmp);
요렇게 쓰면 되구요,
요것을 응용하여...
struct timeval start, end; float result; do_gettimeofday(&start); . code... . do_gettimeofday(&end); result = (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1000000.0;
요런 식으로 구하였습니다.
하시만 실은 커널 레벨에서 result 값을
printk("%.6f", result);
와 같이 찍어보니
%f
요렇게만 나왔습니다.
왜 float형 값이 안찍히는지 잘 모르겠습니다...
명확한 것은 너무나 적은 시간이 흘러서 안나오는 것은 아니라는 것입니다.
푸헐~
제가 알기로는
리눅스 커널의 context switching은 커널이 fpu를 사용하지 않는다는 것을 가정합니다.
user 프로세스가 스케줄링 된 다음에 첨으로 fpu를 사용할때,
exception이 발생해서 그때에 해당 프로세스의 fpu context를
불러옵니다.
또 이 프로세스가 나중에 switched-out될 때에 만약 fpu를 썼다면,
그 fpu context를 저장합니다.
만약 커널에서 fpu를 사용하게 되면, 현재 프로세스의 fpu context를
불러오게 될 것이고, 나중에 switched-out될 때에
스케줄러는 프로세스가 fpu를 썼다고 생각하여 fpu context를
저장할 것입니다. 즉, 프로세스의 fpu context를 엉뚱한 데이터로 덮어씌우는 것이 되죠.
따라서 커널에서 fpu를 사용하면 안됩니다.
이런 이유로 printk도 %f를 지원할 필요가 없겠죠..^^;
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
절대적인 시간 대신에두 절대적인 시간의 차이를 원한다면,j
절대적인 시간 대신에
두 절대적인 시간의 차이를 원한다면,
jiffies 변수를 사용하면 됩니다.
j1 = jiffies;
/*
code
*/
j2 = jiffies;
diff_jiffies = j2-j1;
diff_milli_seconds = diff_jiffies*1000/HZ;
마지막 변수는 j1시점과 j2시점의 시간차이를 milli초 단위로 가지게 됩니다.
절대적인 시간을 구하고 싶다면,struct timeval tv;
절대적인 시간을 구하고 싶다면,
struct timeval tv;
do_gettimeofday(&tv);
이렇게 하면 되는것 같네요.
참 그리고 커널이 제공하는 시스템 콜은 커널함수명이
sys_systemcall 이런식으로 되어 있습니다.
이런 함수는 대부분 do_systemcall 이런식의 커널함수를 사용하여
구현되어 있습니다.
따라서 커널에서 어떤 시스템 콜을 사용하고 싶으시다면,
sys_...함수를 보고, do_...를 호출하는 부분을 잘(?) 흉내내면 될듯 합니다..-_-;;
sliver 님 매번 답변에 정말 감사합니다.
계속 열씸히 해서 결과 보여드리께요...^^ 감사합니다.
- by swhong in jgdr.net -
감사합니다. 그래서....
do_gettimeofday()함수를 사용했습니다.
요렇게 쓰면 되구요,
요것을 응용하여...
요런 식으로 구하였습니다.
하시만 실은 커널 레벨에서 result 값을
printk("%.6f", result);
와 같이 찍어보니
%f
요렇게만 나왔습니다.
왜 float형 값이 안찍히는지 잘 모르겠습니다...
명확한 것은 너무나 적은 시간이 흘러서 안나오는 것은 아니라는 것입니다.
푸헐~
- by swhong in jgdr.net -
제가 알기로는리눅스 커널의 context switching은 커널
제가 알기로는
리눅스 커널의 context switching은 커널이 fpu를 사용하지 않는다는 것을 가정합니다.
user 프로세스가 스케줄링 된 다음에 첨으로 fpu를 사용할때,
exception이 발생해서 그때에 해당 프로세스의 fpu context를
불러옵니다.
또 이 프로세스가 나중에 switched-out될 때에 만약 fpu를 썼다면,
그 fpu context를 저장합니다.
만약 커널에서 fpu를 사용하게 되면, 현재 프로세스의 fpu context를
불러오게 될 것이고, 나중에 switched-out될 때에
스케줄러는 프로세스가 fpu를 썼다고 생각하여 fpu context를
저장할 것입니다. 즉, 프로세스의 fpu context를 엉뚱한 데이터로 덮어씌우는 것이 되죠.
따라서 커널에서 fpu를 사용하면 안됩니다.
이런 이유로 printk도 %f를 지원할 필요가 없겠죠..^^;
댓글 달기