리다이렉션과 파이프

 

시스템에 로그인하면쉘은 기본적으로 표준 입력장치로 키보드표준 출력장치로 모니터를 설정한다.

리눅스 시스템에서 리다이렉션과 파이프

-       입력과 출력의 방향을 변경할 수 있다.

 

리다이렉션

 

표준 출력의 리다이렉션

-       화면 출력을 파일 출력으로 바꾸는 것

-       리다이렉션을 의미하는 문자 è ‘>’

n  ex)  $ ls –al > test
이렇게 입력하였을 때 명령이 실행된 결과가 test 파일에 저장

-       파일이 이미 존재하고 있더라도 해당 파일을 무조건 덮어 씌우므로..
‘>>’ 
을 사용하여 이미 존재하는 파일의 끝에 추가하여 쓰도록 한다.

n  ex) $ ls –al >> test2
   $ cat test2
   $ ls –al >> test2
   $ cat test2

 

표준 입력의 리다이렉션

-       표준입력을 키보드에서 파일로 바꾸는 것

 

* sort 명령어 : 키보드로부터 입력된 데이터를 오름차순으로 정렬하여 그 결과를 표준 출력장치인 모니터 화면에 보여주는 명령어

 

-       표준 입력의 리다이렉션 è ‘<’

n  ex)  $ sort < names
          names 
파일로부터 입력받아 그 결과를 표준출력장치인 화면에 출력

n  ex)  $ sort < names > sorted
          
표준 입력과 표준 출력을 동시에..

 

 

 

파이프라인

 

파이프

 - 어떤 명령의 실행결과를 다음 명령의 입력 값으로 만들기 위해 두 명령어를 같이 쓸 수 있게 해주는 것!

파이프를 만들기 위해 두 명령어 사이에 | (vertical bar)를 놓아야 한다.
두 명령어 사이에 | 가 놓이면, | 을 기준으로 왼쪽은 표준 출력 명령이 되고오른쪽은 표준 입력 명령이 된다.

n   표준 출력 | 표준 입력

 ex)  cat names | sort | more
cat 
명령은 names 파일을 표준 출력하고, sort 명령은 cat에서 표준 출력된 데이터를 입력 값으로 받아 정렬한다정렬된 데이터를 다시 표준출력하며, more 명령은 sort에서 정렬된 데이터를 출력한다.

 

 

 파이프라인 분리 - Tee

 

파이프라인 분리

-       하나의 입력을 가지고 두 개의 동일한 출력을 가지는 명령어
파이프에 tee를 위치시키면 입력 데이터에 대한 두 개의 동일한 출력을 만들어 낼 수 있다는 것!

-       일반적 형식

n  tee filename

n  ex ) $ cat  names   sort  |  tee  sorted  | pr
          
파이프라인 tee를 이용해 데이터를 정렬하여 sorted라는 이름으로 저장하고 인쇄하는 예


출처 : http://blog.naver.com/dbwls0105?Redirect=Log&logNo=30037806187

   Port Registers


1. Port Open-Drain Registers
 : The port open-drain register(PODR), indicates a normal or wired-OR configuration of the port pins.
 : Determines whethehr the corresponding pin is actively driven as an output or is an open-drain driver.
'0' -> The I/O pin is actively driven as an output.
'1' -> The I/O pin is an open-drain driver. As an output, the pin is driven active-low, otherwise it is three-stated.

2. Port Data Register (PDATx)

3. Port Data Direction Register (PDIRx)
 : Direction. Indicates whether a pin is used as an input or an output.
'0' -> The corresponding pin is an input or is bidirectional
'1' -> The corresponding pin is an output.

4. Port Pin Assignment Register (PPAR)
 : Dedicated enable. Indicates whether a pin is a general-purpose I/O or a dedicated peripheral pin.
'0' -> General-purpose I/O. The peripheral functions of the pin are not used.
'1' -> Dedicated peripheral function.

5. Port Special Options Register (PSORx)
 : Special-option. Determines whether a pin configured for a dedicated function uses option 1 or option 2.
