2013-10-09 2 views
0

타이머를 설정하기 위해 userspace 프로그램에서 사용할 e 커널 모듈을 빌드하려고합니다. 문자 장치로 구현하고 있습니다. 커널 모듈에 여러 타이머를 구현하는 가장 좋은 방법은 무엇입니까?커널 모듈에 여러 타이머를 적용하는 가장 좋은 방법은 무엇입니까

현재 'timer_list *', '타이머'가 있습니다. 타이머에 대한 새 요청을받을 때마다 힙의 메모리를 할당하고 setup_timer() 및 mod_timer()를 사용하여 메모리를 할당 할 때마다 타이머를 설정합니다. 하지만 timer_list 구조체에 하나의 포인터 만 사용하고 있습니다. 하지만 여기서주의 할 점은 'timer'의 현재 값이 콜백 함수가 호출 된 구조를 가리 키지 않을 수 있기 때문에 일단 콜백 함수가 호출되면 'timer'에 할당 된 메모리를 해제하는 것입니다.

그래서 구조체의 주소를 콜백 함수의 인수로 전달한 다음 해당 주소에서 kfree()를 호출하는 방법에 대해 생각했습니다.

struct timer_list *timer; 
timer = kmalloc(sizeof(struct timer_list), GFP_KERNEL); 
setup_timer(timer, my_callback, (unsigend long)timer); 

내 콜백 함수는 다음과 같습니다 : I 데이터가 특정 주소에 대한 페이지가없는 말> 타이머 -를 인쇄 할 때이 경우

void my_callback (unsigned long data) 
{ 
     struct timer_list *timer = (struct timer_list*)data; 
     printk("%d\n", timer->data); 
     kfree(timer); 
} 

내가 세그먼트 오류를 ​​얻고있다. 콜백 함수가 호출 될 때 timer_list에 할당 된 memoery가 해제됩니다. 이 경우 메모리를 확보하는 것에 대해 걱정할 필요가 없습니다.

또한이 방법을 구현하는 더 좋은 방법이 있습니까? 또한 타이머의 존재를 확인하는 것과 같이 모든 타이머를 추적하려면 연결된 목록과 같은 것을 유지할 수 있습니까? 아니면이를 확인하는 커널 함수가 있습니까?

+0

와 함께 프로그램을 다시 할 수 있기 때문에 어쩌면 http://stackoverflow.com/questions/9662193/how-to-access-kernel-space-from-user- 보면 자동으로 해제되지 않습니다 spacein-linux. 사용자 공간 코드는 커널 메모리에 액세스 할 수 없으므로 커널에서 사용자 공간으로 데이터를 복사해야합니다. – JimmyB

+0

@HannoBinder 감사합니다. 그러나 언급 한 링크에서 내 질문에 대한 답변을 찾지 못했습니다. – Poojan

+0

커널과 사용자 공간간에 데이터를 교환하는 방법에 대한 몇 가지 참고 자료를 알려 드리고 싶습니다. - 어리석은 질문 : kmalloc이 성공합니까? 반환 된 주소가 콜백에 전달 된 주소와 실제로 동일합니까? – JimmyB

답변

1

어떤면에서 모든 타이머를 추적해야합니다. 예를 들어 보류중인 타이머의 list (list.h 참조)을 사용할 수 있습니다. 그런 다음 목록에서 반복하여 타이머가 이미 만료되었는지 확인하고 메모리를 릴리스하고 목록에서 제거 할 수 있습니다. 새 타이머를 할당하기 전에이 작업을 수행 할 수 있습니다.

timer_list

mod_timer()

+0

많은 도움이됩니다! 이 경우 kfree()를 사용하여'timer_list'를 해제하려고 할 때 세그먼테이션 오류가 발생하는 이유를 모르겠습니다. – Poojan

+0

'kfree()'를 사용하는 위치에 따라 다릅니다. 당신의 예제에서는 사용 중에'timer_list' 메모리를 무효화합니다.아마'kfree()'가 실패한 것이 아니지만,'kfree()'를 한 후에'timer_list' 메모리를 사용하는 것이 겠지요. – Federico

관련 문제