이름 그대로 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 부팅이 되지 않을수 있..
리눅스 커널 내부구조저자백승재, 최종무 지음출판사교학사 | 2008-09-20 출간카테고리컴퓨터/IT책소개이 책은 리눅스를 모르는 사람도 재미있게 읽을 수 있으며, 실습... 사수가 구매한 책으로 우연히 보게 된, "리눅스 커널 내부구조" 평소에 "리눅스 커널의 이해" 책만 보다가 두통이 사라지질 않았는데, 꽤 쉽게 풀이된 책입니다. (사실 그래도 제겐 좀 어렵네요;) 쉽게 접근하면 쉽게 알 수 있는 부분에 대해서 기본기를 다지기 좋고, 조금 더 커널과 친해질 수 있는 계기가 되길 바라며 ~ 추천합니다^^
ABS [anti-lock brake system] 요약 : 자동차가 급제동할 때 바퀴가 잠기는 현상을 방지하기 위해 개발된 특수 브레이크. 아직 Review도 올리지 않은 차에 ABS 점등이 꺼질 기미가 보이지 않는다, 오작동인지.. 아니면 정말 문제가 있는것인지.. 빨리 A/S 맡겨야지... Review는 그 다음에.. (검색을 해보니 나와 동일한 증상을 겪는 분들이 좀 있는듯 해서, A/S 맡길때 좀 말이 통할듯 싶다, 불행중 다행인가..)
기본적으로 mysql 유저 관리 Table은 "mysql" database에 user에서 관리됩니다. 자 그럼 일단 패스워드 변경을 위해 mysqld 데몬은 잠시 죽여(?)두고 mysql 을 접속합니다. 그리고 mysql DB를 선택하도록 합시다. mysql> use mysql; DB를 선택했으면 user Table을 잠깐 살펴봅니다 (뭐 대충 어떻게 생겼는지는 알아야 수정해도 개운할테니까) mysql> select user,password from user; 다른 필드는 지금 중요한것이 아니니, 당장 필요한것만 확인하도록 하고, 이제 변경할 user name을 확인했다면 변경하도록 합니다. (공백 입력은 no password 상태로 만듬) mysql> update user set password=pas..
max select max(column_name) as max from tables_name min select min(column_name) as min from tables_name sum select sum(column_name) as sum from tables_name avg select avg(column_name) as avg from tables_name as 구문이 없는 경우 결과를 나타내는 Column name은 default로 입력 받은 내용이 들어갑니다. 대략 아래와 같이.. +-------------------------+ | max(column_name) | +-------------------------+ | 4815716 | +-------------------------+ ..
의미 : 백과사전 ================================================================ 원격 프로시저 호출(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 접속이 되지 않는것을 확인 할 수 있습니다. ..
hash_hmac을 이용한 암호화, hash의 성격대로 복호화는 사실상 불가능입니다. 함수 설명을 간단히 살펴보면 "Generate a keyed hash value using the HMAC method" 자, 예를 들어봅시다. test라는 FILE에는 "1"만 기록되어 있고 이 파일을 hash_hmac_file()하면 87a7fa188c5f20be866a6de2eaba1ce71a6cf50 요런 값을 얻을 수 있습니다, 그렇다면 test라는 FILE에 2를 기록하고 hash_hmac_file()하게 되면? 26ae63ad577ee2071c66b09aab72f9247e76c743 전혀 다른 결과를 얻게 됩니다, hash_hmac_file()은 파일의 무결성을 검증하는데 사용되고.... 특정 문자열은 hm..
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 을 통해 화면 출력을 하지 않는것은 표준출력에 한해서 ..
Bandwidth 측정 tool인 iperf compile시에 아래와 같은 오류를 만날 때가 있습니다, 사실.. 포스팅 할 내용도 아니지만.. 혹시라도 검색의 힘을 빌리는 개발자가 있다면.. 약간의 도움이라도 주고자 포스팅...! 오류 내용은 아래와 같습니다. [root@app32 iperf-2.0.4]$ make make all-recursive make[1]: Entering directory `/root/app/iperf/iperf-2.0.4' Making all in compat make[2]: Entering directory `/root/app/iperf/iperf-2.0.4/compat' make[2]: `all'를 위해 할 일이 없습니다 make[2]: Leaving directory `/..
시스템 운영 중에 메모리 할당이 실패하면 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..
- Total
- Today
- Yesterday