구조체의 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/..
php 는 "Array To String"이나, "String To Array" 가 지원됩니다, implode가 그 전자이고, explode가 후자. 일단 형식은 implode ( string glue, array pieces) glue를 구분자로 배열 pieces를 string으로 만듭니다. ""와 같은 형태로 구분자 없이 string으로 만들수도 있습니다. 아래는 간단한 예제 explode의 형식은 explode ( string separator, string string [, int limit] ) 위와 같은 형태가 되겠습니다. 아래는 간단한 예제
array_fill ( int start_index, int num, mixed value ) start_index 부터 num 까지의 값을 value로 채웁니다. 배열 초기화를 위해 c언어의 memset 같은 함수를 찾다가 발견, 나름 유용할때가 있습니다, 이를테면, size 200인 배열에 특정 index만큼만 값을 세팅해야 하는 경우가 있는데, 나머지는 default로 채워야 한다거나, 특정 값으로 채워야 할때 불필요하게 for문이라든지 반복문을 통해 값을 채워야 하는 .. 그런 비생산적인 코드를 막을 수 있습니다.
임베디드 개발자라면 메모리는 곧 돈입니다. 그러므로 가능한 코드에서 메모리를 효율 적으로 사용하고 가능한 최적화된 코드를 작성해야 합니다. (물론 가독성이 현저히 떨어진다면 고려해 보아야겠지만..) 여기 비용 선택에 따른 연산자 분류가 있습니다. 첫번째로 흔히 나머지를 구할때 사용하는 % 연산자. 그리고 몫을 구하는 / 연산자. 예를 들어 아래와 같은 코드가 있다고 보면 x %= 10 이는 역어셈 결과 mov, cdq, mov, idiv, mov 다섯 과정을 거칩니다. 반면 아래의 코드는 같은 결과를 얻지만, mov, and, mov 세가지 과정으로 결과를 산출합니다. x &= 10 그럼 몫을 구하는 연산자를 살펴봅시다. x /= 10 위와 같은 코드는 나머지를 구하는 연산 보다 더 많은 연산을 합니다...
코드가 방대해지기 시작하면, 배열이 커지기 마련이고, 특히나 php의 경우 사기언어(?) 이므로... 최초 의도했던 용도와는 다르게 배열의 차수가 달라지기도 합니다. 이를테면 1차원 배열로 사용을 하는게 목적이었으나... 급히 2차원 배열로 변경한다든가.. (이는 목적에 따라 최초1차원 배열로 사용을 하였지만, 요구사항에 따라 2차원 배열로 행해지는 경우) 그렇게 되면 나중에 특정 배열 변수를 놓고 값을 체크하는게 난감한 경우가 있습니다. 보통의 1차원 배열이나, 그 이상의 배열의 경우 목적이 분명하고 차원이 분명하다면, for문 돌려서 echo로 충분히 배열 내용을 알수 있다. 하지만 배열의 키(index)값이 default(0부터 증가하는 숫자)가 아니라면, 정확히 그 배열에 어떤 키와 값이 있는지 ..
간단한 php Warning, 우선 코드상에 아래와 같은 구문을 찾아냅니다, $a = 5; $a[0] = 3 당연히 말도 안되게 쉬운 예로 들었지만, 코드가 길어지고 변수를 global 하게 사용하다 보면 종종 발생하는 실수입니다. (어쩌면 php 이기 때문에 발생하는 버그라는 생각도 듭니다, 왜냐하면 php는 왠지 모르게 뭐든 될것같은 .. 그런 느낌이 강해서일까..) scalar 와 array를 정확하게 구분지어 사용하는 버릇을 들이도록 합시다 :) 모든 코딩의 기본이고, 우리의 코드는 소중하니까요~
이름 그대로 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 부팅이 되지 않을수 있..
기본적으로 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 | +-------------------------+ ..
- Total
- Today
- Yesterday