Linux
-
디바이스 드라이버 / 모듈 파일들의 정체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. 크로스 컴파일러 적용 테스트 크로스 컴파일러 패스를 갱신하려면 리눅스를 ..
-
디바이스 드라이버 / 헤더 파일별 함수 정의Linux/Linux Device Driver 2020. 8. 30. 00:00
유저 #include int open(const char *__file, int __oflag, ...) #include : /usr/include/unistd.h __off_t lseek(int __fd, __off_t __offset, int __whence) int close(int __fd) ssize_t read(int __fd, void *buf, size_t __nbytes) ssize_t write(int __fd, const void *__buf, size_t __n) unsigned int sleep(unsigned int __seconds) int usleep(__useconds_t __useconds) #include : /usr/include/arm-linux-gnueabihf/s..
-
디바이스 드라이버 / 알게 된 것들Linux/Linux Device Driver 2020. 8. 28. 23:59
register_chrdev() 함수의 주번호를 0으로 설정하면 알아서 남는 주 번호로 설정해 준다. 1. 파일 오퍼레이션 open 함수의 리턴값은 무조건 0으로 해줘야 된다. 그렇지 않으면 응용프로그램에서 파일이 열리지 않는다. 파일 오퍼레이션 함수에서 하드웨어 존재하지 않거나 커널 메모리가 부족하거나 디바이스가 이미 사용 중인지를 확인하는 코드를 두어 유저영역에서 open함수의 반환값으로 무슨 문제로 디바이스 파일이 열리지 않았는지 확인 할 수 있다. 2. 파일 디스크립터의 close 함수는 어떤 리턴 값을 사용해도 0으로 리턴된다. 응용 프로그램은 close() 함수의 반환값을 참고하지 않기 때문에 실제 사용에는 의미가 없다. 3. 커널에서 문자열 데이터를 읽을 때 응용 프로그램에서 read 함수의..
-
디바이스 드라이버 / 드라이버를 잘 만드려면Linux/Linux Device Driver 2020. 8. 24. 13:40
커널 소스 탐색 디바이스 드라이버를 작성하거나 이미 작성된 디바이스 드라이버를 연구할 경우, 사용중인 함수가 어떻게 구현되는지를 검토하거나 관련 데이터를 찾으려면 반드시 커널 소스를 탐색해야 한다. 처음 리눅스 커널 소스를 접하는 사람은 방대한 크기의 소스 트리 때문에 원하는 대로 검색하기가 쉽지 않다. https://elixir.bootlin.com/linux/latest/source Linux source code (v5.8.3) - Bootlin elixir.bootlin.com 커널 소스를 찾으려면 이 사이트를 참조하는 것이 좋다. 리눅스 커널 버전 별로 모든 소스가 다 있다. 내가 찾고 싶은 함수를 검색하면 어디서 정의되었는지 어디서 참조되었는지 다 나온다. 내 버전에 맞는 커널 소스를 뒤져보자..
-
MakefileLinux/Linux Device Driver 2020. 8. 24. 12:55
밑의 사이트에 들어가서 궁금한 키워드를 control + F로 검색해서 작성하자. 영문판 http://www.gnu.org/software/make/manual/ GNU Make Manual - GNU Project - Free Software Foundation GNU Make Manual Free Software Foundation last updated January 19, 2020 This manual (make) is available in the following formats: You can buy printed copies of some manuals (among other items) from the Free Software Foundation; this helps support FSF ..