'0' -> Dedicated peripheral function. Option 1
'1' -> Dedicated peripheral function. Option 2




 MPC8280 칩의 Intenal Memory Resources는 연속적인 메모리 블럭에 맵핑되어 진다. 그 크기는 256 Kbytes이다. 이 블럭의 위치는 전역 4-Gbyte 물리 메모리 공간에 256 Kbytes 해상도로 매핑되어 지는데, IMMR(Interal Memory Map Register) 레지스터에 명시된 곳에 위치한다. 즉 Base Address를 IMMR 레지스터를 이용하여 직접 지정할 수 있다.

암호화 ?

어떤 평문을 암호문으로 바꾸는 것을 암호화라고 하고, 이때 사용되는것을 암호화 열쇠라고 한다.그리고, 암호문을 평문으로 바꾸는 것은 복호화이라고 하며, 이때는 복호화열쇠가 사용된다.

 

암호화알고리즘에 사용되는 단어로는

plaintext(cleartext; 평문):  전달해야 할 내용 
ciphertext(암호문): 암호화한 내용 
encryption(encipher; 암호화): 어떤 내용을 위장하는 것 
decryption(decipher; 복호화): 암호문을 평문으로 복구하는 것 
cryptographic algorithm(cipher, 암호화 알고리즘): 암호화와 복호화를 위해 사용하는 수학함수
. 일반적으로 암호화 함수와 복호화 함수 두 개로 이루어진다. 
key(키): 암호화 알고리즘의 파라미터. 암호화와 복호화를 위하여 평문 또는 암호문과 키가 함께 적용 되어야 한다.

등이 있다.

 

암호화방식에는 두가지 방법이 있는데 대칭형 암호화방식과 비대칭형 암호화방식이 있다.
◎ 대칭형 암호화방식(Symmetric Algorithm)
비밀키 암호화 방식 (Secret Key Algorithm) 이라고도 할수있다.
특징으로는 암호화와 복호화에 사용되는 키가 동일하다는 것이다.
장점은 암호화 및 복호화가 빠르며, 데이터 전송이 적고, 다양한 암호화기법이 존재한다.
단점으로는 송신자와 수신자 사이의 안전한 키 교환 문제가 발생한다.
예로써는.. SEED, DES, IDEA, RC2, RC5 등이 있다. 


◎ 비대칭형 암호화방식(Asymmetric Algorithm )
공개키 암호화 방식 (Public Key Algorithm) 이며,
두 개의 쌍으로 이루어진 키를 사용한다.
공개키 (Public Key) 는 모든 사람이 알 수 있도록 공개되어진다. 예를 들어

공인인증기관같은곳에 게시되는 형태이다. 
개인키 (Private Key) 는 자신만이 알 수 있도록 개인이 보관을 한다.
장점은 비밀키 전달 불필요에 따른 키 교환 문제 없고, 정보의 기밀 유지 이외에 다른 목적(무결성, 부인방지 등)으로도 사용 가능하다.
단점은 암호화 및 복호화가 느리고(대칭형에 비해 약 1000배), 많은 양의 자료를 암호화 · 복호화 하기 불편하다.
예로써는.. RSA(Rivest-Shamir-Adleman), Diffie-Hellman, ECC(Elliptic Curve Cryptography) 등이 있다.

 

공개키 암호 알고리즘

암호화 키와 복호화 키라는 상이한 두 개의 키를 사용하는데, 이 키들은 키 생성 알고리즘을 통해서 생성되어 하나는 타인들에게 공개되고, 나머지 하나는 사용자 자신만이 비밀리에 사용합니다. 이들 각각을 공개키(pubic key), 비밀키(secret key)라고 부릅니다
송신자가 수신자에게 어떤 메시지를 보낼 때, 수신자의 공개치를 이용하여 암호화해서 보내며, 수신자는 자신에게 도착한 암호문을 자신의 비밀키를 사용하여 평문으로 복귀하여 읽게 됩니다. 공개키 암호 알고리즘은 
비대칭 암호 알고리즘
 또는 이중키 암호 알고리즘이라고 부릅니다.

