제3 장 세 개의 데이터 구조 와 문자 장치 의 등록

8974 단어 데이터 구조
이전 편 에 서 는 등록 장치 번 호 를 말 했 는데, 분명히 등록 장치 번 호 는 드라이버 코드 를 작성 하 는 첫 번 째 단계 일 뿐이다.이후 의 일부 절 차 를 완성 하기 위해 서 먼저 세 가지 중요 한 커 널 데이터 구 조 를 소개 한다.
       file_operation 은 모든 장치 가 장치 번호 로 작 동 하 는 링크 를 포함 합 니 다.linux 에서 드라이브 는 파일 로 존재 하지만 fileoperation 은 파일 (여 기 는 문자 장치) 의 모든 작업 에 대한 집합 입 니 다.왜냐하면 fileoperation 의 구성원 이 너무 많 고 현재 scull 프로젝트 는 그 중의 몇 개 만 사용 하고 있 습 니 다.scull 프로젝트 의 fileoperation 초기 화 는 다음 과 같 습 니 다.
1 struct file_operations scull_fops = {
2 .owner = THIS_MODULE,
3 .llseek = scull_llseek,
4 .read = scull_read,
5 .write = scull_write,
6 .ioctl = scull_ioctl,
7 .open = scull_open,
8 .release = scull_release,
9 };

owner 는 이 구 조 를 가 진 모듈 을 가리 키 며 거의 모든 상황 에서 값 은 THIS 입 니 다.MODULE, 이것 은 < linux / module. h > 에 정 의 된 매크로 입 니 다.llseek 방법 은 파일 의 현재 읽 기 / 쓰기 위 치 를 바 꾸 고 새로운 위 치 를 (바른) 반환 값 으로 합 니 다.read 는 장치 에서 데 이 터 를 가 져 오 는 데 사 용 됩 니 다.write 는 장치 에 데 이 터 를 보 내 는 데 사 용 됩 니 다.ioctl 은 장치 의 특정 명령 (read 또는 write 가 아 닌) 을 보 내 는 데 사 용 됩 니 다.open 은 장치 파일 을 열기 위해 장치 파일 에 대한 첫 번 째 작업 이 어야 합 니 다.release 파일 구조 해제.
       file 데이터 구 조 는 열 린 파일 을 대표 합 니 다.와 같다 fileoperation 은 작업 의 집합 을 지정 하 였 습 니 다. file 은 이 작업 의 목표 대상 입 니 다.
      inode 데이터 구조 도 파일 을 표시 하지만 그 는 file 데이터 구조 와 다르다.작성 구동 에 있어 서 이 데이터 구 조 는 두 필드 에 유용 합 니 다.dev_t i_rdev 대표 장치 번호, struct cdev * icdev;문자 장 치 를 대표 합 니 다.상세 한 정 보 는 사용 할 때 까지 깊이 연구 하 세 요.
      설명 하고 자 하 는 것 은 Liux 소스 코드 가 이러한 데이터 구 조 를 초기 화 할 때 보통 c 언어의 표기 식 구조 로 문법 을 초기 화 하 는 것 이다.
      Liux 커 널 은 내부 에서 문자 장 치 를 대표 하 는 형식 struct cdev 를 사용 합 니 다.그리고 scull 에 서 는 사용자 정의 struct scull 을 사용 합 니 다.dev 형식의
구 조 는 모든 설 비 를 나타 내 는데 이 구 조 는 struct cdev 구 조 를 포함한다.
1 struct scull_dev {
2 struct scull_qset *data; /* Pointer to first quantum set */
3 int quantum; /* the current quantum size */
4 int qset; /* the current array size */
5 unsigned long size; /* amount of data stored here */
6 unsigned int access_key; /* used by sculluid and scullpriv */
7 struct semaphore sem; /* mutual exclusion semaphore */
8 struct cdev cdev; /* Char device structure */
9 };

이 구 조 를 초기 화하 고 등 록 된 함 수 는 다음 과 같 습 니 다.
 1 static void scull_setup_cdev(struct scull_dev *dev, int index)
2 {
3 int err, devno = MKDEV(scull_major, scull_minor + index);
4 cdev_init(&dev->cdev, &scull_fops);
5 dev->cdev.owner = THIS_MODULE;
6 dev->cdev.ops = &scull_fops;
7 err = cdev_add (&dev->cdev, devno, 1);
8 /* Fail gracefully if need be */
9 if (err)
10 printk(KERN_NOTICE "Error %d adding scull%d", err, index);
11 }

이렇게 해서 문자 장치 의 초기 화 와 등록 이 완료 되 었 습 니 다.

좋은 웹페이지 즐겨찾기