커널은 memory protection을 하고 있기 때문에. 바로 건들지 않고, copy 해와야 한다.
관련함수는 copy_from_user(). copy_to_user() 이다.
#include <asm/uaccess.h>
copy_to_user(buf, &k_data, count);
copy_from_user(&k_data, buf, count);
kmalloc시
메모리 해제될 때까지 block 되었다가 기다리게 하는 것을 GFP_KERNEL 옵션
무조건 할당하고 없으면 즉시 NULL을 반환하는 것은 GFP_ATOMIC 옵션
연속된 물리 메모리를 할당받을 때 사용하는 것은 GFP_DMA 옵션
OS와 드라이버에 대한 깊은 이해가 필요한데. 과부하와 버그에 대해서 대처 방법을 모를 수 있다.
내가 구현하고 싶은 디바이스 드라이버가 있으면, 가장 비슷한 디바이스 드라이버를 참조해서 도움이 된다.
함수로 쓰지 않는 것이 좋다고 한다. . (하지만, 천재는 제외겠지. ㅋ)
ssize_t sk_write (struct file *filp, const char *buf, size_t count, loff_t *f_pos) {
void * k_data;
k_data = kmalloc(count, GFP_KERNEL);
if (k_data == NULL) {
}
ret = copy_from_user(k_data, buf, count);
if(ret < 0) return -1;
....
'c or linux' 카테고리의 다른 글
tar를 풀면서(extract) 특정 디렉토리로 이동하기 (0) | 2011.04.19 |
---|---|
리눅스 커널 소스 검색 (0) | 2011.04.19 |
커널 모듈 파라미터 넘기기 (0) | 2011.04.19 |
mkfifo 명령어 (0) | 2011.04.19 |
메모리의 특정 위치에 값 지정하기 (0) | 2011.04.19 |