네트웍 구조가 아래와 같을때, 


 Internet <-> [ eth0(10.200.0.41) ---- eth1(192.168.0.254) ] <-> Host PC(192.168.0.100)


아래와 같이 설정한다. 


 $ > iptables -t nat -A POSTROUTING -s 192.168.0.0./24 -j SNAT --to 10.200.0.41


'development' 카테고리의 다른 글

[gcc] __attribute__((......)) 키워드  (0) 2016.01.06
openwrt  (0) 2015.02.24
[linux] debug fs 사용법  (0) 2015.01.07
[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] unused variable 문제  (0) 2013.08.02
블로그 이미지

김유석0

,

debugfs?

  /proc/  밑에 리눅스 커널과 직접 통신이 가능한 file 형태의 인터페이스를 만들어 쓰듯이, debugfs 라는 가상의 메모리 타입 파일 시스템에 디버깅용 인터페이스를 만들어 사용하는 것을 말합니다. 


마운트 방법

$ > mount -t debugfs none /sys/kernel/debug/


 위와 같이 마운트 한후, /sys/kernel/debug/ 디렉토리에 들어가 보면, 리눅스 커널에서 만들어 놓은 디버깅용 인터페이스 파일들을 확인할 수 있습니다. 


example

/ > mount -t debugfs none /sys/kernel/debug


/ > cd /sys/kernel/debug


/sys/kernel/debug > ls

at91_clk        gpio            memblock        wakeup_sources

at91_gpio       hid             mmc0

bdi             ieee80211       usb


/sys/kernel/debug/ > cat at91_gpio

Pin     PIOA            PIOB            PIOC            PIOD


0:      A               A               GPIO:1          A

1:      A               A               GPIO:1          A

2:      GPIO:1          A               GPIO:1          A

3:      GPIO:1          A               GPIO:1          A

4:      GPIO:1          A               GPIO:1          GPIO:1

5:      GPIO:1          A               GPIO:1          GPIO:1

6:      GPIO:1          A               GPIO:1          A

7:      B               A               GPIO:1          A

8:      GPIO:1          GPIO:1          GPIO:1          A

9:      A               A               GPIO:1          A

10:     A               A               GPIO:1          A

11:     A               GPIO:1          GPIO:1          A

12:     A               GPIO:1          GPIO:1          A

13:     A               GPIO:1          GPIO:1          A

14:     GPIO:1          GPIO:1          GPIO:1          GPIO:1

15:     A               GPIO:1          GPIO:1          IRQ:edge-both

16:     A               GPIO:1          GPIO:0          A

17:     A               GPIO:1          GPIO:1          A

18:     A               GPIO:1          GPIO:1          A

19:     A               A               GPIO:1          GPIO:0

20:     A               A               GPIO:0          GPIO:0

21:     GPIO:1          A               GPIO:0          GPIO:1

22:     GPIO:1          A               GPIO:1          A

23:     GPIO:1          A               GPIO:1          A

24:     B               A               GPIO:1          A

25:     B               A               GPIO:1          A

26:     B               A               GPIO:1          A

27:     B               A               GPIO:1          A

28:     B               A               GPIO:0          A

29:     B               A               GPIO:1          A

30:     GPIO:1          A               GPIO:1          A

31:     GPIO:1          A               GPIO:1          A


/sys/kernel/debug/ > cd mmc0


/sys/kernel/debug/mmc0 > ls

clock             ios               pending_events    req

completed_events  mmc0:b368         regs              state


/sys/kernel/debug/mmc0 > cat clock 

50000000



API

 debug fs 를 만드는 api 는 kernel source 검색을 통해 확인 할 수 있습니다. 

대표적인 api 는 아래와 같으며, 이 api 를 시작으로 분석하면 쉽게 익힐 수 있습니다.


fs/debugfs/inode.c

struct dentry *debugfs_create_file(const char *name, mode_t mode, struct dentry *parent, void *data, const struct file_operations *fops);