장점 
1. 사용자 입장에서 볼 때, 오직 자신의 비밀키 한 개만 잘 보관하면 되므로 대칭키 암호화

    알고리즘보다 훨씬 적은 수의 키 유지하면 된다 
2. 비밀키는 사용자 오직 자신만이 알고 있다. (전자서명과 같은 전자상거래 보안에 있서

   중요 역할 ) 
단점 
1. 암호화 및 복호화 속도가 느리다. 
2. 키의 길이가 대칭키 암호 알고리즘보다는 크기 때문에 계산 효율성이 저하된다. 

주요 공개키 암호화 알고리즘으로는 소인수 분해의 어려움을 이용하여 키를 생성하도록 하는 RSA 암호 알고리즘과 Rabin 암호 알고리즘, knapsack 문제를 이용한 Merkle-Hellman Knapsack 암호 알고리즘 그리고 최근에 제시된 타원곡선 암호(ECC: Elliptic Curve Cryptography) 알고리즘 등이 있습니다. 
특히 RSA 암호 알고리즘의 경우, 512비트, 768비트, 1024비트의 가변적인 길이의 키를 사용하며, 암호화의 기본이 되는 평문의 길이 역시 가변적이지만 사용하는 키의 길이보다 작기만 하면 됩니다.

 


 

해시 알고리즘

암호화 기술에서 해시(hash) 알고리즘은 핵심 기술에 속합니다.
해쉬 알고리즘은 
임의의 길이를 가지고 있는 메시지를 받아들여 고정된 길이의 출력 값으로 바꾸어주는 함수
로서, 이 때 출력 값을 해시 값(hash value) 혹은 메시지 다이제스트(message digest)라고 부릅니다
해시 알고리즘을 사용하면 같은 해시 값을 갖는 두 개의 다른 입력 메시지를 찾아내기란 불가능하므로 하나의 해시 값을 가지고 원래의 입력된 메시지를 예측할 수가 없게 됩니다. 따라서 데이터 전송 도중에 송신자 외의 제3자에 의해서 데이터가 변조되었는지를 쉽게 파악할 수 있게 되어 전자서명 등에 유용하게 사용됩니다. 이런 성격 때문에 해시 알고리즘을 
일방향
(one-way) 해시 알고리즘이라고도 부릅니다
대표적인 해시 알고리즘으로는 MD4(Message Digest 4), MD5(Message Digest 5), SHA(Secure Hash Algorithm)-1등이 있습니다. MD4나 MD5의 경우 해시 값으로 128비트를 사용하며, SHA-1의 경우 160비트를 사용합니다

출 처 : 
http://blog.naver.com/jsj29?Redirect=Log&logNo=70002633255

FXS는 'Foreign Exchange Station'의 약자로서 기존 장비인 PBX나 키폰 시스템의 Station 포트 역할을 수행한다. 한 마디로 전화기나 팩스 같은 전화선을 이용하는 장비를 붙이는 포트라고 생각하면 된다.
FXS 포트는 -48V의 DC 전원을 케이블을 통해 자기에서 붙은 전화기나  팩스 등에 제공한다. 또한 FXS 포트는 아날로그 신호를 디지털로 변환하는 A/D 컨버젼도 수행한다.

FXO는 'Foreign Exchange Office'의 약자로서 전화기를 에뮬레이션한다. 따라서 FXO 포트와 연결된 상대 디바이스는 자신의 스위치 포트(FXS)에 전화기가 연결되어 있다고 생각한다. 그러므로 FXO 포트는 자기가 마치 전화기인 것처럼 On-Hook과 Off-Hook 시그널을 보낸다. 여기서 Oh-Hook은 수화기를 내려놓았을 때를 말하고, Off-Hook은 수화기를 들었을 때를 말한다.

FXO 프토는 전화기처럼 동작하기 때문에 스위치에서 Ringing 시그널을 보내면, 자기는 마치 전화를 받는 것처럼 Off-Hook 시그널을 보낸다.



[work_struct]
워크큐는 인터럽트가 disable되지 않는다. 여러개를 큐에 넣어도 이미 큐에 있다면 무시된다.

 

