0

커널 모듈/드라이버를 작성하는 동안 대부분의 구조는 일부 특정 기능을 가리 키도록 초기화됩니다. 이것에있는 초심자는 이것의 중요성을 설명 할 수 있었다. 구조체를 사용하여 함수 설정

이 또한 내가 기능이 선언에 있는데도 그들은 항상 구현되지 않은 것을 발견 문자 장치 드라이버를 쓰는 동안

은 내가 struct file_operations을 보았다. 아무도 그걸 도울 수 있을까? 예를 들어, 커널 소스 : 정의 커널/dma.c,

static const struct file_operations proc_dma_operations = { 
    .open  = proc_dma_open, 
    .read  = seq_read, 
    .llseek  = seq_lseek, 
    .release = single_release, 
}; 

그겁니다 만 proc_dma_open 구현됩니다.

+3

아니요, 다른 기능 (seq_read, seq_lseek 및 single_release)은 다른 곳에서 간단하게 구현됩니다. – fge

+0

@fge 커널 소스의 dma.c, dma.h 또는 seq_file.h에서'seq_read','single_release','seq_lseek'를 찾을 수 없습니다. '' – user567879

+0

이 예제는 다소 이상합니다. 일반적으로 이러한 구조를 채울 때 함수에 대한 포인터로 채 웁니다. 여기서는 몇 가지 "표준"기능 (seq_xxx, fs/seq_file.c에 구현 됨)과 사용자 고유의 기능 (proc_dma_open)을 사용합니다. – ugoren

답변

1

기능 seq_read, seq_lseeksingle_release는 커널 소스 파일 linux-3.1.6/include/linux/seq_file.h에 선언하고, 커널 소스 파일 linux-3.1.6/fs/seq_file.c에 정의되어 있습니다. 아마도 많은 파일 작업에 공통적 일 수 있습니다.

1

C++와 같은 객체 지향 언어로 작업 한 적이 있다면 file_operations을 기본 클래스로, 함수를 가상 메서드 구현으로 생각하십시오.

0

함수에 대한 포인터는 함수 호출의 실시간 리디렉션을 허용하는 C 언어의 매우 강력한 도구입니다. 모든 운영 체제가 아니라면 대부분의 경우 비슷한 메커니즘이 있습니다. 예를 들어, TSR 프로그램이 존재하도록 허용 한 오래된 MS-DOS의 악명 높은 INT 21 기능 25/35와 같습니다.

C에서 함수에 대한 포인터를 변수에 할당 한 다음 해당 변수를 통해 해당 함수를 호출 할 수 있습니다. 함수는 일부 매개 변수를 기반으로하는 초기화시 또는 런타임에 일부 동작을 기반으로 변경 될 수 있습니다. 여기

은 예입니다 : 시스템 호출에 전달 될 수있는 구조의 포인터 "삶"이 시스템 기능에 후크를 할 수있는 매우 강력한 기능입니다

int fn(int a) 
{ 
    ... 
    return a; 
} 

... 

int (*dynamic_fn)(int); 
... 
dynanic_fn = &fn; 
... 
int i = dynamic_fn(0); 

.

개체 지향 언어에서 리플렉션을 사용하여 클래스를 동적으로 인스턴스화하면 동일한 유형의 동작을 얻을 수 있습니다.

관련 문제