태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

지니넷

shell에서 명령을 이용하거나 app에서 파일 처리 함수로 proc 파일에 접근하면, 커널은 proc_dir_entry 구조체 변수의 정보를 이용해 proc 파일을 생성한 디바이스 드라이버가 제공하는 함수를 호출한다.
app에서 proc 파일에 쓰기를 하면 proc_dir_entry 구조체 필드의 write_proc 필드에 지정된 함수가 호출되고, 이 함수는 app에서 써넣어진 데이터를 처리해야 한다.
반대로 app에서 proc 파일에 읽기를 수행하면 proc_dir_entry 구조체 필드의 read_proc 필드에 지정된 합수가 호출되고, 이 함수는 app에서 읽을 데이터를 제공해야 한다.
◇ proc 파일 시스템은 일반 파일 시스템처럼 처리가 가능하고, 대부분의 디바이스 드라이버는 PAGE_SIZE - 80 크기 이하의 파일만 다룬다.

struct proc_dir_entry *root_proc_dir;
root_proc_dir = proc_mkdir("testdir", 0);

struct proc_dir_entry *root_proc_file;
root_proc_file = create_proc_entry("testfile", S_IFREG|S_IRWXU, root_proc_dir);
if ( ! root_proc_file )
    return CU_ERROR;
root_proc_file->read_proc = ...
root_proc_file->write_proc = ...

◇ proc 파일은 proc 디렉토리와 달리 읽기와 쓰기에 대한 함수를 제공해야 한다. 그렇지 않으면 app에서 읽기나 쓰기가 실패한다.

int read_proc_test (char *page, char **start, off_t off, int count, int *eof, void *data_unused)
{
    page에 쓴다.
    *eof = 1;
    return 써 넣어진 데이터 수;
}

◇ page는 파일 전체의 메모리 주소고, 이 주소가 가리키는 공간의 크기는 PAGE_SIZE다. 그러나 이 크기 모두를 사용하는 것보다 PAGE_SIZE-80 크기로 생각하고 작성하는 편이 안전하다.
◇ 함수 반환값이 app에서 요구한 크기보다 작고, *eof에 0을 대입하여 반환하면 계속 호출된다. 그러므로 *eof에 1을 대입하고 함수를 종료하는 편이 안전하다. *eof에 0을 대입하고 함수를 종료하는 경우는 proc 파일 스트림을 구현하기 위한 방법을 사용할 때이다.

int write_proc_test (struct file *file, const char *buffer, unsigned long count, void *data)
{
    사용자 공간의 메모리인 buffer의 내용을 커널 공간에 써넣는다.
    return 처리된 데이터 수
}

◇ buffer는 사용자 메모리 공간으로 직접 접근되지 않으므로 copy_from_user() 함수 등을 이용하여 커널 메모리 공간에 복사한 후 사용해야 한다.





저작자 표시
신고
Posted by 지니넷 Trackback 0 Comment 0


티스토리 툴바