728x90

리눅스에서 입출력

- 수많은 입출력 장치해야함

- 디바이스 드라이버를 커널에 포함시켜 제공

- 직접 개발한 입출력 장치 추가하는경우 -> 장치 제어를 위한 디바이스 드라이버를 개발해야함

- 리눅스는 모놀리식 커널 -> 커널 기능 추가 및 변경 후 재컴파일 필요

- 대신 모듈을 사용해 커널에 동적으로 추가하거나 제거 ->재컴파일 해결, 필요할때만 커널의 크기를 줄이기가능

 

(1) 커널 프로그래밍 개요

1) 커널 프로그램과 응용 프로그램 비교

2) 커널 프로그래밍 주의사항

3) 커널 프로그램 함수

 

1) 커널 프로그램과 응용프로그램비교

실행 방식차이

1. 응용프로그램 : 실행 순서가 순차적임

  

2. 커널프로그램 : 커널에서 제공하는 시스템 콜/인터럽트에 의한 비동기적 프로그램

              -응용프로그램에서 시스템 콜 호출 or 외부 장치의 인터럽트

 

라이브러리

1. 응용프로그램 : 대부분 라이브러리를 링크하여 사용가능

2. 커널 프로그램 : 커널에서 export한 전용함수만 사용

 

어드레스 공간

- 응용프로그램, 커널 프로그램 : 서로 다른 어드레스 영역을 사용하여 각각 프로그램 코드에서 영향주지않음

- 페이지 오프셋 매크로를 기준으로 하위는 사용자 공간 상위는 커널공간이 된다.

 

사용자 공간과 커널 공간

1. 응용 프로그램 

 - 사용자 공간에서 실행. 직접적으로 하드웨어 장치나 메모리 접근 불가

2. 커널 프로그램

 - 커널 공간에서 실행. 직접적으로 하드웨어나 메모리 접근 가능.

 

변수및 함수명 충돌

1. 응용프로그램

 -현재개발하는 프로그램에서만 함수와 변수명 등 구별

2. 커널 프로그램

 - 커널 전반적인 함수와 변수명이 충돌하지 않도록 프로그래밍 해야함

 

2) 커널 프로그래밍 주의사항

커널 프로그래밍 주의사항

1. 라이브러리

 - 응용 프로그램에서 쓰던 "stdio.h" 같은 헤더파일의 중복성 유의

 - 커널에서 포함하는 헤더파일 사용

2. 변수및 함수명 충돌방지

 - 외부파일과 링크할 필요없는 심볼은 static 으로선언

 - 외부 파일과 링크할 필요있는 심볼은 심볼 테이블에 등록

 - 전역변수는 잘 정의된 접두어 사용

3. 주소 공간

 - 커널 스택 크기 제한. 인터럽트 핸들러 동일한 스택 사용 -> 큰 배열을쓰거나 재귀호출이 많이 안나도록 주의

 - 응용프로그램과 커널의 주소공간이 다르므로 응용프로그램과 데이터를 주고받기위해 특별한 함수사용

4. 에러 처리

 - 커널은 하드웨어 접근에 어떠한 제어 없음 - 커널 오류 ->치명적인 결과

 - 함수 호출시 에러발생 여부 검사해주고 처리

 

3) 커널 프로그램 함수

입출력 포트함수

- 일반 라이브러리 사용 불가

- 커널이 export 해준 함수만 사용가능

1. 입출력 포트함수

 - 디바이스 드라이버 프로그래밍에서 디바이스 레지스터 액세스에 활용

 - 입출력 포트 액세스 방법

    입출력 포트 함수 사용 : 입출력 포트 액세스 권한 획득 -> 포트 입출력 함수 호출

 - 디바이스 파일 통한 방법 : 디바이스 파일 /dev/port 오픈 -> read/write 함수 사용

2. 입출력 포트 할당

 - 커널 모드에서 액세스 권한 획득 - requset_region 함수

 - 커널에서 사용하고 있는 포트 확인 :/proc/ioports

 - 사용자 모드에서 액세스 권한 획득. ioperm 특정 포트에 대한개별설정함수, iopl 레벨로 권한설정하는 함수 함수

3. 데이터 입출력 함수

 - 입출력 포트로부터 데이터 입력 : inb,inw,inl(1,2,4바이트 입력)

 - 입출력 포트로부터 데이터 출력 : outb,outw,outl(1,2,4 바이트 출력)

4. 스트링 단위 데이터 입력 함수

 - insb, insw, insl(1*,2*,4* count 바이트 만큼 addr이 지정한 주소에 저장)

5. 스트링 단위 데이터 출력 함수

 - outsb,outsw,outsl(8비트, 16비트, 32비트  *count 만큼 출력)

 

