Table of Content 1. Intro 2. 쉬운 API 3. 어려운 API 4. 어려운 API 와 쉬운 API? 5. CPU 소모성 API 6. CPU 소모가 없는 API 7. msleep() 8. msleep_interruptible() 9. ssleep() 10. schedule_timeout_interrupt() 11. schedule_timeout_uninterrupt() 12. schedule_timeout() 13. ndelay(), udelay(), mdelay() 1. Intro 커널에서 시간 지연 함수는 여러가지가 있습니다. 굳이 분류를 하자면 쉬운 API, 어려운 API, CPU 소모성 API, CPU 소모가 없는 API 정도로 나눌 수 있습니다. 2. 쉬운 API 쉬운 API..
쉘 스크립트를 만들때, 가장 첫 라인에 #!/bin/bash 를 왜 써야 하는지에 대하여 알아 보도록 하겠습니다. 쉘 스크립트의 가장 첫 라인에 !/bain/bash 를 쓰게 됨으로 해서, 내가 사용 하려는 명령어 해석기가 bash 쉘 임을 미리 알려주는 것입니다. 일반적으로 스크립트에서 #는 주석기호이지만, 첫라인의 #!/bin/bash 에서의 #은 주석기호가 아닙니다. 스크립트의 가장 첫라인에 있는 #! 은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에게 알려주는 역할을 합니다. #! 은 두 바이트의 "매직넘버"("magic number")로서, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한 표시자입니다. #! 바로 뒤에 나오는 것은 경로명으로, 스크립트에 들어..
디바이스 드라이버 작업을 하다 보면 자주 보게 되는 매크로중으 히나가바로 container_of 매크로 입니다.이해가 가는 것 같기도 하고 아니것 같기도 하고 묻는 사람도 있고 해서오늘은 이 매크로에 대해서 한번 알아 볼가 합니다. 일단 함수 원형을 한번 볼까요? lxr 사이트에서 긁어 왔습니다.위치는 include/linux/kernel.h 입니다. 650#define container_of(ptr, type, member) ({ \ 651 const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 652 (type *)( (char *)__mptr - offsetof(type,member) );}) 이건 뭐 상당히 거시기 하군요.뜯기 전에 좀 쉬운 예를 들어 보..
모듈과 커널 버전 모듈은 커널 버전과 관련이 많습니다. 커널 버전에 맞춰서 모듈이 빌드되며, 커널의 버전과 모듈의 버전이 일치해야만 이용할 수 있습니다. 커널 소스에서 커널의 버전은 include /linux/version.h에서 확인할 수 있습니다. #define UTS_RELEASE "2.6.14.6" #define LINUX_VERSION_CODE 132622 #define KERNEL_VERSION(a,b,c) (((a) 종류설명EXPORT_SYMBOL(var)심볼을 공개합니다.EXPORT_SYMBOL_NOVERS(var)심볼을 버전정보 없이 공개합니다.EXPORT_SYMBOL_GPL(var)EXPORT_SYMBOL과 동일 하지만 GPL과 호환되는 라이선스로 등록한 모듈에서만 심볼을 볼 수 있습니..