아래 코드를 빌드하면

 
#include <stdio.h>
#include <sys/types.h>


int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;
    
     return 0;
}


아래와 같이 빌드 에러 발생하게 됩니다.  


cc -Wall -Werror -Werror -std=gnu99 -c -o unused.o unused.c 
unused.c: In function ‘main’ 
unused.c:7:6: error: unused variable ‘value’ [-Werror=unused-variable] 
cc1: all warnings being treated as errors make: *** [unused.o] Error 1


이유는 ,  사용하지도 않으면서 value1 이라는 변수를 선언해 놓았기 때문인데, 보통은 Warnning 만 발생하지만 -Werror 옵션을 사용하면 기존의 Warnning 들을 모두 error 로 인식하기 때문입니다. 


가장 쉬운 해결 방법은, value1 이라는 변수를 사용하지 않는 것인데 아래와 같은 상황에서는 그렇기도 어렵습니다. 


#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}

위와 같은 코드일경우, HAVE_PRINT 선언 상태에 따라서, value1 을 사용할 수도, 안할 수도 있으므로 무작정 value1 을 삭제할 수는 없습니다. 


그래서 아래와 같이 value1 에 속성을 주어서 선언하면 이런 문제를 해결할 수 있습니다. 



#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1 __attribute__((unused));
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}


이렇게 하면 unused value 빌드 에러를 피할 수 있습니다. 단, 이 방법은 gnu 확장 문법이므로 다른 컴파일러 사용시에는 주의를 하셔야 합니다. 


'development' 카테고리의 다른 글

[linux] debug fs 사용법  (0) 2015.01.07
[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] unused variable 문제  (0) 2013.08.02
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

32bit CPU 인 ARM 에서 개발하고 있을때, 


아래와 같이 64비트 변수를 사용하려고 u_int64_t 타입을 사용할 경우, 문제 없이 동작되기를 기대하겠지만 잘 안되는 경우가 많다. 

 
#include <stdio.h>
#include <sys/types.h>


int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;
    
    printf("%lld\n", value1);
    return 0;
}


위 코드를 아래처럼 컴파일을 해 보면



$ arm-none-linux-gnueabi-gcc -Wall -Werror -o test test.c cc1: warnings being treated as errors test.c: In function 'main': test.c:9: error: integer constant is too large for 'long' type


위와 같이 에러가 발생한다. 물론 -Werror 옵션을 제거하면 Warring 은 뜨겠지만 빌드는 될 것이다. 


uint64_t 타입은 

#typedef unsigned long long int uint64_t 

 으로 만드는데 C90 표준은 아니고 C99 에서야 지원하기 시작한 상황이다.그래서 빌드시 어떤 표준을 사용할 것인지에 대해 명시해 주어야 한다.  



아래와 같이 C99 표준 지정하여 빌드하면 문제없이 처리된다. 

$ arm-none-linux-gnueabi-gcc -Wall -Werror  -std=gnu99 -o test test.c



ARM 쪽에서는 잘 빌드 되었는데, 이젠 X86_64 에서 printf 사용시 문제가 발생한다. 


위의 에러 메시지에서 볼 수 있듯이 


32bit 머신에서 uint64_t 는 unsinged long long int 인데,

64bit 머신에서 uint64_t 는 unsigned long int 이므로 


printf("out : %lld\n", value); /* 32bit 머신에서는 OK, 64bit 머신에서는 fail */

printf("out : %ld\n", value); /* 32bit 머신에서는 fail, 64bit 머신에서는 OK */

 

인 상황이 벌어지게 된다. 


우선 stdint.h 를 참조하여 코드를 아래와 같이 묶어 주었다. 




 
#include <stdio.h>
#include <sys/types.h>


int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;
    
#if __WORDSIZE == 64
    printf("%ld\n", value1);
#else
    printf("%lld\n", value1);
#endif
    return 0;
}

위와 같은 방식을 사용해도 되고 아래처럼 type casting 을 사용해도 된다. 아래 방식이 더욱 안정적으로 동작할 것이다. 



#include <stdio.h> #include <sys/types.h> int main(int argc, char *argv[]) { u_int64_t value1; value1 = 0xffffffffffffffff; printf("%lld\n", (long long unsigned int)value1); return 0; }



