로그 할 데이터가 많고 로그 데이터를 놓치지 않으려면 간단한 이중 버퍼링 원리를 사용할 수도 있습니다.
kfifo에 대해 잘 모르겠지만 문자 장치 드라이버의 읽기 호출에서 장치에서 읽을 데이터가 없으면 사용자 공간 프로세스를 절전 모드로 설정할 수 있습니다. 커널이 문자 장치에 쓸 때마다 장치에서 대기중인 모든 프로세스를 깨울 수 있습니다. 예 :
In kernel
struct logbufStruct {
char *kbuf; //by kmalloc or any means you wish.
int ptr; //ptr to next writeable byte in kbuf.
size_t kbuf_size;
unsigned int flags;
wait_queue_head_t data_wait;
}
read(inode, filep, buf, size) {
logbufStruct = filep->private_data
if (!test_bit(HAS_DATA, &logbufstruct.flags))
wait_event_interruptible(&logbufstruct->data_wait,
test_bit(HAS_DATA, &logbufstruct.flags)||
test_bit(ERROR, &logbufstruct.flags));
/*
* When this call returns, you would either have woken up
* on data available or some signal interrupt which you should
* handle in your character device and set appropriate flags.
*/
if (test_bit(ERROR, &logbufstruct.flags) return -1;
numbytes = copy_data(logbufStruct, buf, size);
if(!has_more_data(logbufstruct)) clear_bit(HAS_DATA, &logbufstruct.flags);
return numbytes;
}
/* This is the function your modules would call to log data
* to be sent to userspace.
*/
int mylogger_log(logbufstruct, char *msg, size_t n)
{
if (logbufstruct->ptr + n > logbufstruct->kbuf_size)
return -1;
copy the data.
wake_up_interruptible(&logbufstruct->data_wait);
}
//initialization
init_waitqueue_head(&logbufstruct->data_wait);
logbufstruct->kbuf = kmalloc or whatever way you have to allocate
space for holding log messages in memory.