UTC : 원자시에 평균태양시를 가미한 협정세계시. 일기도에서 United time code의 약자라고 표현하는데, 정확한 표현은 Universal Time Coordinated. UTC(협정시계시) 에 timezone(Korea:KST-9 혹은 GMT+09:00)이 합산되면 각국의 시각이 도출 됩니다. 간단하게 언급하면 UTC는 현재 우리가 살고 있는 시각에서 9시간을 빼면 됩니다 (대한민국 기준), 그리고 보통 운영체제의 하드웨어 Clock (bios)은 UTC에 맞춰 있으므로 참고 하고 혼동하지 않도록 합니다. Linux의 경우 date 명령어를 통해 timezone이 반영된 시각을 알 수 있고, $ date Mon Mar 12 16:38:38 PDT 2012 hwclock 명령어를 통해 하드웨어 ..
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 64bit kernel 에서 32bit application이 내리는 ioctl을 처리하기 위한 함수, ioctl과 다르게 inode를 매개로 갖지 않고, 함수의 return 타입이 long 입니다. 커널 버전 2.6.11 부터 존재 했던 함수라는데.. 이제서야 알았네요.. 64bit kernel 빌드하면서 (생각지도 않게) ioctl이 정상적으로 내려오지 않아서 살짝쿵 당황, 여하튼, 이미 있는 함수는 잘 찾아서 사용하도록 합시다 :)
좋은 정보 :) 바로가기
#1 [교육 1일차] 전부터 한번은 듣고 싶었던 splunk 강의, (미리 밝히지만, 엄청난 기술에 대한 기대감 때문이 아닌.. 단지 호기심 때문에.. ^^; ) 근래에 mos쪽 splunk 직원분께서 회사에 방문해서 세미나를 갖은 적이 있었습니다. 일종의 협력 관계를 맺기 위한(?)...세미나였을려나.. (사실 아직 까지는 회사에서 splunk를 위한 라이센스를 구입할 의사는 전혀 없어 보입니다. -물론 개인적인 생각) 대용량으로 쏟아지는 로그 데이터 처리를 위한 기술로 알려진 splunk, 모든 로우 데이터(meta Data)에서 정확하게 필요한 정보를 뽑아내서 출력하는데 출력 또한 사용자 편의에 맞게 다양한 그래프와 차트 지원. (로우 데이터 포함) 그렇지만 이런 기술이 궁금해서 강의에 참여한것은 ..
기본 문법 익히기 !! 바로가기
make : 바로가기 ld : 바로가기
피할수 없는 if 문의 분기라면, 하지만 그 결과가 항상(거의) 참 혹은 거짓이라면..? 이때 사용할 수 있는게 likely, unlikely 명령어 입니다. 아래와 같이 내부적으로 gcc의 builtin 함수로 define되어 있습니다. #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) 사용 예를 보면, void* p = malloc(128); if (p==NULL) here(); 보통 위와 같은 코딩을 하지만, 사실 p가 NULL인 경우는 극히 드문데요, 이러한 경우 cpu에게 p가 대부분 false일 것이라고 알려주는 unlikely로 대체할 수 있는데 아래와 같습니다. void* p ..
보통 리눅스에서 "현재 free가 몇이야?" 라는 질문에서 free는, 실제 사용 가능한 메모리의 의미를 내포합니다. 하지만, 위와 같이 free command로 확인하는 free 필드는 buffers와 cached를 사용중(used)인 메모리로 간주하고 계산됩니다. (즉 used에 buffers와 cached가 포함되어 있고 free 필드에는 buffers와 cached가 포함되지 않았다는 의미) 커널 내부적으로 buffers나 cached는 메모리가 부족한 경우 언제든지 free되어 가용 될 수 있지만, 사용자 관점에서는 그저 어딘가(두리뭉실)에서 붙잡고 있는 메모리로 여겨지기 때문에 사용중인 영역으로 표현한것이 아닐까요? (엄밀히 말하자면 아직 storage와의 sync가 되지 않은 메모리라고..)..
아직 gdb가 강력한 디버깅 툴이라는 생각은 들지 않습니다 (딱히 사용할 일이 없다, 사실 제품에 gdb를 탑재 시키지 않기 때문에) 그렇지만 종종 유용하다거나, 기억하고 싶은 명령어를 나열하도록 합니다. 1) list 명령어 : 변수나 함수 근처 +-5 line씩 총 10 line 출력 (엔터 입력 시에 그 다음 10라인을 출력) (gdb) list debug_kernel 293 294 EXPORT_SYMBOL(loops_per_jiffy); 295 296 static int __init debug_kernel(char *str) 297 { 298 if (*str) 299 return 0; 300 console_loglevel = 10; 301 return 1; 302 } (gdb) 2) print 명..
kernel thread는 프로세스로서 프로세스와 마찬가지로 프로세스 ID(pid)가 할당되며 자신만의 실행 컨텍스트를 가집니다. thread의 특징은 오직 커널 공간에서만 존재(커널 코드를 자유롭게 부를 수 있다는 장점을 의미)하고 주소 공간을 가지지 않으며 다른 Kernel Thread에 의해서만 생성 가능하다는 점 입니다. 또한 프로세스 이므로 사용자 프로세스와 마찬가지로 시스템 콜을 부를 수가 있습니다. 즉 Kernel Thread는 커널 영역과 시스템 콜에 자유롭게 접근할 수 있는 커널 모드에서 동작하는 프로세스인 것입니다. 이러한 thread를 생성하는 루틴을 알아보도록 합니다. 우선 Kernel thread를 만들 때 이용되는 함수 원형은 아래와 같습니다. int kernel_thread (..
비트 연산 관련해서 참고하면 좋은 사이트 (여기)
구조체의 offset을 구할때 유용한 매크로. 일단 man page를 살펴봅시다. OFFSETOF(3) Linux Programmer’s Manual OFFSETOF(3) NAME offsetof - offset of a structure member SYNOPSIS #include size_t offsetof(type, member); DESCRIPTION The macro offsetof() returns the offset of the field member from the start of the structure type. This macro is useful because the sizes of the fields that compose a structure can vary across impl..
아... 일주일째다..iptables에서 참조하는 이녀석의 size를 결정하는 곳이 도무지 어딘지 알 수가 없다. iptables compile시에 mips 환경의 경우에 40bye가 출력되는데, 이는 분명 8bytes Align되는것이다. 절대 다른 struct를 참조해서 나오는 결과가 아니다, 그런데 왜 ? 내가 작성한 main 파일에 동일한 struct(이름만 다른)는 36bytes가 출력되는지................. (일단, 실제 ipt_get_entries가 선언되어 있는곳에 동일하게 유사 struct를 생성하면 그 struct도 동일한 size가 나온다. 그렇다는 것은 특정 .c 파일에 선언되어 있는 struct를 8bytes로 Align한다는 얘기인데....) 실제로 iptables에..
링크 좋은 자료에 감사합니다.
gcc의 기능으로 주어진 형식이나 lvalue의 정렬을 위해 필요한 byte 수를 알려줍니다. 이를테면 아래와 같은 코드를 통해서 구조체가 몇 byte로 align되어 있는지 확인 할 수 있습니다. printf(" align : %u \n",__alignof__(struct test)); 32bit Kernel의 경우 기본 4byte, 64bit Kernel의 경우 8byte align되었을을 확인하도록 합니다. 또한 유사한 명령으로 구조체의 align을 변경할 수 도 있습니다. 아래 코드를 참조하도록 합시다. struct compat_group_req { __u32 gr_interface; struct __kernel_sockaddr_storage gr_group __attribute__ ((align..
ip6tables롸 64bit kernel 호환성을 맞추며 공부하다 보니 이렇게 포스팅을 하게 되었습니다. ip6tables에서 사용되는 getsockopt와 setsockopt는 kerenl 내에 nf_sockopt_ops 구조체로 받아지는데, 구조체 형태는 아래와 같습니다. (linux-3.0.4 기준) static struct nf_sockopt_ops ip6t_sockopts = { .pf = PF_INET6, .set_optmin = IP6T_BASE_CTL, .set_optmax = IP6T_SO_SET_MAX+1, .set = do_ip6t_set_ctl, #ifdef CONFIG_COMPAT .compat_set = compat_do_ip6t_set_ctl, #endif .get_optmi..
inet_aton() 인터넷 주소를 네트워크 주소로 변경 mysql> select inet_aton('192.168.0.1'); +-----------------------------------+ | inet_aton('192.168.0.1') | +-----------------------------------+ | 3232235521 | +-----------------------------------+ 1 row in set (0.00 sec) inet_ntoa() 네트워크 주소를 인터넷 주소로 변경 mysql> select inet_ntoa('3232235521'); +-----------------------------------+ | inet_ntoa('3232235521') | +------..
어찌보면 좀 쌩뚱 맞을 수도 있는 64bit로 compile된 kernel과 32bit로 compile된 iptables 조합입니다. 일단 iptables쪽에는 기본적인 명령이나 동작에는 지장이 없는데, 문제는 바로 ip6tables 요놈입니다. 문제는 ip6tables --list 명령에서부터 시작되었습니다. $ ip6tables -nL ip6tc_init: valiget_entries: 1980 != 1984 d_hooks=0x0000000e, num_entries=4, size=1944 modprobe: cannot parse modules.dep ip6tables v1.3.7: can't initialize ip6tables table `filter': Invalid argument Perhaps..
find 명령 하나만 잘 사용해도 원하는 코드 원하는 위치를 찾을 수 있음은 누구나 아는 사실입니다. 임베디드 개발자라면 자신만의 alias는 갖고 있을텐데, (bashrc) 제 경우에는 아래와 같이 사용합니다. 기본적으로 c의 경우에 finds를 정의해 놓습니다. $ alias finds='find . -name "*.[cChH]" -print | xargs grep -n --color=auto ' 이렇게 사용할 경우 .c와 .h를 모두 뒤져서 auto color로 결과가 출력되어 원하는 문자열 검색에 용이합니다. 출력결과 $ finds debug_locks ./lib/debug_locks.c:2: * lib/debug_locks.c ./lib/debug_locks.c:15:#include ./lib/..
- Total
- Today
- Yesterday