이런 문제는 특히, 멀티플랫폼을 지원하는 SW 개발시에 발생할 가능성이 크다. 처음부터 멀티 플랫폼 지원을 예상하여 작성하면  향후 알 수 없는 문제 발생을 줄일 수 있다. 




'development' 카테고리의 다른 글

[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] unused variable 문제  (0) 2013.08.02
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
[kernel] __read_mostly?????  (0) 2013.05.08
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

[Kernel] Kbuild system

development 2013. 7. 12. 19:54

Kbuild System



About Kbuild

 프로젝트 진행시 makefile 을 사용하면 빌드 과정을 단순화 시킬 수 있습니다. 하지만, 프로젝트의 규모가 커지면 makefile 도 그만큼 복잡해 지며 복잡해진 만큼 관리도 어려워 집니다.  

 Kbuild 는 이런 단점을 보안하기 위해 만든 makefile framework 이며, 규칙에 따라 간단하게 작성한 makefile 만으로도 복잡한 일을 수행할 수 있게 도와 줍니다. 


Kbuild 의 목적

  • 여러 플랫폼을 같은 방법으로 사용할 수 있게 할것.
  • 유연성있게 사용할 수 있어야 함. 
  • makefile 을 쉽게 만들수 있어야 하고 관리도 편해야 한다. 

 

Kbuild 가 지원하지 않는 기능

 Kbuild 는 빌드에 필요한 라이브러리나 헤더 등을 미리 확인해 주는 기능은 지원하지 않습니다. 

 이런 기능은 autoconfig tool(ex. configure..) 을 사용해야 합니다. 

 그렇다고 autoconfig tool 을 Kbuild 에서 사용할 수 없다는 건 아니므로 필요시 Kbuild 와 조합해서 사용하시면 됩니다. 


Kbuild 공식 사이트

 Kbuild 의 공식 사이트 주소는 아래와 같습니다.

 Kbuild 의 최신 버전이나 각종 정보를 얻을 수 있습니다. 


 http://svn.netlabs.org/kbuild


 최신버전 다운로드는 아래 주소를 클릭하시면 됩니다. (2013년 7월 12일 기준)

 

 http://svn.netlabs.org/kbuild/wiki/Download





Reference

http://svn.netlabs.org/kbuild/


'development' 카테고리의 다른 글

