리눅스에서 application을 사용하면서 인자의 자동완성에 대해 궁금증이 생겼습니다. 예를들면 git의 경우 "git "을 타이핑하고 Tab키를 누르게 되면 아래처럼 입력 가능한 명령어들이 출력이 되는데요, [oops@ ]$ git add cherry-pick fetch log relink stage am ci filter-branch lol remote stash annotate clean format-patch merge repack status apply clone fsck mergetool replace submodule archive commit gc mv request-pull svn bisect config get-tar-commit-id name-rev reset tag blame cr..
기본적으로 linux 터미널은 검은색 바탕에 흰색 글씨인데요, 아래와 같은 방법으로 콘솔에 출력되는 글씨의 색상을 지정할 수 있습니다. 우선 글씨 색상을 해제하는 방법부터 확인을 합니다. $ echo -e "\x1b[0m" 그리고 글씨 색상 지정을 알아봅시다.$ echo -e "\x1b[31mTEST (RED)" 빨강으로 표시된 곳이 글씨 색상을 좌우하는 필드입니다. 색상 종류는 아래와 같이 31~37까지 지원합니다. (해제하지 않으면 계속 설정한 색상으로 출력되기 때문에 꼭 해제하도록 합니다) 글씨색 뿐만아니라 배경 색도 아래처럼 지정할 수 있습니다. 이때는 41~47 까지 색상을 지원합니다. 작은 팁이기는 하지만, print 로 디버그 메시지를 출력할때 강조 할 수 있기 때문에 참 좋습니다 :)ex)..
Application 에서 call trace 를 출력하고, 해당 주소를 코드상에서 찾으려면 애플리케이션 compile시에 gcc 옵션으로 -g 를 사용해야 합니다. 그리고 코드상에 call trace를 출력할 수 있도록 __builtin_return_address() 를 사용합니다. openlog("oops", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1); syslog(LOG_DEBUG,"oops : Signal happened (%d)\n", nSignal); syslog(LOG_DEBUG, "01 - 0x%08x \n", (int)__builtin_return_address(0)); syslog(LOG_DEBUG, "02 - 0x%08x \n", (int)__bu..
리눅스 프로그래밍중 특정 폴더를 감시해야 하는 경우가 있습니다. 해당 기능을 구현하기 위한 방안은 여러가지가 있는데요, 이를테면, 그 폴더의 SIGIO를 등록해서 폴더의 input/output을 감시할 수 있습니다. 하지만 이 경우에는 create / write / close / delete 등을 별도로 구분하지 못하는 부족함이 있습니다. 또한 signal의 경우 중복으로 요청이 들어올 경우 앞선 signal을 잃어버리는 경우도 발생하기 때문에 좋은 방안은 아닌듯 보이죠.. (fcntl 를 이용한 signal 처리에도 create/rename/close 등을 구분할 수는 있네요^^;) 이때 대안이 되는방법이 inotify_add_watch() 라는 함수를 사용하는 것 입니다. 일단 형태는 아래와 같습니다..
http://danguria.tistory.com/171
리눅스는 resolver가 DNS를 풀이하는데, 설정 파일은 [ /etc/resolv.conf ]에 위치하고 있습니다. 간략한 파일 편집을 위한 옵션은 여기를 참고하도록 합니다, DNS는 nameserver option을 사용해서 세팅하게 되는데 형식은 아래와 같습니다. $ cat /etc/resolv.conf nameserver 192.168.0.1 nameserver 192.168.0.2 nameserver 192.168.0.3 하지만 이 설정에도 임계치가 있으니... 앞서 링크에서 설명되어 있지만 MAXNS 값은 현재 3으로 에 선언되어 있습니다. (모든 커널이 꼭 그러한것은 아닙니다) 이 값으로 인해서 [ /etc/resolv.conf ] 에 nameserver option으로 아무리 많은 값을 ..
◆ kmalloc : 연속적인 메모리 공간 사용: 최대 32 * PAGE_SIZE(4096byte) = 32*4096byte = 131,072 byte: 그 이상의 할당을 시도 할 경우 정상적인 예외처리가 지원하지 않는다면 프로그램이 비정상 종료 될 수 있음.: 이는 미리 slab에 지정 되어 있는 사이즈의 최대 cache가 131,072이기 때문, 즉 include/linux/kmalloc_sizes.h의 편집을 통해 값을 조정 할 수도 있다. (커널에서 확인은 cat /proc/slabinfo): 4K가 초과되는 경우 garbage collector가 동작하고 메모리를 더 확보하기 위한 시도가 있다고 하는데 확인 못함: 함수 형태 static inline void *kmalloc(size_t size..
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이 정상적으로 내려오지 않아서 살짝쿵 당황, 여하튼, 이미 있는 함수는 잘 찾아서 사용하도록 합시다 :)
피할수 없는 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..
어찌보면 좀 쌩뚱 맞을 수도 있는 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..
- Total
- Today
- Yesterday