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

,

아래와 같은 환경에서


  - 부트로더 : u-boot

  - 커널 : Linux

  - root filesystem : nfs

  - 보드 IP : 192.168.1.100

  - Server IP : 192.168.1.10

  - nfs dir : /tftpboot/rootfs


 작업할 경우 "RPC : sendmsg returned error 101" 라는 메시지와 함께 root filesystem 마운트에 실패하는 경우가 있다. 


 이럴경우 kernel cmdline 으로 전달되는 bootargs 변수에 "nolock" 옵션을 붙여 주면 해결된다. 



 Marvell >> setenv bootargs 'console=ttyS0,115200 root=/dev/nfs init=/linuxrc rw nfsroot=192.168.1.10:/tftpboot/rootfs/,nolock ip=192.168.1.100'

Marvell >> tftpboot 0x400000 uImage

Marvell >> bootm 0x400000


 위의 예제처럼 nolock 옵션을 붙여주면 kernel/fs/nfs/nfsroot.c::static int __init root_nfs_parse() 에서 옵션을 인식해서 nolock 모드로 마운트를 할 수 있게 해준다. 



'development' 카테고리의 다른 글

[program] unused variable 문제  (0) 2013.08.02
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[Kernel] Kbuild system  (0) 2013.07.12
[kernel] __read_mostly?????  (0) 2013.05.08
[etc] Reglar expressions  (0) 2012.09.19
블로그 이미지

김유석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

,

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

,

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

,
Table of Content
1. 환경변수 설정
2. 환경변수 실행
3. spi flash cmd



1. 환경변수 설정
  command : setenv
  example:
    setenv ipaddr 10.100.4.48
    setenv my_test 'setenv ipaddr 10.100.4.96; setenv serverip 10.100.4.48'
    setenv my_run 'run my_test;tftp 0x20000000 vmlinux'

2. 환경변수 실행
  command : run
  example : 
    run my_run   => my_run 이라는 환경 변수로 등록해 놓은 내용들을 실행한다.


3. spi flash cmd
  command : sflash
  example : 
    sflash protect off => spi flash 에 write 할 수 있도록 함.

    sflash read 0xf8100000 0xa00000 0x3ffff  => 0xf8100000  에서 0x3fff 만큼 읽어서 0xa00000 로 저장한다.

















 






'development' 카테고리의 다른 글

[etc] Reglar expressions  (0) 2012.09.19
[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
블로그 이미지

김유석0

,
- L2TP
  Layer 2 Tunneling Protocol
  http://www.computerhope.com/jargon/l/l2tp.htm   

- BRAS
  Broadband Remote Access Server 
  http://en.wikipedia.org/wiki/Broadband_Remote_Access_Server



 

'development' 카테고리의 다른 글

[kernel] initrd/initramfs 편집하기.  (0) 2012.05.29
[u-boot] u-boot 사용법  (0) 2012.03.08
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[kernel] 스핀락  (1) 2012.01.04
블로그 이미지

김유석0

,
2차원 배열 동적 할당

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
 
#define BUCKET 5
#define SLOT     5 

int main(int argc, char *argv[])
{
  int i = 0;
  char **array=NULL;

  array = (char **)malloc(sizeof(char *) * BUCKET);
  
  for(i=0;i<BUCKET;i++){
    array[i] = (char *)malloc(sizeof(char) * SLOT);
    memset(array[i], 0x00, SLOT);
    memcpy(array[i], "12345", 5);
  }

  for(i=0;i<BUCKET;i++){
    printf("%s\n", array[i]); 
  }
  
  return 0;
}




'development' 카테고리의 다른 글

[u-boot] u-boot 사용법  (0) 2012.03.08
[etc] 네트웍 용어 정리  (0) 2012.03.06
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
블로그 이미지

김유석0

,
 Top Half? Bottom Half? 이게 뭐하는 녀석이지?

 용어만 보면 정확히 어떤 개념인지 와닿지가 않습니다.

 HW 인터럽트가 발생하였다고 가정하고,
 인터럽트가 발생하면 보통 아래와 같이 처리를 하게 됩니다.

    step 1. 인터럽트 disable
    step 2. 해당 인터럽트에 관련된 기능 동작
    step 3. 인터럽트 enable

 인터럽트가 발생하게 되면 우선 인터럽트 기능 자체를 disable 하게 됩니다. 
 지금 발생한 인터럽트에 관련된 기능을 모두 처리하기 전까지는 다른 인터럽트들은 무시하기 위해서입니다.
 인터럽트에 대한 처리가 모두 완료되면 인터럽트 기능을 enable 하고 기능을 종료하게 됩니다.

 여기서 간단히 생각해 볼 수 있는 것이 무엇이냐면

 "인터럽트 처리를 하는 시간이 길면 길수록 시스템이 멈춘것 같이 보일 수 있다"

 입니다. 

 예를 들어서 네트웍 패킷이 들어왔는데 패킷 처리 시간이 1초라면 패킷을 처리하는 동안은 키보드 입력도 안되고, 마우스 입력도 안되는 상황이 벌어지게 됩니다. 

 이런 상황을 개선하고자 Top half 와 Bottom half 라는 개념을 생각해 내게 되었습니다. 

 어떤 개념이냐면,

 "인터럽트가 발생했을때 데이터를 가져오는 등의 기능은 반드시 바로 처리해야 하고 속도도 빠르니까 데이터 가져오는 것까지만 잽싸게 처리하고, 그 데이터를 가져온 이후 동작은 꼭 지금 해야 하는 것은 아니니 나중에 처리하자"

 라는 것이지요.

 여기서 말하는

 데이터 가져오는 동작 : Top half
 가져온 데이터를 처리하는 동작 : Bottom half


 라고 부르기로 한 것이 Top half 와 Bottom half 의 개념입니다. (다시 설명하면 빠른 동작 하는 녀석은 Top half 라 부르기고 하고 느린 동작 하는 녀석은 Bottom half 라고 부르자 입니다. )

 window NT 계열에서는  "Deferred Procedure Call", "Asynchronous Procedure Call" 등과 같은 개념으로 부르고 있습니다. 

 인터럽트가 발생하는 Top half 동작부터 잽싸게 해치웁니다. 이렇게 하면 속도 저하를 느끼기가 어렵겠지요?
 그럼 Top half 동작을 통해서 가져온 데이터를 처리하는 느린 동작은 언제 시작하게 될까요?

 그것을 위해서 필요한 여러가지 기능이 있는데 가장 대표적인 것이 work_queue 입니다.

 work_queue 는 커널이 제공하는 기본 기능입니다.

 이름 대로 work(=function) 들을 queue 에 넣어서 관리하는 기능인데 work(=function) 들을 work_queue 에 넣어 주면 Top half 동작이 완료된후 차례대로 work(=function) 들을 호출해서 Bottom half 기능을 수행해 주게 됩니다.

 work_queue 에 대한 자세한 내용은 따로 다루도록 하겠습니다.



 
 

 

'development' 카테고리의 다른 글

[etc] 네트웍 용어 정리  (0) 2012.03.06
[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] 스핀락  (1) 2012.01.04
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
블로그 이미지

김유석0

,