[아 감] 손 잡 이 는 리 눅 스 운영 체제 의 장치 드라이버 를 만 드 는 방법 을 가르쳐 줍 니 다 (2)
아주 간단 한 문자 장치 입 니 다. 파일 이름 은 test 라 고 합 니 다.그래.아래 컴 파일
파일 테스트 를 받다.o 는 장치 드라이버 입 니 다.장치 드라이버 에 여러 개의 파일 이 있 으 면 모든 파일 을 위의 명령 행 에 따라 컴 파일 한 다음:
드라이버 가 이미 컴 파일 되 었 으 니, 지금 그것 을 시스템 에 설치 해라.
설치 에 성공 하면 / proc / devices 파일 에서 장치 test 를 볼 수 있 고 주 장치 번 호 를 볼 수 있 습 니 다. 마 운 트 해제 하려 면 실행 하 십시오.
다음 단 계 는 장치 파일 을 만 들 것 입 니 다.
c 는 문자 장 치 를 말 합 니 다. major 는 주 장치 번호 입 니 다. 바로 / proc / devices 에서 보 았 습 니 다.셸 명령 으로
주 장치 번 호 를 얻 을 수 있 습 니 다. 위의 명령 행 을 셸 script 에 추가 할 수 있 습 니 다.minor 는 장치 번호 에서 0 으로 설정 하면 됩 니 다.우 리 는 지금 장치 파일 을 통 해 드라이버 에 접근 할 수 있다.작은 테스트 프로그램 을 작성 하 세 요.
컴 파일 실행, 전체 1 이 인쇄 되 었 는 지 확인 하 시 겠 습 니까?
이상 은 단지 간단 한 시연 일 뿐이다.실제 실 용적 인 드라이버 는 중단, DMA, I / O port 등 문 제 를 처리 해 야 한다.이것 이 야 말로 진정한 난점 이다.다음 절, 실제 상황 의 처 리 를 보 세 요.
3. 장치 드라이버 의 구체 적 인 문제
1 I/O Port
하드웨어 와 접촉 할 때 I / O Port 와 떨 어 질 수 없다. 오래된 ISA 장 치 는 항상 실제 I / O 포트 를 차지한다. Liux 에서 운영 체 제 는 I / O 포트 에 대한 차단 이 없다. 즉, 모든 드라이버 가 임의의 I / O 포트 에 대해 조작 할 수 있 기 때문에 혼란 을 일 으 키 기 쉽다.모든 드라이버 는 포트 오용 을 스스로 피해 야 한다.두 개의 중요 한 kernel 함수 가 드라이버 가 이 점 을 할 수 있 도록 보장 할 수 있다.
1)check_region(int io_port, int off_set)
이 함 수 는 시스템 의 I / O 표를 살 펴 보고 다른 드라이버 가 특정한 I / O 포트 를 차지 하 는 지 확인 합 니 다.
인자 1: io 포트 의 기본 주소,
인자 2: io 포트 가 차지 하 는 범위 입 니 다.
반환 값: 0 은 점용 되 지 않 았 습 니 다. 0 이 아 닌 것 은 점용 되 었 습 니 다.
2)request_region(int io_port, int off_set,char *devname)
이 I / O 포트 가 점용 되 지 않 았 다 면 드라이버 에서 사용 할 수 있 습 니 다.사용 하기 전에 다른 프로그램 에 의 해 점용 되 지 않도록 시스템 에 등록 해 야 한다.등록 후, / proc / ioports 파일 에서 등 록 된 io 입 구 를 볼 수 있 습 니 다.
인자 1: io 포트 의 기본 주소 입 니 다.
인자 2: io 포트 가 차지 하 는 범위 입 니 다.
인자 3: 이 io 주소 의 장치 이름 을 사용 합 니 다.
I / O 포트 에 등록 하면 안심 하고 inb (), outb () 같은 편지 로 방문 할 수 있 습 니 다.일부 Pci 장치 에서 I / O 포트 는 메모리 에 매 핑 되 고 이 포트 에 접근 하려 면 메모리 에 접근 하 는 것 과 같 습 니 다.항상 우 리 는 메모리 의 물리 적 주 소 를 얻어 야 한다.dos 환경 에서 (dos 운영 체제 라 고 말 하지 않 는 이 유 는 DOS 가 운영 체제 가 아니 라 고 생각 하기 때 문 입 니 다. 너무 간단 하고 안전 하지 않 습 니 다) 세그먼트: 오프셋 만 사용 하면 됩 니 다.window 95 에서 95ddk 는 vmm 호출 을 제공 합 니 다MapLinearToPhys 는 선형 주 소 를 물리 적 주소 로 바 꾸 는 데 사용 합 니 다.그런데 리 눅 스에 서 어떻게 했 어 요?
2 메모리 조작
장치 드라이버 에서 동적 으로 메모 리 를 엽 니 다. malloc 가 아니 라 kmalloc 또는 get 을 사용 합 니 다.free_페이지 직접 신청 페이지.메모리 방출 은 kfree 또는 freepages。 kmalloc 등 함수 가 물리 적 주 소 를 되 돌려 줍 니 다!malloc 등 은 선형 주 소 를 되 돌려 줍 니 다!kmalloc 가 물리 적 주 소 를 되 돌려 준 다 는 점 에 대해 저 는 잘 모 르 겠 습 니 다. 선형 주소 에서 물리 적 주소 로 전환 하 는 것 은 386 cpu 하드웨어 로 이 루어 진 것 이기 때문에 어 셈 블 리 명령 의 조작 수 는 선형 주소 여야 합 니 다. 드라이버 역시 물리 적 주 소 를 직접 사용 할 수 없고 선형 주소 입 니 다.그러나 사실상 kmalloc 가 되 돌아 오 는 것 은 물리 적 주소 이 고 이 를 통 해 실제 RAM 에 직접 접근 할 수 있다. 나 는 이렇게 두 가지 로 해석 할 수 있다 고 생각한다. 하 나 는 핵심 상태 에서 페이지 를 나 누 는 것 을 금지 하 는 것 이지 만 이것 은 현실 적 이지 않 은 것 같다.다른 하 나 는 Liux 의 페이지 디 렉 터 리 와 페이지 항목 이 물리 적 주 소 를 선형 주소 와 똑 같이 디자인 한 것 이다.제 생각 이 맞 는 지 모 르 겠 지만 고수 님 께 가르침 을 청 합 니 다.
말하자면 kmalloc 는 최대 128 k - 16 만 열 수 있 고 16 개의 바이트 가 페이지 설명자 구조 에 의 해 점용 되 었 음 을 주의해 야 한다.kmalloc 용법 khg 참조.
메모리 맵 의 I / O 포트, 레지스터 또는 하드웨어 장치 의 RAM (예 를 들 어 디 스 플레이) 은 일반적으로 F00000 이상 의 주소 공간 을 차지한다.드라이버 에 직접 접근 할 수 없습니다. kernel 함수 vremap 를 통 해 다시 매 핑 된 주 소 를 얻 으 십시오.또한 많은 하드웨어 는 DMA 전송 으로 비교적 큰 연속 메모리 가 필요 하 다.이 메모 리 는 파일 로 교환 할 수 없 도록 메모리 에 계속 남아 있어 야 한다.그러나 kmalloc 는 최대 128 k 의 메모리 만 열 수 있다.이것 은 시스템 메모 리 를 희생 하 는 방법 으로 해결 할 수 있다.구체 적 인 방법 은 예 를 들 어 당신 의 기 계 는 32M 의 메모리 로 lilo 에 있 습 니 다.conf 의 시작 매개 변수 에 mem = 30m 를 추가 하면 Liux 는 기계 가 30m 의 메모리 만 있 고 나머지 2M 에 vremap 이 존재 한 후에 DMA 에 사용 할 수 있다 고 생각 합 니 다.
vremap 으로 비 친 메모리 입 니 다. 사용 하지 않 을 때 unremap 을 사용 하여 방출 합 니 다. 그렇지 않 으 면 페이지 표를 낭비 할 수 있 습 니 다.
3 인 터 럽 트 처리
I / O 포트 를 처리 하 는 것 과 마찬가지 로 인 터 럽 트 를 사용 하려 면 시스템 에 먼저 등록 해 야 합 니 다.
irq: 신청 할 중단 입 니 다.
handle: 인 터 럽 트 처리 함수 포인터.
flags:SA_INTERRUPT 는 빠 른 중단, 0 정상 중단 을 요청 합 니 다.
장치 이름.
등록 이 성공 하면 0 으로 돌아 갑 니 다. 이 때 / proc / interrupts 파일 에서 요청 한 중단 을 볼 수 있 습 니 다.
4 흔히 볼 수 있 는 질문 들
하드웨어 조작 에 있어 서 때로는 순서 가 매우 중요 하 다.그러나 C 언어 로 저급한 하드웨어 조작 을 쓰 면 gcc 는 프로그램 을 최적화 시 켜 순서 가 틀 립 니 다.어 셈 블 리 로 쓰 면 gcc 역시 어 셈 블 리 코드 를 최적화 시 킬 것 입 니 다. volatile 키워드 로 수식 하지 않 는 한.가장 안전 한 방법 은 최 적 화 를 금지 하 는 것 이다.이것 은 당연히 당신 이 작성 한 코드 의 일부분 만 을 사용 할 수 있 습 니 다.하면, 만약, 만약...
최적화 되 지 않 으 면 드라이버 를 불 러 올 수 없다 는 것 을 알 게 될 것 이다.이것 은 드라이버 를 컴 파일 할 때 gcc 의 확장 기능 을 사용 해 야 하기 때문에 이러한 확장 기능 은 최적화 옵션 을 추가 한 후에 야 나타 날 수 있 습 니 다.
kernel 의 디 버 깅 도구 에 대해 서 나 는 아직 적당 한 것 을 발견 하지 못 했다.누가 알 고 있 으 면 저 에 게 알려 주 십시오. 감격 해 마지 않 습 니 다.나 는 줄곧 printk 에서 디 버 깅 정 보 를 인쇄 하고 있 는데, 오히려 그럭저럭 괜찮다.장치 드라이버 에 대해 서 는 대기 / 깨 우기 메커니즘, 블록 장치 의 작성 등 많은 내용 이 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
용감한 바로 가기 및 우분투 응용 프로그램안녕하세요 여러분, 이 기사에서는 모든 사이트에서 pwa를 생성하고 실행기 응용 프로그램으로 추가하는 방법을 설명하고 싶습니다. 일부 웹사이트는 PWA로 설치를 허용하지 않지만 유사한 애플리케이션을 원합니다. 1. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.