Linux/Linux Device Driver
-
디바이스 드라이버 / 동적 메모리 할당Linux/Linux Device Driver 2020. 9. 1. 12:40
kmalloc() 연속된 물리 메모리를 연속된 가상 공간에 매핑하여 할당 받는다. GFP_KERNEL 플래그는 kmalloc() 함수에서 사용하는 대표적인 인자값으로 동적 메모리 할당이 항상 성공하도록 요구한다. 이 값으로 kmalloc() 함수를 사용하면 커널이 관리하는 메모리가 충분하지 않을 경우에는 디바이스 드라이버를 호출한 프로세스가 수행을 멈추고, 동적 메모리를 할당할 수 있는 상태가 될 때까지 잠든다. 그러다 다른 프로세스에서 메모리를 반환해 커널이 동적 메모리를 할당할 수 있는 상태가 되면 깨어난다. 그래서 kmalloc() 함수를 인터럽트 서비스에서 사용할 때는 이 값을 사용하면 안된다. GFP_ATOMIC 플래그를 사용하는 경우 슬립되지 않으므로 인터럽트 핸들러에서도 사용될 수 있다. v..
-
디바이스 드라이버 / 매개변수 지정Linux/Linux Device Driver 2020. 9. 1. 12:39
pi@raspberrypi:~/Documents/param $ nano param.c #include #include #include #include static short param1 = 0; static unsigned short param2 = 0; static int param3 = 0; static unsigned int param4 = 0; static long param5 = 0; static unsigned long param6 = 0; static char* param7 = NULL; module_param(param1, short, 0); module_param(param2, ushort, 0); module_param(param3, int, 0); module_param(param4,..
-
디바이스 드라이버 / 개발 시 고려사항Linux/Linux Device Driver 2020. 9. 1. 12:38
변수 지역 변수와 전역 변수의 선택 다비아스 드라이버는 다중 프로세스 환경에서 동작하기 때문에 프로세스간 변수 사용에 따른 경쟁 문제(동기화 문제)를 해결하기 위해 가급적 지역 변수를 사용하는 편이 좋다. 그러나 디바이스 드라이버가 커널에 적재되고 해제되는 시점까지 유지해야하는 정보라면 전역 변수로 지정해야 한다. 중복 함수명과 변수명 방지 리눅스 커널은 많은 함수와 전역 변수가 있다. 그래서 새로 추가되는 디바이스 드라이버 소스에서 사용되는 함수와 변수가 중복될 수 있다. 모듈로 작성되는 경우라면 심볼 테이블에 의해 관리되기 때문에 중복으로 인해 문제가 발생할 확률이 적어지지만, 커널 소스에 포함시키는 경우라면 심각한 문제가 발생할 수 도 있다. 그러므로 이를 미연에 방지하기 위해 함수나 변수에 sta..
-
디바이스 드라이버 / 동작 과정Linux/Linux Device Driver 2020. 9. 1. 12:37
디바이스 드라이버는 시스템이 지원하는 하드웨어를 응용프로그램에서 사용할 수 있도록 커널에서 제공하는 라이브러리다. 카메라 모바일 어플리케이션을 개발할 때도 응용프로그래머가 카메라 디바이스 드라이버를 개발하지 않고 시스템 개발자가 만들어 놓은 카메라 디바이스 드라이버를 이용하여 개발하는 것과 같다. 응용 프로그램이 커널에게 자원 처리를 요청하는 방법은 크게 2가지다. 1. 시스템 호출 방식 2. 파일 입출력 방식 하드웨어를 다루기 위해 기존의 시스템 호출 방식과 병행해서 파일 입출력 함수로 하드웨어를 제어하는 개념이다. 수정중..
-
디바이스 드라이버 / 모듈 파일들의 정체Linux/Linux Device Driver 2020. 9. 1. 12:36
수정중... 리눅스 커널 모듈 관련 명령어 명령어 내용 lsmod 현재 커널에 올라와 있는 커널 모듈 리스트를 표시한다. insmod 해당 커널 모듈들을 올린다. rmmod 해당 커널 모듈들을 내린다. modprobe 해당 커널 모듈들을 올릴 때 필요한 의존관계가 있는 모든 모듈들을 올린다. depmod modprobe 명령어를 위해 모듈들의 의존관계 리스트를 출력한다. modinfo 현재 모듈에 대한 정보를 출력한다. insmod 명령어를 이용해서 커널을 올릴 수 있지만 모듈을 올릴 때는 의존관계를 생각해야 한다. 예를 들어 USB 카메라에 대한 디바이스 드라이버를 올리고 싶은 경우라면 Video4Linux와 관련된 모듈이 먼저 올라와 있어야만 해당 디바이스 드라이버를 올릴 수 있다. insmod 명령..
-
디바이스 드라이버 / 커널 소스가 필요한 이유Linux/Linux Device Driver 2020. 9. 1. 12:36
타깃 보드에 이미 리눅스 커널이 올려져 있는데 디바이스 드라이버 코드를 컴파일하기 위해서는 커널 소스가 따로 필요하다.?? 뭔 소리일까? 디바이스 드라이버는 커널 영역에 적재되어 동작하기 때문에 커널 영역에 있는 커널 함수(일반 함수, 매크로 함수, 인라인 함수)로 구성된다. 일반 함수를 사용할 경우 분기하여 동작하므로 커널 영역의 어느 위치에 해당 일반 함수가 있는지 알아야 한다. 그래서 커널 소스를 다운로드하고 빌드하면 심볼 테이블인 Module.symvers파일이 나오는데 이 위치 정보 파일을 참조하여 컴파일한다.(그럼 System.map은 뭐할 때 사용할까??.. /proc/kallsyms도 주소가 나오는 거 같은데;;???) 매크로 함수와 인라인 함수는 일반 함수와 다르게 컴파일 시 치환된다. ..
-
디바이스 드라이버 / 실습 환경 설정 및 준비Linux/Linux Device Driver 2020. 9. 1. 12:36
디바이스 드라이버은 커널에 적재되기 때문에 디바이스 드라이버 코드를 컴파일하기 위해서는 커널 소스가 따로 필요하다. https://johnjarrer.tistory.com/110 디바이스 드라이버 / 커널 소스가 필요한 이유 타깃 보드에 이미 리눅스 커널이 올려져 있는데 디바이스 드라이버 코드를 컴파일하기 위해서는 커널 소스가 따로 필요하다.?? 뭔 소리일까? 디바이스 드라이버는 커널 영역에 적재되어 동작하� johnjarrer.tistory.com pi@raspberrypi:~/Downloads $ git clone http://github.com/raspberrypi/linux.git git명령어를 사용하면 최신 버전의 커널을 다운로드할 수 있다. pi@raspberrypi:~/Downloads $ ..
-
디바이스 드라이버 / 개발 방법Linux/Linux Device Driver 2020. 9. 1. 12:31
[파일 전송 연결] 호스트에서 코드를 작성, 빌드하여 파일을 전송하고 타깃 보드에서는 실행만 하는 경우 타깃 보드에서는 전송받은 프로그램 파일을 실행만하는 경우다. 호스트 PC에서 컴파일을 하기 때문에 타깃 보드에서 동작하는 커널 버전의 소스가 필요하다. 일반적으로 호스트 PC와 타깃 보드의 플랫폼(CPU or SOC)이 다를 수가 있고, 플랫폼이 같더라도 커널 버전이 다를 수가 있기 때문에 보통 크로스 컴파일러가 필요하다. 수정중.. 더보기 크로스 컴파일러 설치 1. tool chain 설치 apt-get install gcc-arm-linux-gnueabihf 2.크로스 컴파일러 패스 설정 nano /root/.bashrc 3. 크로스 컴파일러 적용 테스트 크로스 컴파일러 패스를 갱신하려면 리눅스를 ..