#define INIT_WORK(_work, _func)
워크큐를 초기화한다.

 

int schedule_work(struct work_struct *work)
작업을 kernel-global 워크큐에 넣는다. 이미 들어있으면 그대로 둔다.

 


[tasklet_struct]
태스크릿은 인터럽트가 disable된다. 여러개를 큐에 넣어도 이미 큐에 있다면 무시된다.

 

void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
태스크릿을 초기화한다.

 

void tasklet_schedule(struct tasklet_struct *t)
태스크릿을 큐에 넣는다.

 

void tasklet_kill(struct tasklet_struct *t);
태스크릿이 큐에 있으면 즉시 처리(실행)한다.

 

void tasklet_enable(struct tasklet_struct *t)
태스크릿을 활성화한다.

 

void tasklet_disable(struct tasklet_struct *t)
태스크릿을 비활성화한다.

음성 신호를 디지털 부호화하는 펄스 부호 변조(PCM) 기술에서의 처리 과정 법칙의 하나. PCM에서 양자화 잡음의 영향을 되도록 적게 하기 위해 송신 측에서는 신호를 압축하고 수신 측에서는 역으로 신장한다. 압축·신장 방법에는 A 법칙과 m법칙의 2가지가 있다. 북아메리카 및 일본 등에서는m법칙을, 유럽에서는 A 법칙을 채용하고 있다.

출처 : 네이버 용어사전

Calling Identification Display(Call ID)

발신자번호표시(CID) 서비스란 발신자의 전화번호 및 이름을 착신가입자의 표시단말장치에 표시하여주는 서비스이다. CID 서비스를 통하여 상대방의 이름과 전화번호를 알 수 있어서 장난, 음란전화 및 폭력전화의 방지나 부재중 걸려온 전화 등을 확인할 수 있다. 

자동 전화번호 확인(Automatic Number Identification: ANI)기능에서 확장된 이 서비스는 1987년 미국의 벨사가 상용화한 이래 세계 50여개국에서 사용되고 있다.

국내에선 통신비밀보호법때문에 도입되지 않다가 1985년부터 심사를 한 뒤 발신번호만 확인해줘왔다. 

그러나 통신비밀보호법상 전화폭력 협박 희롱의 경우에만 발신인의 전화번호를 수신인에게 제공토록 제한했기 때문에, 이 서비스를 받으려면 피해사실 입증자료를 제출해야 하는데다 일단 전화를 받아야 하는 불편함이 있어 이용이 어려웠다.

그러나 2000년 말 모든 발신번호를 수신자가 바로 확인할 수 있도록 하는 근거 조항을 넣은 전기통신사업법이 통과되어 발신자정보표시 서비스가 가능하게 되었다. 이동통신전화의 경우에도 발신자번호표시(CID)가 실시되고 있다.

출처 : 네이버 용어 사전



리눅스 터미널을 열었는데

쉘 프롬프트 모양이

 

bash-3.1#

 

이런식으로 나와 있을 경우가 있습니다.

이런경우 현재 디렉토리 위치도 모를뿐더러 현재 user가 누군지도 모릅니다.

 

vi .bashrc 를 열어서

export PS1="[\u@\h \W]\$"  를 추가해줍니다.

 

source .bashrc를 통해 bashrc를 다시 읽습니다.

 

 

옵션)

\t 현재 시간을 HH:MM:SS 형식으로 보여준다.
\d 날자를 "요일 월 일" 형식으로 보여준다. Tue Jan 23
\s 쉘의 이름을 보여준다.
\w 현재 작업디렉토리를 완전경로로 보여준다.
\W 현재 작업디렉토리의 이름을 보여준다.
\u 현재 사용자의 사용자명
\h 호스트만
\H 호스트이름전체
\# 현재 명령의 명령 번호
\$ root이면 #, 일반사용자이면 $
\! 이 명령의 히스토리 번호
\nnn 8진수 nnn에 해당하는 문자
\[ 비출력문자의 시퀀스를 시작한다.
\] 비출력문자의 시퀀스를 마친다.

 

 

참고)