인터럽트 처리 함수

- 디바이스 드라이버 -> 디바이스 관리 소프트웨어

- 인터럽트 핸들러 필요 -> 디바이스 드라이버에서 인터럽트 핸들러 등록 및 제어

- 인터럽트를 설정하고 처리하는 함수/매크로

1. 인터럽트 제어 함수

 - cli() :인터럽트 금지

 - sti() : 인터럽트 가능

2. 프로세서 상태 저장/복수 함수

 - save_flags : 현재 프로세서 상태를 flags 파라미터에 저장하는 함수

 - restore_flags : flags 파라미터에 저장딘 프로세서 상태 복원

3. 인터럽트 핸들러 등록/해제

 - request_irq : 인터럽트 핸들러 등록

 - free_irq : 등록된 인터럽트 핸들러 해제

4. 커널에서 동적 메모리 할당할떄 쓰는 함수

 - get_free_page, free_page : 한페이지 메모리할당하고 해제하는데 사용

 - kmalloc(), kfree() : 물리적으로 메모리를 할당하고 해제하는데 사용

 

(2) 모듈 프로그램

1) 커널 모듈

2) 모듈 프로그램 구성

3) 모듈 유틸리티

4) 모듈 컴파일

 

1) 커널 모듈

커널 모듈

- 커널 일부 기능을 독립적으로 구현한 코드

 -> 커널 실행중 동적으로 적재하거나 삭제 가능. 임베디드 시스템에 필요한 기능을 적재하는데 커널 모듈 사용

- 타겟 보드 목적과 구성에 따라 입출력 디바이스 설정

- 커널 설정시 모듈 설치가능 -> 정적로딩

- 커널이 실행되는 중간에 모듈 설치 ->동적 로딩

=> 사용자는 시스템 콜함수을 사용하여 모듈 사용가능

1. 디바이스 드라이버를 모듈로 설계

2. 커널 실행중 디바이스 드라이버를 동적으로 적재하거나 삭제

3. 커널을 반복적으로 재컴파일 하는 과정을 없앰

-> 개발시간 단축 + 불필요한 기능 동적 제거 => 커널 자원 효율적 이용

 

2) 모듈 프로그램 구성

모듈 프로그램 구성

1. 커널에서 수행될때 필요한 헤더파일과 모듈에 필요한 헤더파일 포함

2. init_module() 함수 정의

 - 모듈이 설치될때 초기화 수행 코드

 - 모듈에 필요한 메모리 할당 및 초기화 작업 실행

3. cleanup_module() 함수 정의

 - 모듈 제거시 반환작업 시행하는 코드

4. 모듈 설치될때초기화를 수행하는 코드와 모듈이 제거될때 반환하는 작업을 수행하는 코드 작성

5. init_module()과 cleanup_module() 함수 호출

 

모듈 관련 매크로

- MODULE_AUTHOR(string) : 모듈 제작자 정보

- MODULE_DESCRIPTION(string) : 모듈에 대한 설명 추가

- MODULE_PARAM() 모듈 파라미터 지정시

- MODULE_LICENSE() : 모듈 라이센스 설정

 

3) 모듈 유틸리티

모듈 적재

- /sbin/insmod [option] [-o module_name] object_file

- 옵션

  f : 커널과 모듈 버전이 달라도 강제 적제

  k : 모듈 일정시간안쓸시 kerneld 데몬이 자동 삭제

  m : 커널 패닉때 로드맵 출력해서 디버깅 쉽게함

  p : 모듈 적재 가능성 검사

  o : 모듈 이름 직접지정시 사용

  s : syslog에 메시지 출력

 

모듈 삭제

- /sbin/rmmod [option] module_name

- 옵션

 f : 강제 제거

 w : 모듈이 제거될수있을때까지 기다리다 제거

 s : syslog 매시지 출력

 

적재된 모듈 확인

- /sbin/insmod 나 cat /proc/modules로 확인 가능

 

모듈 사이 의존성 검사

- depmod 유틸리티

 

모듈의 적재 및 제거

- modprobe -> /etc/modules를 탐색하여 해당 모듈과 의존관계 있는 모듈들을 같이 적재

 

4) 모듈 컴파일

컴파일 옵션

- c 옵션 : 커널 모듈은 독립적 실행이 아니라 커널에 링크되어 실행됨. 링크 호출 제거

- Wall 옵션 : 잘못 동작되면 오류메시지 출력

- O 옵션 : 최적화 실행

 

심볼 정의

- _KERNEL 심볼 : 모듈이 커널모드에서만 실행

- MODULE 심볼 : 헤더파일에게 모듈에서 사용되는 코드로 인식

- LINUX 심볼 :리눅스를 인식

300x250

+ Recent posts