타이머를 설정하기 위해 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가 해제됩니다. 이 경우 메모리를 확보하는 것에 대해 걱정할 필요가 없습니다.
또한이 방법을 구현하는 더 좋은 방법이 있습니까? 또한 타이머의 존재를 확인하는 것과 같이 모든 타이머를 추적하려면 연결된 목록과 같은 것을 유지할 수 있습니까? 아니면이를 확인하는 커널 함수가 있습니까?
와 함께 프로그램을 다시 할 수 있기 때문에 어쩌면 http://stackoverflow.com/questions/9662193/how-to-access-kernel-space-from-user- 보면 자동으로 해제되지 않습니다 spacein-linux. 사용자 공간 코드는 커널 메모리에 액세스 할 수 없으므로 커널에서 사용자 공간으로 데이터를 복사해야합니다. – JimmyB
@HannoBinder 감사합니다. 그러나 언급 한 링크에서 내 질문에 대한 답변을 찾지 못했습니다. – Poojan
커널과 사용자 공간간에 데이터를 교환하는 방법에 대한 몇 가지 참고 자료를 알려 드리고 싶습니다. - 어리석은 질문 : kmalloc이 성공합니까? 반환 된 주소가 콜백에 전달 된 주소와 실제로 동일합니까? – JimmyB