kernel
-
linked list API에 대해서IT/Linux Kernel 2015. 5. 19.
항상 alpha, beta로 개발된 기능은 그 자체로 simple하게 정상 동작하지만, release가 되면 문제가 손쉽게 발생하는 것 같다. 또한 이렇게 발생한 문제점은 특정 조건이라는 전제가 붙기 때문에 원인 분석에 어려움을 겪기 마련이다. 특히 재현이 잘 안되기 때문이다. 그런 의미에서 오늘은 원인을 찾기 위해 힘든 하루를 보냈다. 데이터가 일부 누락되는 상황이 간헐적으로 발생하는 현상이었데, 무엇이 문제였을까. 문제는 linked list 사용방법의 차이점에서부터 시작했다. list_head, list_for_each_safekernel에서 linked list 사용할 때와 list_for 시리즈를 사용할 때랑 조금 차이가 있다. struct list_head{ struct list_head *n..
-
Ubuntu Kenrel BuildIT/Linux Kernel 2013. 2. 26.
linux kernel을 다운받고 코드를 살펴보는 것은 쉽다. 인터넷만 빠르면 바로 받아서 볼수가 있다. 하지만 빌드하고 테스트하는 것은 linux 배포판마다 차이가 있어서 준비가 간단하지 않다. 보통은 커뮤니티에서 확인할 수 있는데 이 글에서는 Ubuntu 환경에서 커널 모듈을 작성하고 빌드 하는 방법을 정리하는 글이다. Ubuntu 커널 컴파일 가이드https://help.ubuntu.com/community/Kernel/Compile 개발 도구 설치 sudo apt-get install fakeroot build-essential crash kexec-tools makedumpfile kernel-wedge sudo apt-get build-dep linux sudo apt-get install g..
-
int type을 bool type으로 활용하는 방안IT/Linux C 2013. 1. 18.
C언에서 !을 사용하게 되면, 0이 아닌 숫자의 경우에 대해서 0으로 변경하고 0인 경우에는 1로 값을 변화시켜준다. !을 한번만 사용하게 되면 자연스럽게 0 or 1의 값을 갖게 되고 !!을 하게 되면 최초 0일 경우에는 0으로 그리고 0이 아닌 값인 경우에는 1로 값이 변환되게 된다. 즉, bool type처럼 0 or 1의 값으로 활용 가능하다. int i = 12345; printf("%d\n", !i); printf("%d\n", !!i); 출력01 위의 내용들이 사실 필요할까 싶지만 다음의 linux kernel에서의 일부 코드를 살펴보면, static int ethtool_get_one_feature(struct net_device *dev, char __user *useraddr, u32 ..
-
kernel macro, container_ofIT/Linux Kernel 2013. 1. 11.
container_of 란?#define container_of(ptr, type, member) ({ \ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) container_of는 커널 매크로로써, 구조체의 멤버변수의 주소값만 알고 있다면 그 구조체 주소를 얻어 올 수 있는 방법입니다. 세가지 인자를 갖습니다.1. 멤버변수의 주소값(ptr)2. 구조체 type(struct)3. 멤버변수 이름(member) 이 세가지 정보를 가지고 구조체에 해당하는 주소를 가져오는데요. 원리는 간단합니다.일단, 해당 멤버변수가 구조체 시작 위치에서 어디에 위치하는지 offset..
-
ubuntu 데스크탑과 서버 커널의 차이점은?IT/Linux Kernel 2013. 1. 8.
서버와 데스크탑의 차이점이란?일반적으로 서버와 데스크탑은 사용 용도가 다르다. 데스탑은 문서작성, 게임, 웹, 그래픽등 다양한 환경과 같이 범용적인 PC 환경을 사용할 수 있음을 의미하지만 서버용은 서비스에 최적화됨을 의미합니다. 백그라운드 프로세스들을 주로 사용하여 서비스와 데이터처리, 네트워크 처리에 최적화되어야 한다. 하드웨어 자원이 일을 많이 하도록 GUI를 사용하지 않는 것도 그 이유이다. Ubuntu에서의 커널 차이점데스크탑에서는 genric이란 키워드를 사용하는 커널을 사용한다. 서버용을 확인하기 위해서 12.10 버전 Ubuntu 서버를 설치해보았다. morenice@ubuntu-morenice:~/linux-3.5.0$ uname -aLinux ubuntu-morenice 3.5.0-17..
-
어떻게 Linux kernel 공부를 시작하죠?IT/Linux Kernel 2013. 1. 1.
linux kernel에 대해서 공부를 시작하게 되었다면, 일단 어려움을 직면한 것이다. 어떻게 공부를 시작할 것인가? 무엇을 토대로 공부를 할 것인가? 등등으로 구글님을 만나서 질문을 하기 시작할 것이다. kernel 자체는 간단한 내용이 아니고 구글님이 말해주는 방대한 자료 때문에 어지럽기 시작할 것이기 때문이다. 일단, 추상화된 개념부터 디테일하게 공부하는 Top-Down 방식을 권장한다. 큰 개념을 이해하지 못한다면 디테일한 정보들에 대한 이해가 떨어지고 어떤 경우에는 코드를 봐도 이해할 수 없는 지경에 이르게 될 것이기 때문이다. 물론 가장 좋은 방법은 멘토를 만드는 것이다.하지만 멘토가 없다면?? 멘토가 없을 수 있다. kernel을 공부하시는 사람을 오프라인에서 만날 수 있는 것은 쉽지 않다..
-
likely, unlikely 함수란?IT/Linux Kernel 2012. 1. 6.
리눅스 커널코드를 보면, likely와 unlikely란 함수를 종종 발견하곤 한다. 컴파일러는 작성된 함수와 코드들에 대해서 최적화 작업을 하여 성능을 향상시킨다. 여기서 갑자기 컴파일러 이야기를 하는 이유는 해당 함수들(정확히 말하자면 매크로이긴 합니다만)은 컴파일러와 관련이 있다. likely와 unlikely는 if 분기문에서 likely를 주면 컴파일러에게 해당 분기문에서 참인 경우가 더 많을 것이라는 정보를 주어 성능을 추가적으로 성능시키는 함수이다. 반대로 if 분기문 안에 unlikely를 주면 거짓인 경우가 더 많을 것이라는 정보를 준다. 실제로 정의된 매크로를 따라가면 __builtin_expect라는 함수가 사용됨을 볼 수 있다. __builtin_expect라는 이름이 좀 더 실제 ..
-
안드로이드 커널 버전과 플랫폼 버전 확인하는 방법IT/Linux Kernel 2011. 12. 27.
안드로이드 코드는 크게 두가지로 나눠진다. 안드로이드 플랫폼 소스코드 안드로이드 커널 소스코드 각각의 소스코드에서 버전을 확인할 수 있다. 첫번째, 안드로이드 플랫폼 버전 확인하기. vi build/core/version_defaults.mk 플랫폼 소스코드를 다운로드 받았다면, 해당 버전파일을 통하여 이 코드의 플랫폼 버전을 확인할 수 있다. 플랫폼 버전이란 4.0(아이스크림) 이런걸 의미한다. 두번째, 안드로이드 커널 버전 확인하기 vi kernel/Makefile VERSION = 3 PATCHLEVEL = 0 SUBLEVEL = 8 EXTRAVERSION = NAME = Sneaky Weasel 커널 소스코드를 다운로드 받았다면, 해당 파일에서 정보를 확인할 수 있다. 내가 받은 안드로이드 커널 ..