아래 코드를 빌드하면

 
#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] 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
[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/


블로그 이미지

김유석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
[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
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
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
[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
애기 이름 공모중  (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
[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
IPv4 packet forwarding  (0) 2012.05.03
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
iproute2  (0) 2012.02.07
블로그 이미지

김유석0

,