[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
[kernel] __read_mostly?????  (0) 2013.05.08
[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

커널 코드를 살펴보다보면 __read_mostly 라는 매크로를 볼 수 있게 된다. 

자주 읽지만, 쓰는 것은 드문 데이터들이 있을 수 있다. 이런 데이터들을 캐쉬에 올려 놓으면 read 할때 유리하게 된다. 

__read_mostly 라는 매크로를 붙여주면 그 데이터는 캐쉬에 올라가게 된다. 


SMP 환경에서 이런 특성(자주 읽지만, 쓰는 것은 드문)의 데이터들은 캐쉬에 올려놓고 사용하는 것이 유리하다고 하니 필요에 따라서 이 매크로를 사용하도록 하자. 



'development' 카테고리의 다른 글

[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
[kernel] __read_mostly?????  (0) 2013.05.08
[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[u-boot] u-boot 사용법  (0) 2012.03.08
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

virtualbox 사용법

linux 2013. 3. 7. 11:09

Table of Contents

- 기본 환경

- virtual box 가 동작 안될때

- 가상 머신을 console 모드에서 실행시키는 방법


- 기본 환경

  OS : Ubuntu 12.10



- virtual box 가 동작 안될때

 dev/vboxdrv 어쩌구 저쩌구 하면서 동작 안될때가 많다. 

 이유는, 아래 순서로 설치해야 하는데,

    - linux kernel header

    - dkms

    - virtualbox-dkms 


  어처구니 없게도, ubuntu 12.10 첫 설치때부터 이 순서가 제대로 지켜지질 않는다. virtualbox-dkms, dkms 를 삭제하고 위 순서대로 다시 설치하면 된다. 


 삭제와 재설치는 아래와 같이 하면 된다. 


$ sudo aptitude remove virtualbox-dkms 

$ sudo aptitude remove dkms 


$ sudo aptitude install linux-headers-$(uname -r)

$ sudo aptitude install dkms

$ sudo aptitude install virtualbox-dkms



- 가상 머신을 console 모드에서 실행시키는 방법

  서버등에서 가상 머신을 돌리고 클라이언트에서 원격으로 접속하는 방식을 많이 사용하게 되는데, 이럴때 아래와 같이 실행시키면   된다. 

poplinux@poplinux:/usr/src$ vboxmanage startvm win7 








'linux' 카테고리의 다른 글

lxc 에 외부 IP 설정하여 직접 접속하는법  (0) 2019.01.24
virtualbox 사용법  (0) 2013.03.07
cpu clock(속도) 조절  (2) 2013.03.04
opensource 정보  (0) 2012.05.18
IPv4 packet forwarding  (0) 2012.05.03
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

cpu clock(속도) 조절

linux 2013. 3. 4. 19:06

Table of contents

1. 환경

2. cpu 설정 확인

3. 설정법

4. 정리글



1. 환경

  CPU : Intel(R) Core(TM)2 Duo CPU     E7400  @ 2.80GHz

  RAM : 8GByte

  model : Samsung SENS SF511

  OS : ubuntu 12.04 64bit


2. cpu clock 설정 확인

2-1. cpu 정보 있는곳

  cpu 0 : /sys/devices/system/cpu/cpu0/cpufreq

  cpu 1 : /sys/devices/system/cpu/cpu1/cpufreq

  cpu 2 : /sys/devices/system/cpu/cpu2/cpufreq

  cpu 3 : /sys/devices/system/cpu/cpu3/cpufreq


poplinux@poplinux: ~$ (3.33) ls /sys/devices/system/cpu/cpu0/cpufreq/

affected_cpus

cpuinfo_max_freq = > 사용 가능한 최고 clock

related_cpus

scaling_cur_freq

scaling_max_freq

stats

bios_limit

cpuinfo_min_freq

scaling_available_frequencies => 설정 가능한 clock 목록

scaling_driver

scaling_min_freq

cpuinfo_cur_freq => 현재 동작중인 clock

cpuinfo_transition_latency

scaling_available_governors => 설정 가능한 동작 mode

scaling_governor => 현재 설정되어 있는 동작 mode

scaling_setspeed


cpufreq 디렉토리에는 여러 파일이 있지만 위에 굵게 표시한 파일만 신경쓰면 된다.




3. 설정법

3-1. 준비

속도 설정은 직접 cpufreq/* 의 파일들을 수정해서 할 수도 있지만, cpufreq-set 바이너리를 사용하는 것이 편리하다. 

아래와 같이 설치한다. 


 sudo aptitude install cpufrequtils

 


3-2. 설정 방법

아래 명령을 수행하면, cpu0, cpu1, cpu2, cpu3 을 최대 성능을 내도록 설정하게 된다. 


 sudo cpufreq-set -c 0 -g performance
 sudo cpufreq-set -c 1 -g performance
 sudo cpufreq-set -c 2 -g performance
 sudo cpufreq-set -c 3 -g performance


  

  /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 

  /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor 

  /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor 

  /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor 


파일의 내용을 "performance" 로 변경하게 된다. 


3-3. 부팅시점에 자동 적용

 3-2 에서 설명한 방법은 부팅 이후에 사용자가 수동으로 변경하는 방법으로 부팅 시점에 자동으로 설정하려면 아래와 같이 하면 된다.


step 1. /etc/init.d/cpufrequtils 수정

poplinux@poplinux: cpufreq$ (3.33) vi /etc/init.d/cpufrequtils


GOVERNOR="performance"


 step 2. /etc/rc2.d/S19cpufrequtils 추가 ( 원래 있었으면 생략)

 poplinux@poplinux: rc2.d $ (3.33) ln -s ../init.d/S19cpufrequtils ./


step 3. /etc/rc2.c/S99ondemand 삭제

 ubuntu 에서는 CPU clock 를 상황에 따라 자동으로 변경하게 하는 것을 기본으로 하고 있는데 그걸 설정하는 스크립트가 S99ondemand 입니다. 


 이걸 삭제해야 합니다.   


  poplinux@poplinux: rc2.d $ (3.33) rm S99ondemand



 여기까지 작업하고 재부팅하면 사용 가능한 최대성능으로 동작하게 됩니다.(CPU 에 한해서) 



4. 정리글

 컴파일 할 때는 큰 영향은 없을 수도 있지만, 일상적인 사용시에는 버벅거림이 덜 하게 됩니다. 








'linux' 카테고리의 다른 글

lxc 에 외부 IP 설정하여 직접 접속하는법  (0) 2019.01.24
virtualbox 사용법  (0) 2013.03.07
cpu clock(속도) 조절  (2) 2013.03.04
opensource 정보  (0) 2012.05.18
IPv4 packet forwarding  (0) 2012.05.03
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

Table of contents

1. Regular expression?

2. 구성요소

  2-1 메타문자? 리터럴 문자?

  2-2 메타 문자

  2-3 리터럴 문자

예제




1. Regular expressions?

  텍스트를 표현하는 일종의 규칙입니다. 컴퓨터 세계에서는 분야 막론하고 다양하게 쓰이고 있으며 반드시 익혀 두어야 하는 기능입니다. 


2. 구성 요소

  2-1. 메타 문자? 리터럴 문자?

    메타 문자는 "*", "-" 등과 같은 특수 문자를 뜻한다. 

    리터럴 문자는 일반적인 문자를 뜻한다. 

  2-2 메타 문자

    메타 문자는 상황에 따라 메타 문자로 인식되기도 하고 리터럴 문자로 인식되기도 합니다. 


    '^' : 시작을 의미함. 예를 들어 "^cat" 이라고 표현하면 cat 으로 시작하는 문자열 검색해줌

    '$' : 끝을 의미함. 예를 들어 "cat$" 이라고 표현하면 cat 으로 끝나는 문자열 검색해줌

    '[...]' : 괄호 안에 있는 내용들은 or 이나 범위를 뜻함. 예를 들어 [aB] 는 a 나 B, [0-9] 는 0부터 9까지 를 의미함. 

    '[^...]' : '^' 를 괄호 안에 사용할 경우엔 NOT 의 의미가 된다. 예를 들어 [^0-9] 는 숫자가 아닌것 이라는 의미를 지닌다. 

    '|' : or 의 의미를 지니고 있다. 예를 들어 'Kay|Kim' 는 Kay 와 Kim 중에 하나만 일치해도 된다는 의미를 지닌다. 

    '.' : 아무 문자와 매칭 가능함. 예를 들어  "A.B" 라고 표현할 경우 AaB ACB AXB 모두 매칭됨. 

    '(..)' : 일반적인 괄호와 동일한 역활. 범위를 한정시킴. 예를 들어 "(ABC|DEF):XYZ" 라고 표현 할 경우 ABC:XYZ 나 DEF:XYZ  가  매칭됨

    '\<' : 단어가 시작되는 위치를 뜻하는데 줄바꿈되어 있는 경우에 유용함.

    '\>' : 단어가 끝나는 위치를 뜻하는데 줄바꿈되어 있는 경우에 유용함. 

    '\' : Escape 메타 문자. 위에서 사용한 것과 용도가 명확히 다릅니다. \ 다음에 연달아 나오는 문자는 메타 문자가 아니라 일단 문자로 인식하게 됩니다. '\.' 이라고 표현하면 메타 문자 '.' 의 역활은 사라지고 그냥 문자로 취급됩니다. "ega.att.com" 을 찾고 싶을 때 "ega.att.com" 이라고 표현하면 "megawatt computing" 같은 텍스트가 검색될 수도 있지만, "ega\.att\.com" 이라고 검색하면 원하는 결과를 얻을 수 있습니다.  

    '?' : 바로 앞의 문자가 있거나 혹은 없어도 매칭. 예를 들어 'colou?r" 로 표현할 경우, color, colour 모두 매칭됨.

    '+' : 바로 앞의 문자가 한개 이상 반복되는 경우 매칭됨. 예를 들어 'colo+r' 로 표현할 경우, color, coloor, colooor 이 매칭됨. 하지만 colr 은 'o' 가 하나도 없으므로 실패함.

    '*' : 바로 앞의 문자가 0 개 이상 반복되는 경우에 매칭됨. 예를 들어 'colo*r' 로 표현할 경우, color, coloor, colooor, colr 모두 매칭됨.


  2-3 리터럴 문자

    메타 문자가 뜻과 역활을 가진 문자라면 리터럴 문자는 특정한 뜻이 없는 문자입니다. 우리가 흔히 말하는 텍스트 입니다. 

정규 표현식을 사용하는 이유중의 하나가 텍스트를 편하게 다루기 위함이고 메타 문자도 그 목적을 위한 수단입니다. 




예제

  ^cat$ : cat 만 적혀 있는 문자열

  ^$ : 비어 있는 행

  ^ : 모든 행

  <H[12345]> : <H1>, <H2>, <H3>, <H4>, <H5> 태그 찾아줌



사이트

http://regexlib.com/

http://www.zytrax.com/


'development' 카테고리의 다른 글

[Kernel] Kbuild system  (0) 2013.07.12
[kernel] __read_mostly?????  (0) 2013.05.08
[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[u-boot] u-boot 사용법  (0) 2012.03.08
[etc] 네트웍 용어 정리  (0) 2012.03.06
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

면도기 샀음

일상사 2012. 7. 17. 14:54



질레트 5중날 하나로 4개월을 버티다가 드디어 면도기와 면도날을 셋트로 샀음. 


질레트에서 도루코로 바꾼 이유는?


1. 자게인이 추천해 줘서

2. 싸서


'일상사' 카테고리의 다른 글

[글로스브로] 버블밤 후기  (0) 2014.10.19
놀러 가는거  (0) 2014.08.12
면도기 샀음  (0) 2012.07.17
애기 이름 공모중  (14) 2012.02.17
우리 제이 돌잔치  (0) 2011.11.06
관악산  (0) 2011.10.31
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

Table of contents

  1. initrd ? initramfs ?

  2. initrd, initramfs 구분 방법

  3. initrd 편집하기

  4. initramfs 편집하기 



1. initrd ? initramfs ?

  압축 방법의 차이가 있다는 것은 알겠는데 정확한 차이점은 잘 모르겠음. 이건 나중에 업데이트 할 것임. 


2. initrd, initramfs 구분 방법

image name : initrd-2.4.19.img.gz


아래와 같이 입력시 


  gunzip -c /boot/initrd-2.4.19.img.gz | file -


아래와 같이 나오면 initrd


  "/dev/stdin: Linux rev 1.0 ext2 filesystem data"


아래와 같이 나오면 initramfs 임. 


"/dev/stdin: ASCII cpio archive (SVR4 with no CRC)"



3. initrd 편집하기

3-1. 압출 풀기 & 마운트

  step 1. mkdir temp

  step 2. gunzip -c /boot/initrd-2.4.19.img.gz > initrd.img

  step 3. mount -t ext2 -o loop initrd.img temp/


3-2. 다시 묶기

  step 1. umount temp

  step 2. gzip -9 -c initrd.img > /boot/initrd-2.4.19.img.gz-NEW


4. initramfs 편집하기

4-1. 압출 풀기 & 마운트

  step 1. mkdir temp

  step 2. cd temp

  step 3. gunzip -c /boot/initrd-2.4.19.img.gz | cpio -i


4-2. 다시 묶기

  step 1. pwd

            /root/temp

  step 2. find . | cpio -H newc -o | gzip -9 > /initrd-2.4.19.img.gz-NEW



이 내용은, http://backreference.org/2010/07/04/modifying-initrdinitramfs-files/  의 내용을 번역, 정리한 것임. 


'development' 카테고리의 다른 글

[kernel] __read_mostly?????  (0) 2013.05.08
[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[u-boot] u-boot 사용법  (0) 2012.03.08
[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요

opensource 정보

linux 2012. 5. 18. 13:52

1. util-linux-ng

  - linux 의 각종 기본 util(fdisk, more, fask) 의 소스 코드입니다. 

  -  WEB PAGE : http://kernel.org/~kzak/util-linux-ng/

  - DOWNLOAD :  ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/


2. coreutils

  - linux 의 가장 기본적인 binary(cp, mv, tail) 의 소스 코드입니다.

  - WEB PAGE : http://gnu.org


3. netperf

  - 네트웍 성능 측정용 도구입니다.

 -  WEB PAGE :  http://www.netperf.org/netperf/NetperfPage.html

  - DOWNLOAD :  ftp://ftp.cup.hp.com/dist/networking/benchmarks/netperf/


4. bsdmainutils

  - col, hexdump, write 등의 소스입니다.





'linux' 카테고리의 다른 글

virtualbox 사용법  (0) 2013.03.07
cpu clock(속도) 조절  (2) 2013.03.04
opensource 정보  (0) 2012.05.18
IPv4 packet forwarding  (0) 2012.05.03
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
iproute2  (0) 2012.02.07
블로그 이미지

얼굴반반피곤님 김유석0

댓글을 달아 주세요