- Ubuntu 기본 프롬프트
PS1="${debian_chroot:+($debian_chroot)}\u@\h:\w\$" 
 
- CentOS 기본 프롬프트
PS1="[\u@\h \W]\$"

하드웨어 상태를 주기적으로 감시할때 정해진 시간이 초과되면 특정 함수를 수행하는 기능을 한다. 리눅스 커널은 타이머 인터럽트가 발생하며 스케줄링에 필요한 처리를 끝낸 후 커널 타이머 목록이라는 데이터 구조를 검사하며, 이 커널 타이머 목록은 수행할 함수와 처리되어야 할 시간에 대한 정보가 담긴 연결 리스트이다.

커널 타이머 이용시

struct timer_list : 커널 타이머 구조체
init_timer(): 커널 타이머 구초제를 초기화 한다
add_timer(): 커널 타이머에 수행될 함수를 등록한다
del_timer(): 커널 타이머 목록에서 등록된 것을 제거한다.

커널 타이머는 동작 시간이 1/Hz 단위로 1/Hz초 이하의 호출 주기는 사용이 불가능 하다

다음은 커널 2.6 버젼에서의 타이머 동작이다.


struct time_list 변수는 
1. unsigned long expires, 2 unsigned long data, void (*function)(unsigned long)을 일반적으로 지정하여 사용한다.
1. unsigned long expires 는 다음과 같이 초기화 한다
 kerneltime.expires=get_jiffies_64()+(3*HZ/10);
 (현재 jiffies값을 얻어서 0.03초가 지난후로 설정)
2. unsigned long data 는 timer 함수에 전달할 데이터를 참조하기 위한 주소를 리턴한다.
3. void (*function)(unsigned long)는 타이머 시간이 만료하고 수행할 함수이다.

init_timer는 timer 구조체를 초기화 한다. 앞에서 설명한 expires,data,function 필드를 초기화 한다.

add_timer는 커널 타이머에 호출될 timer_list 구조체를 등록한다.

del_timer는 커널 타이머를 제거한다. 일반적으로 커널 타이머가 등록되고 시간이 초과하여 커널 타이머에 등록된 함수가 호출되면 등록된 커널 타이머는 자동적으로 제거된다. 하지만 디바이스 드라이버는 등록된 커널 타이머가 확실하게 후출되어 제거될 것이라는 확신이 있더라도 모듈 형식으로 디바이스 드라이버를 작성할 경우 디바이스 드라이버의 종료 루틴에 del_timer() 함수를 호출하여 모듈이 제거 되었을때 제거된 번지에 속해 있던 함수가 호출되지 않도록 하여야 한다.

커널 타이머 예
1초마다 메시지를 출력한다
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/time.h>
#include <linux/timer.h>
#define   TIME_STEP                       (1*HZ)
struct timer_list  *timer;
static int timertick=0;
void kerneltimer_timeover(unsigned long arg ); <--Timerover 시 실행할 함수
void kerneltimer_registertimer(struct timer_list* ptimer, unsigned long timeover )
{
     init_timer( ptimer );
     ptimer->expires  = get_jiffies_64() + timeover;
     ptimer->data     = NULL;
     ptimer->function = kerneltimer_timeover       ;

     add_timer( ptimer);
}
void kerneltimer_timeover(unsigned long arg )
{
        printk("I am timer tick:%d\n",timertick);
        timertick++;
        kerneltimer_registertimer( timer, TIME_STEP ); <--timerover 하면 재 등록
}
int kerneltimer_init(void)
{
    timer= kmalloc( sizeof( struct timer_list ), GFP_KERNEL );
    if( timer== NULL ) return -ENOMEM;
    memset( timer, 0, sizeof( struct timer_list) );
    kerneltimer_registertimer( timer,TIME_STEP );
    return 0;
}
void kerneltimer_exit(void)
{
    if( timer!= NULL )
    {
        del_timer( timer) ;
        kfree( timer);
    }
}
module_init(kerneltimer_init);
module_exit(kerneltimer_exit);
MODULE_LICENSE("Dual BSD/GPL");



+ Recent posts