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/..
임베디드 개발자라면 메모리는 곧 돈입니다. 그러므로 가능한 코드에서 메모리를 효율 적으로 사용하고 가능한 최적화된 코드를 작성해야 합니다. (물론 가독성이 현저히 떨어진다면 고려해 보아야겠지만..) 여기 비용 선택에 따른 연산자 분류가 있습니다. 첫번째로 흔히 나머지를 구할때 사용하는 % 연산자. 그리고 몫을 구하는 / 연산자. 예를 들어 아래와 같은 코드가 있다고 보면 x %= 10 이는 역어셈 결과 mov, cdq, mov, idiv, mov 다섯 과정을 거칩니다. 반면 아래의 코드는 같은 결과를 얻지만, mov, and, mov 세가지 과정으로 결과를 산출합니다. x &= 10 그럼 몫을 구하는 연산자를 살펴봅시다. x /= 10 위와 같은 코드는 나머지를 구하는 연산 보다 더 많은 연산을 합니다...
이름 그대로 pages를 Mbyte 단위로 return 하는 함수입니다. 일단 무식하게 산술 연산을 통해 pages를 Mbyte로 나타내봅시다, 예를 들어 pages가 4096이라 하면, 1 PAGE의 사이즈인 4096에 4096(bytes)를 곱하게 되면 byte 단위의 결과가 나오게 됩니다, 이를 Mbyte로 나타내려면, 결과에 /1024, /1024 두번을 통해 byte --> Kbyte --> Mbyte 연산을 해야될텐데 수식으로 나타내면 아래와 같습니다. (4096 * 4096)/1024/1024 = 16 MB 뭔가 연산이 많은데요, 그렇다면 오늘 알아보는 pages_to_mb는 내부적으로 어떤 동작을 보일까요? 함수 내용은 아래와 같습니다. static inline unsigned long p..
for_each_possible_cpu() 는 CPU(NR_CPUS)의 갯수만큼 루프를 도는 커널 매크로. (kernel 2.6 기준) #define for_each_possible_cpu(cpu) for_each_cpu_mask((cpu), cpu_possible_map) NR_CPUS는 Command-line option으로 제어가 가능하니 참고하도록 합시다. for_each_cpu_mask 내부는 아래와 같습니다. #if NR_CPUS > 1 #define for_each_cpu_mask(cpu, mask) \ for ((cpu) = first_cpu(mask); \ (cpu) < NR_CPUS; \ (cpu) = next_cpu((cpu), (mask))) #else /* NR_CPUS == 1 ..
dmesg는 커널에서 출력되는 메시지를 일정 수준 기록하는 버퍼입니다. 오늘은 이놈에 대해 조금 공부해봅시다, 특별한 기능 없어도, 아는것이 힘이니까. man page를 보면 아래와 같이 상당히 간략합니다. NAME dmesg - print or control the kernel ring buffer SYNOPSIS dmesg [ -c ] [ -n level ] [ -s bufsize ] DESCRIPTION dmesg is used to examine or control the kernel ring buffer. The program helps users to print out their bootup messages. Instead of copying the messages by hand, the us..
연속적이지 않은 메모리 공간을 사용할 수 있고, 물리 메모리의 크기와 관계없이 큰 주소 공간을 제공 받는 가상 메모리, vmalloc은 메모리의 어떤 영역을 차지하는지에 대한 궁금증이 생겼습니다. 우선 x86 System의 메모리 공간은 아래와 같이 나뉩니다 (절대적인 것은 아닙니다) ZONE_DMA 0~16M ZONE_NORMAL 16~896M ZONE_HIGHMEM 896 ~ end ZONE_NORMAL 영역이 896M까지인 이유는 vmalloc이 default 로 128M (상위 메모리 페이지 프레임을 매핑하기 위한 전용) 잡고 있기 때문, vmalloc을 kbyte단위로 너무 작게 설정할 경우 application영역의 메모리 size가 상대적으로 줄어 정상적인 kernel 부팅이 되지 않을수 있..
의미 : 백과사전 ================================================================ 원격 프로시저 호출(Remote procedure call, RPC)은 컴퓨터 프로그램이 다른 주소 공간에서 원격 제어를 위한 프로그래머의 세세한 코딩 없이 함수나 프로시저의 실행을 허용하는 기술이다. 다시 말해, 프로그래머는 함수가 실행 프로그램에 로컬 위치에 있든 원격 위치에 있든 간에 반드시 동일한 코드를 짜게 된다. 어떠한 소프트웨어가 객체 지향의 원칙을 사용하여 프로그래밍 때, RPC는 원격 호출(remote invocation) 또는 원격 메소드 호출(remote method invocation)이라고 일컫는다. 가끔 ONC RPC와 DCE/RPC와 같은 비호환..
kernel 코딩을 하다보면 특정 process를 재워야(?)할 때가 반드시 있습니다. 반대로 재워 놓은 process를 깨워야 할 시점이 있을텐데, 이와 관련된 함수가 바로 sleep_on()과 wake_up() 입니다. 함수 형태를 살펴보면 아래와 같습니다. sleep_on void sleep_on(wait_queue_head_t *q) { wait_queue_t wait; init_waitqueue_entry(&wait, current); current->state = TASK_UNINTERRUPTIBLE; add_wait_queue(wq, &wait); /* wq는 대기 큐 머리를 가리킴 */ schedule(); remove_wait_queue(wq, &wait); } wake_up void w..
ssl 을 사용하는 Web Daemon, 요녀석에 대한 재미난 사실을 포스팅합니다. lighttpd Daemon이 사용하는 config file 를 살펴보면, 사용 가능한 cipher-list 부분이 있는데, 이를 살펴보면 아래와 같습니다, ( lighttpd version에 따라 다를 수 있습니다.) ssl.cipher-list = "DES-CBC3-SHA AES256-SHA" cipher-list는 lighttpd Daemon이 설치되어 있는 site에 Web 접속 시에 사용되는 cipher인데, 이것은 explorer version에 따라 유동적입니다. cipher-list를 없애거나, explorer에서 지원하지 않는 cipher로 설정할 경우 Web 접속이 되지 않는것을 확인 할 수 있습니다. ..
crontab 을 사용하여 특정 시간에 특정 명령어를 수행하도록 도와주는 Daemon 파일을 열어서 보면 위와 같은 형태이다, 탭이나 공백을 기준으로 총 6개의 필드가 존재하고, "분 | 시간 | 일 | 월 | 요일(0-6 0과7은 일요일, 1부터 월요일) | 명령" 형식으로 지정할 수 있습니다. */2 * * * * 명령 : 2분마다 명령을 실행한다는 의미 0 22 1-15 * * 명령 : 매월 1일부터 15일 동안 22시에 명령을 실행한다는 의미 0 22 */5 * * 명령 : 매월 5일 간격으로 실행한다는 의미 설정을 했다면 service restart를 실행하고 process number가 바뀌는것을 확인합니다. vim 등을 이용하지 않고 crontab -e 옵션으로 수정하게 되면 굳이 재시작 할..
일반적인 프로그램의 표준출력은 현재 자신의 sh에 해당됩니다, sh은 리눅스 프로그램에 로그인 할때마다 새로운 PID를 갖고 시작되기 때문에, 현재의 sh이 아닌 곳에서 실행되는 결과는 출력이 되지 않습니다. 예를 들어, 아래와 같이 ping을 background 로 동작 시켰다고 보면, $ ping 168.126.63.1 &이 상태에서 계정을 로그아웃 하고 다시 콘솔에 접속하게 되면 ping에 대한 출력은 더 이상 보이지 않게 됩니다. 위에서 언급한대로 새로운 PID를 갖는 sh로 접속이 되었고 ping의 출력은 이전 PID의 sh에 출력을 하고 있기 때문인데요. 다른 예를 살펴봅시다. process내에서 실행되는 system 함수는 새로운 sh에 출력을 합니다. 무슨말인고 하니, 특정 프로그램에서 s..
shell(#mode)에서 간단하게 명령어를 통해 테스트를 진행하면서 "/dev/null 2>&1"의 의미를 알아봅니다.아래 명령어는 표준 출력을 /dev/null로 redirection 하라는 의미로 표준출력을 버리라는 의미입니다. $ rm test > /dev/null 하지만, test라는 file이 존재하지 않는 경우 아래와 같은 표준에러가 출력됩니다. $ rm test > /dev/null rm: cannot remove 'test': No such file or directory 방금 언급했지만, 이것은 "표준출력"이 아닌 "표준에러"이기 때문에 화면에 출력이 된것입니다. 다시 강조하면 위에 예제는 /dev/null 로 redirection 을 통해 화면 출력을 하지 않는것은 표준출력에 한해서 ..
시스템 운영 중에 메모리 할당이 실패하면 kernel은 OOM killer에서 다른 process를 죽여 메모리를 확보합니다. 이때 아무 process나 종료시키는것이 아니라 각 process마다 점수를 매겨 가장 적합한(?) process를 죽이게 되는데 이 점수를 매기는것은 아래와 같습니다, (mm/oom_kill.c) /** * badness - calculate a numeric value for how bad this task has been * @p: task struct of which task we should calculate * @uptime: current uptime in seconds * * The formula used is relatively simple and document..
pid의 사전적 의미는 프로세스 인식자(Process identifier)로서 프로세스가 실행 될 때에 붙여지는 번호인데요, 그렇다면 이 pid의 최대값은 어떻게 결정될까요? 우선 kernel source를 살펴보면, kernel code 내부에 아래와 같이 pid_max값을 proc으로 남기도록 명시되어 있습니다. (linux kernel 2.6.20 version) .ctl_name = KERN_PIDMAX, .procname = "pid_max", .data = &pid_max, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = sysctl_intvec, .extra1 = &pid_max_m..
[kthreadd] : 커널 스레드를 생성한다, 모든 커널 스레드의 부모가 된다. [migration/0] : 프로세서 사이에서 프로세스들을 이주시켜주는 CPU에 각각 존재하는 커널 스레드 [ksoftirqd/0] : tasklet(소작업)을 실행한다. –(softirq, tasklet) [watchdog/0] : 하드웨어 watchdog뿐만아니라 소프트웨어 watchdog도 포함한다. 시스템이 비정상적으로 동작시, 끄고 재부팅한다. [events/0] : (keventd) : keventd_wq 작업 큐(workqueue)에 있는 함수들을 수행. –(워크큐) [khelper] : 커널의 일부.. [kblockd/0] : kblockd_workqueue 작업 큐에 있는 함수를 수행한다.–(워크큐) 블록 ..
리눅스의 메모리 메커니즘은 application에서 메모리를 사용하고 반환할 때에 바로 소진되지 않고, cache되어 있다, 그리고 cache를 재사용하는것이 리눅스의 기본적인 동작인데, 강제로 cache를 비우는 방법을 알아봅니다. 우선 cache는 /proc/sys/vm/drop_caches 경로에 있고, 이 경로에 1~3의 값 입력을 통해 cache가 비워지게 됩니다. 그렇다면 각 number에 대한 의미를 알아봅니다. 1 : To free pagecache 2: To free dentries and inodes 3: To free pagecache, dentries and inodes This is a non-destructive operation and will only free things t..
회선 대역폭을 측정하기 위한 툴로 다양햔 open-source가 존재합니다. 이번 포스팅은 그 중 가장 강력한(?) 툴인 iperf를 설명하고자 합니다 (굉장히 주관적인 생각). 우선 source는 여기에서 다운 받고 compile은 README에 있는 내용처럼, ./configure -- configure for your machine make -- compile Iperf 두가지만 해주면 됩니다. 간단하지 않은가요? compile 이 완료되었으면 회선 대역폭을 측정하고자 하는 장비(혹은PC)에 compile의 결과물인 iperf를 넣어주기만 하면 준비는 끝입니다. 이제 옵션을 알아 볼텐데, document 보다 더한 설명이 어디있을까요, 우선 document 를 참조합니다, 자세하게 옵션에 대해 설명..
보통 구조체의 사이즈라 하면 구조체 내에 선언되어 있는 모든 변수의 총합을 TOTAL로 여깁니다. 얼핏 보면 당연한 결과지만, 컴파일러는 그렇게 못합니다. 이는 컴파일러 내에서 구조체 관련 루틴을 수행할 때에 좀 더 빠른 연산을 위함인데, 그렇다면 어떻게 다른지 알아봅니다.#include typedef struct test{ int a; long c; char b; char d:1, e:1, f:1, g:2, i:1, k:1; long h; } test; int main(void) { test k; k.g=1; // printf("a:%d \n",k.g); printf("size : %d\n",sizeof(k)); return 0; } 간단한 코드입니다, test struct의 사이즈는 얼마일까요? 64..
pthread_cond_wait는 thread를 휴먼 상태로 만듭니다(해당 라인에서 thread의 동작이 멈추는 상태). 이 말은, 일종의 sleep 상태라고 생각해도 되는데, 휴먼 상태에 빠져 있는 이 thread는 다른 thread에서 pthread_cond_signal을 이용해서 깨웁니다 (깨워지게 되면, 그때 부터 pthread_cond_wait 의 다음 라인 코드가 실행됩니다). 그렇다면 다수의 pthread_cond_wait가 존재한다면, pthread_cond_signal은 어떤 pthread_cond_wait를 깨울까요? 답은 아래 있습니다. 일단 함수 생김새를 살펴보면 아래와 같고, int pthread_cond_signal(pthread_cond_t *cond); int pthread_..
- Total
- Today
- Yesterday