'development' 카테고리의 다른 글

openwrt  (0) 2015.02.24
[network] nat 설정법  (0) 2015.01.15
[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] unused variable 문제  (0) 2013.08.02
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
블로그 이미지

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

,

IPv4 packet forwarding

linux 2012. 5. 3. 11:10
아래와 같은 구성일 때, H1 <-> H2 의 통신을 위해, 

Router 1 의 eth0 과 eth1 사이에 패킷 포워딩,
Router 1 의 eth0 과 eth1 사이에 패킷 포워딩을 해야 한다. 

Router 1 

  eth0 : 1.1.1.1/24

  eth1 : 100.100.100.1/24


Router 2

  eth0 : 1.1.1.2/24

  eth1 : 200.200.200.1/24


Host 1 

  eth0 : 100.100.100.2/24

  default gateway : 100.100.100.1

  

Host 2

  eth0 : 200.200.200.2/24

  default gateway : 200.200.200.1



이때, 커널에서 패킷 포워딩을 하도록 설정해 놓았는지 확인해 보아야 하는데,


/proc/sys/net/ipv4/ip_forward 를 "1"로 설정하면 패킷 포워딩이 동작하고 "0" 으로 설정하면 동작하지 않는다. 



'linux' 카테고리의 다른 글

cpu clock(속도) 조절  (2) 2013.03.04
opensource 정보  (0) 2012.05.18
리눅스 콘솔내용을 시리얼로 출력해서 보려면  (0) 2012.04.03
iproute2  (0) 2012.02.07
ubuntu 에서 tftp server 설치하는법  (0) 2011.11.24
블로그 이미지

김유석0

,

[kernel] 스핀락

development 2012. 1. 4. 16:17
Table of content
  1. spin lock?
  2. example of spin_lock 












1. spin lock?
  프로세스 한개만 계속 수행되는 경우라면 critical section 에 대해서 신경쓸 필요가 없다.
  하지만, 현실은 여러 프로세스가 함께 동작하는 상황이므로 LOCK 에 대한 고민을 할 수 밖에 없다. 
 
  spin lock 은 커널에서 사용하는 LOCK 기법중의 하나이며 대표적인 기법이다.

  spin lock 의 API 들은 아래와 같다.

    spin_lock_init();
    spin_lock();
    spin_unlock();
    spin_locK_irqsave():
    spin_lock_irq();
    spin_lock_bh();
    spin_unlock_irqrestore();
    spin_unlock_irq();
    spin_unlock_bh();
    spin_trylock();
    spin_trylock_bh();

  spin lock() 이 커널의 LOCK 기법중 하나인 것을 감안하면 api 의 숫자가 많은 것에 놀랄수도 있다. 그만큼 LOCK 기법은 어렵고 신경써야 할 점이 많다는 것이라고 이해하면 된다. 


2. example of spin_lock
  spin lock 을 사용하려면
  
 
첫번째, spin lock 변수를 선언해야 하고
 
두번째, spin lock 변수를 초기화 해야 하며
    : static 과 dynamic 방식으로 구분된다. 
 
세번째, lock 을 얻어야 하며
    : spin_lock();
 
네번째, lock 을 풀어주어야 한다.
    : spin_unlock(); 

  아래는 spin lock 을 사용하는 가장 간단한 예제이다.

#include <asm/init.h>
#include <asm/kernel.h>
#include <asm/module.h>
#include <asm/version.h>
#include <asm/delay.h>
#include <asm/spinlock.h>
#include <asm/kthread.h>

spinlock_t g_this_lock;
struct task_struct *g_th_id1;
struct task_struct *g_th_id1;

static int
 thr_spin_lock_1(void *arg)
{
  int i = 0;
 
  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  for(i=0;i<30;i++){
    
printk(KERN_ALERT "@ %s() : loop\n", __FUNCTION__);
    ssleep(1); 

  } 
 

  spin_unlock(&g_this_lock); 

  printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
 
 
return 0; 



static int
 thr_spin_lock_2(void *arg)

  printk(KERN_ALERT "@ %s() : called\n", __FUNCTION__);

  spin_lock(&g_this_lock);

  
printk(KERN_ALERT "@ %s() : get locked\n", __FUNCTION__);

  ssleep(10);

  spin_unlock(&g_this_lock); 


  
printk(KERN_ALERT "@ %s() : unlocked\n", __FUNCTION__);
  
  
return 0; 


static void __init only_spin_lock_init(void)
{
  spin_lock_init(&_ghis_lock);

  g_th_id1 = kthread_run(thr_spin_lock_1, NULL, "LOCK1");
  g_th_id2 = kthread_run(thr_spin_lock_2, NULL, "LOCK2");

  return 0; 



 위 예제는 문제를 내포하고 있는 코드입니다. spin_lock 이 걸려 있는 상태에서 rmmod 로 모듈을 제거하게 되면 "device is busy" 가 발생하게 됩니다. 
 

'development' 카테고리의 다른 글

[program] 2차원 배열 동적 할당  (0) 2012.02.10
[kernel] Top Half? Bottom Half? context?  (5) 2012.01.13
[program] Makefile  (0) 2012.01.04
[kernel] 커널 쓰레드  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
블로그 이미지

김유석0

,
 리눅스 커널도 하나의 프로세스이므로 총 4GByte 의 Virtual memory 를 사용하게 됩니다.

 4GByte 의 메모리는 아래와 같이 크게 두 개로 나뉘게 되며 하위 3GByte 는 user space(application) 용이며 상위 1GByte 는 kernel space 로 구분합니다. 



 위와 같이 커널 영역은 Virtual memory 4GByte 영역중에서 하위 1GByte 영역에 위치하게 됩니다.(0xc0000000 ~ 0xffffffff)

 커널 영역의 상위 8Byte 는 아래와 같이 물리 메모리와 1:1 매핑되게 됩니다.


 커널 영역의 하위 128MByte 는 아래와 같이 특수 목적을 위해 커널에서 Reserved 하여 사용하게 됩니다.(물리 메모리와는 상관 없습니다.)


 그러므로 Virtual memory 중에서 커널 영역에서 사용할 수 있는 공간은 1GByte - 128MByte = 896MByte 입니다.  


 위에 설명한 모든 내용은 PAE(Physical Address Extension) 를 사용하지 않는 32Bit CPU 일 경우에 관한 내용입니다.
 64Bit CPU 를 사용하거나 PAE 를 사용하는 경우에는 메모리 매핑하는 방법이 약간 달라집니다.

리눅스메모리모델.pptx




'development' 카테고리의 다른 글

[kernel] 커널 쓰레드  (0) 2012.01.04
[kernel] 시간지연  (1) 2012.01.02
[etc] 빌드 시스템  (0) 2011.12.23
[kernel] Thread 와 Kill  (0) 2011.11.26
[GCC] -S 옵션?  (0) 2011.11.18
블로그 이미지

김유석0

,

[program] scandir()

development 2011. 10. 26. 13:42
scandir 

scandir() 은 디렉토리를 스캔하는 api 입니다.
처음 보면 어떻게 사용하는지 알아보기 어렵지만 조금만 해 보면 아주 간단한 api 입니다.

함수원형

#include <dirent.h>

scandir(const char *dirp,
          struct dirent **namelist,
          int(*filter)(const struct dirent *),
          int(*compar)(cont struct dirent **, const struct dirent **)); 


보시다시피 아주 복잡하게 되어 있습니다. 함수 포인터를 사용해 보신 분이라면 쉽게 이해가 되실 겁니다. 

다시 설명하면

 const char *dirp    => 검색할 디렉토리 지정                     
 struct dirent **namelist  => 검색결과 저장할 dirent 구조체 지정
 int(*filter)(const struct dirent *) => 필터 함수 사용할 경우, 사용할 필터 함수 지정
 int(*compar)(cont struct dirent **, const struct dirent **) => sort 함수 지정할 경우, 사용할 sort 함수 지정



1. 가장 기본적인 사용예제
  필터 함수 사용 : filter()  => 직접 만든 함수
  소트 함수 사용 : alphasort() => 미리 제공되는 시스템 함수
  
#include <dirent.h>

/* ".", ".." 은 빼고 나머지 파일명 출력하는 필터 함수 */
ᅟstatic int filter(const struct dirent *dirent)
{
  if(!(strcmp(dirent->d_name, ".")) ||
     !(strcmp(dirent->d_name, ".."))){
     /* 현재 디렉토리, 이전 디렉토리 표시는 출력안함 */
   }else{
    printf("   %s() : %s\n", __FUNCTION__, dirent->d_name);
   }
}

int main(int argc, char *argv[])
{
  int ret = 0;
  struct dirent **filelist;

  ret = scandir(".", &filelist, *filter, alphasort);

  return 0;
}


2. 필터 함수 사용 안할 경우
  소트 함수 사용 : alphasort() => 미리 제공되는 시스템 함수

  필터 함수를 사용안할 경우 리턴값은 디렉토리 엔트리의 갯수입니다. 
  
#include <dirent.h>

int main(int argc, char *argv[])
{
  int ret = 0;
  int i;
  struct dirent **filelist;

  ret = scandir(".", NULL, *filter, alphasort);

  for(i=0;i<ret;i++){
    printf("  %s() : %s\n", __FUNCTION__, filelist[i].d_name);
  }

  return 0;
}


3. sort 함수 사용 안할 경우
  필터 함수를 사용안할 경우 리턴값은 디렉토리 엔트리의 갯수입니다. 
  
#include <dirent.h>

int main(int argc, char *argv[])
{
  int ret = 0;
  int i;
  struct dirent **filelist;

  ret = scandir(".", NULL, *filter, NULL);

  for(i=0;i<ret;i++){
    printf("  %s() : %s\n", __FUNCTION__, filelist[i].d_name);
  }

  return 0;
}


'development' 카테고리의 다른 글

[program] memmove  (0) 2011.10.27
[kernel] struct list_head  (0) 2011.10.26
[kernel] 커널 컴파일 완료후 꼭 해줘야 하는것.  (0) 2011.10.21
[kernel] print_hex_dump() api  (0) 2011.10.21
[crypto] RFC 3602(AES-CBC 암호화)  (0) 2011.10.20
블로그 이미지

김유석0

,
AES
  Advanced  Encryption Standard 의 약자로써 미국 정부 표준으로 지정된 암호화 알고리즘. 기존 DES 를 대체하는 암호화 알고리즘 입니다. 
  AES 알고리즘 방식은 ECB(Electronic CodeBook) 나 CBC(Cipher Block Chaning) 기법을 사용하는데 기존까지는 간단하고 구현이 쉬운 ECB 방식을 사용했다면 최근에는 CBC 방식을 사용하고 있습니다.
  
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
http://blog.naver.com/PostView.nhn?blogId=taketime62&logNo=90043063571 



블로그 이미지

김유석0

,
리눅스에서 제공하는 MD5 HASH 알고리즘의 사용 예입니다. 

결과 예제
 
 입력 메시지  (A)
 변환 메시지  (7fc56270e7a70fa81a5935b72eacbe29)
 입력 메시지  (AB)
 변환 메시지  (b86fc6b051f63d73de262d4c34e3a0a9)
 입력 메시지  (ABC)
 변환 메시지  (902fbdd2b1df0c4f70b4a5d23525e932)


자세한 내용은 첨부 파일 참조 바랍니다. 

md5_example.tar.bz2






 
블로그 이미지

김유석0

,