* 메모리 맵 - mmap() <파일 혹은 디바이스를 메모리와 대응>

; 파일(리눅스에서는 디바이스도 파일로 처리하므로 디바이스도 메모리 맵으로 연결 가능)을 처리하기 위해서는 보통 저수준으로는 파일 디스크립터를 이용하고, 고수준으로 접근하기 위해서는 파일 구조체 포인터를 이용하여 접근하게 된다. 하지만 이런 방식을 이용하면 버퍼를 거쳐서 실제 입출력을 하게된다. 하지만 mmap()을 이용하여 메모리 맵 방식으로 파일을 연결하게 되면 버퍼를 이용하는 것이 아니라 '페이지(page)'를 이용하여 데이터 처리가 가능해진다. 상대적으로 크기가 작은 버퍼에 비해 보통 4KB의 크기를 가지는 페이지를 이용하면 처리 가능한 크기와 처리 속도가 향상된다. 그렇기 때문에 데이터 크기가 크거나 빠른 처리를 해야하는 경우 메모리 맵 방식을 종종 사용하게된다. 메모리 맵을 사용하면 처리 속도가 빨라지는 예가 바로 처리하는 데이터가 큰 동영상을 볼 때이다. 그리고 실제 실행 파일도 윈도우든 리눅스든 실행 할 때 페이지로 분할되므로 메모리 맵 방식으로 매핑된다. 대표적으로 코드 영역은 데이터의 변경이 없기 때문에 메모리 맵을 이용해 맵핑하면 처리 속도는 물론이고 메모리 낭비도 없다. 

 

 

* 특징

1. 생성된 메모리 맵을 포인터를 이용하여 쉽게 사용 가능하다.

2. 파일로 연결하여 사용시 메모리-파일 사이의 동기화가 편하다.

3. IPC(프로세스간 통신)로 활용 가능하다.

4. 대용량의 데이터를 사용할 시 성능이 향상된다.

 

* 주의점

- 메모리 맵은 바로 파일의 처리하는게 아니라 가상 메모리로 활용되는 페이지에 맵핑하는 방식이다. 그러므로 파일과 해당 메모리 맵이 된 페이지가 다른 공간이다. 그러므로 커널에 의해 여유 시간에 동기화(둘의 데이터가 같아지는..)가 될 때까지 서로 다른 데이터를 가질 수 있다. 그러므로 동기화에 대한 주의를 할 필요가 있다. <개발자가 직접 커널에 동기화를 명령 할 수 있는 함수도 있다. - fsync()>

 IPC로 사용 할 때에도 프로세스간 동기화에 대한 주의도 필요하다.

 

* 2가지 방식

1. 공유 메모리 맵 방식 (Shred Memory-Map)

메모리 맵 변경 시 원본 파일과 데이터가 동기화가 되는 방식

2. 복사 메모리 맵 방식 (Private Memory-Map)

처음 메모리 맵에 매핑 될때 파일의 내용을 읽어와서 복사하고 그 이후 동기화 하지 않는 방식.

 

 

* 메모리 맵 생성 함수 - mmap()

 

void* mmap(void *state, size_t length, int prot, int flags, int fd, ott_t offset);

 

- void *state

; 할당받기 원하는 메모리 주소. 보통 0을 써서 커널이 적합한 공간을 임의로 할당해 주소를 받을 수 있고, 직접 입력하여 사용해도된다. 하지만 직접 입력하는 경우 해당 시스템의 페이지 (배수)단위로 주소 값을 설정해줘야 한다.

 

- size_t length

; 메모리 맵을 할 크기. 바이트 단위로 설정한다.

 

- int prot

; 메모리 보호 메커니즘. 플래그 형식이므로 비트 연산으로 복수 속성으로 지정 가능하다.

 + PROT_EXEC; 해당 페이지 실행 가능.

 + PROT_READ; 해당 페이지 읽기 가능.

 + PROT_WRITE; 해당 페이지 쓰기 가능.

 + PROT_NONE; 해당 페이지 접근 불가.

 => 매핑할 파일 디스크립터와 속성이 같아야한다.

 

- int flags

 + MAP_SHARED; 공유 메모리 맵 방식.

 + MAP_PRIVATE; 복사 메모리 맵 방식.

 + MAP_FIXED ; 메모리 시작 번지 지정시 사용.

 =>MAP_SHARED/MAP_PRIVATE 둘 중에 한개만 지정해야된다.

 

- int fd

 ; 메모리 맵 방식을 사용할 파일 디스크립터.(파일 혹은 디바이스)

 

- ott_t offset

 ; 해당 파일 디스크립터에서 메모리 맵을 시작할 오프셋 값.

 

 

+ return value

; 메모리 맵핑이 이루어진 가상 메모리 주소. 실패시 MAP_FAILED가 발생하고 errno에 해당 상황에 대한 값이 설정된다.

 

 

* 메모리 맵 해제 - munmap()

; 메모리 맵을 사용하고 자원을 해제 할 때 사용한다.

 

int munmap(void *start, size_t length);

 

- void *start

; 메모리 맵핑이 시작된 주소. mmap()의 반환 값을 넣으면된다.

 

- size_t length

; 메모리 맵을 한 길이. mmap() 사용시 size_t length 인자와 크기를 주면된다.

 

+ return value

;성공 0, 실패 -1

 

 

* 메모리 맵과 파일의 동기화 - fsync()

; 메모리 맵에 데이터를 갱신해도 바로 파일과 동기화가 이루어지는 것은 아니다. 커널이 여유 있을 때 동기화를 수행한다. 그러므로 개발자가 직접 동기화를 보장하고 싶을 때 사용한다. 그리고 munmap()을 하여 메모리 맵을 해제 할때에도 동기화를 해주면 데이터가 보장된다.

 

int msync(void *start, size_t length, int flags);

 

- void *start

; mmap()를 통해 리턴 받은 메모리 맵의 시작 주소.

 

-  size_t length

; 동기화를 할 길이. 시작 주소로 부터 길이를 지정하면 된다.

 

- int flags

 + MS_ASYNC

 ; 비동기 방식. 동기화(Memory->File)하라는 명령만 내리고 결과에 관계 없이 바로 리턴.

   그렇기 때문에 동기화가 된 건지 알수 없다.

 + MS_SYNC

 ; 동기 방식. 동기화(Memory->File)가 될때까지 블럭 상태로 대기한다.

 + MS_INVALIDATE

 ; 현재 메모리 맵을 무효화하고 파일의 데이터로 갱신. 즉 File->Memory

 

 

===================================================================================

       ...

#define MMAP_FULENAME "test_mmap"

#define MMAP_SIZE 64

       ...

int main()

{

     int fd;

     char *p_mmap;      //메모리 맵으로 사용할 데이터 타입

       ...

     fd = open(MMAP_FILENAME, O_RDWR|O_CREAT, 0664);

       ...

     p_mmap = (char*)mmap((void*)0, MMAP_SIZE, PROT_READ|PROT_WRITE,

                                                                     MAP_SHARED, fd, 0);

     //공유 메모리 방식을 사용한다. 읽기/쓰기 가능

       ...

     //memcpy(); 등으로 메모리 맵 데이터 갱신.

       ...

     msync(p_mmap, MAP_SIZE, MS_SYNC);

       ...

     munmap(p_mmap);

     return 0;

}

  

=> 메모리 맵 할 파일 이름만 같으면 IPC도 된다.


출 처 : http://no1rogue.blog.me/30097158983

전화선상 음성 : 4 KHz

샘플링은 최소 8 KHz

1 초에 8000 개의 샘플 / 한 샘플당 8 bit

8000 * 8 bit => 64000 bit  1초당    : 64 Kbps

T1 (24채널)   : 1.544 Mbps급
E1 (32채널)   : 2.048 Mbps급

//////////////////////////////////////////////////////////////////////////////////////

인코딩 타임 : 특정 코덱을 사용해서 아날로그 음성을 디지털 시그널로 변환하는데 걸리는 시간

DSP 칩에서 하나의 음성 프레임 output을 내보내는데 걸리는 처리 시간

G.711    PCM    64 Kbps    10ms    4.1
G.729    CS-ACELP    8 Kbps    10ms    3.9


G.711 경우 디폴트 페이로드 사이즈 : 160 byte
G.711 코덱은 10ms마다 아날로그 상태인 음성을 디지털로 바꾼다.
즉, DSP를 통해서 음성 output 샘플이 10 ms마다 생김
패킷을 구성할 때는 이러한 output 2개를 모은다.

G.711    64 Kbps
초당 64,000 bit // 초당 8,000 byte

1000 ms 당  8,000 byte  =>  10 ms 당 80 byte / 20 ms 당 160 byte

///////////////////////////////////////////////////////////////////////////////////////////

IP 네트워크를 통해 음성 프레임을 전달하려면
RTP, UDP, IP 헤더가 필요.. 각각

RTP 헤더 12 byte +
UDP 헤더 8 byte +
IP 헤더 20 byte +
Ethernet 헤더 18 byte   => 58 byte

이러한 패킷화 타임 20 ms  => 초당 50회 발생

58 byte * 8 = 464 bit
464 bit * 50번 = 23.2 Kbps

즉, 헤더 23.2 Kbps / 페이로드 64 Kbps
G.711 경우 한 통화당 필요한 대역폭은 

23.2 Kbps + 64 Kbps = 87.2 Kbps

워드에서 문서구조로 편히 목차를 확인할려고

 

종종 다단계 번호매기기를 즐겨 쓴다.

 

근데 매번 양식 만들 때마다 한두개씩 기능이 가물가물해서 10~20분씩 삽질하니...

 

더이상은 귀찮다. 정리해 두자.

 

설명은 MS Office Word 2007 버전을 기준으로 한다.

 

 

1. 새문서 열기

 

2. 스타일 목록(1)을 활성화 시키고 새스타일(2)을 클릭

 

3-1. 스타일 목록에 표시될 이름(1)을 입력하고,

3-2. 스타일형식(2)은 '단락'으로 유지

3-3. 스타일기준(3)은 '제목1'로 변경

3-4. 다음 단락의 스타일(4)은 '표준'으로

3-5. 확인(5)을 누르고 '1순위제목'이라는 스타일을 완성

3-6. 3-1~3-6의 과정처럼 '2순위제목'과 '3순위제목'도 만든다. 스타일기준(3) 각각 다르니 유의.

 

4-1. 다시 새스타일을 클릭하고,

4-2. 이름(1)을 입력하고,

4-3. 스타일형식을 '목록'(2)으로 선택

 

5-1. 서식적용대상(1)을 '수준1'을 선택하고,

5-2. 글꼴들(2)을 조정한다.

5-3. 단계가 3단계였으니 나머지 '수준2'와 '수준3'도 서식적용대상(1)에서 선택하여 마찬가지로 글꼴을 조정.

 

6-1. 서식(1)을 클릭하고,

6-2. 번호매기기(2)를 선택.

 

7-1. 자세히(1)를 클릭하여 옵션목록을 확장.

 

8-1. 수준(1)에서 '수준1' 선택하고

8-2. 번호서식(2)을 조정해 준다.

8-3. 그리고 단계에 연결할 스타일(3)에 먼저 만들었던 '1순위제목'을 선택하여 연결

8-4. 8-1~8-3의 과정처럼 '수준2'에 '2순위제목'을, '수준3'에 '3순위제목'을 입력해준다.

8-5. 마지막으로 창 모두 확인(4)을 클릭하여 스타일을 저장.

 

9. 목록에서 생긴 스타일을 확인할 수 있다. 적용해서 사용하면 끝.

  


출처 : http://blog.naver.com/undeaders?Redirect=Log&logNo=70031213013

3.2.1.  Registers

The 64-bit PowerPC Architecture provides 32 general purpose registers,
each 64 bits wide.  In addition, the architecture provides 32
floating-point registers, each 64 bits wide, and several special
purpose registers.  All of the integer, special purpose, and
floating-point registers are global to all functions in a running
program.  The following table shows how the registers are used.

r0        Volatile register used in function prologs
r1        Stack frame pointer
r2        TOC pointer
r3        Volatile parameter and return value register
r4-r10    Volatile registers used for function parameters
r11       Volatile register used in calls by pointer and as an
          environment pointer for languages which require one
r12       Volatile register used for exception handling and glink code
r13       Reserved for use as system thread ID
r14-r31   Nonvolatile registers used for local variables

f0        Volatile scratch register
f1-f4     Volatile floating point parameter and return value registers
f5-f13    Volatile floating point parameter registers
f14-f31   Nonvolatile registers

LR        Link register (volatile)
CTR       Loop counter register (volatile)
XER       Fixed point exception register (volatile)
FPSCR     Floating point status and control register (volatile)

CR0-CR1   Volatile condition code register fields
CR2-CR4   Nonvolatile condition code register fields
CR5-CR7   Volatile condition code register fields

On processors with the VMX feature.

v0-v1     Volatile scratch registers
v2-v13    Volatile vector parameters registers
v14-v19   Volatile scratch registers
v20-v31   Non-volatile registers
vrsave    Non-volatile 32-bit register

mtsprg 0, rs mtspr 272, rs yes SPRG0
mtsprg 1, rs mtspr 273, rs yes SPRG1
mtsprg 2, rs mtspr 274, rs yes SPRG2
mtsprg 3, rs mtspr 275, rs yes SPRG3

출처 : http://publib.boulder.ibm.com/infocenter/aix/v6r1/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/moving_special_reg.htm

이진 탐색 트리(Binary Search Tree)는 자료의 검색이 주된 기능을 가진 이진 트리 이다,이진 탐색 트리는 효율적인 자료 검색을 목적으로 기존 이진 트리에 몇 가지 제약 사항을 추가한 트리를 말한다이진 탐색 트리는 특정 키 값에 해당하는 노드를 신속하게 찾는 것이 기본적인 기능이다이러한 탐색은 실생활에서 많이 사용 되는데 전화번호부에서 전화번호 찾기나 주민등록번호로 사람을 찾기 등 많이 사용되고 있다.

 

이진 트리 중 다음과 같은 특성을 만족해야 이진 탐색 트리가 될 수 있다.

1.     트리의 모든 노드는 유일한 키를 가진다.

2.     왼쪽 서브 트리에 있는 모든 노드의 키는 루트의 키보다 작다.

3.     오른쪽 서브 트리에 있는 모든 노드의 키는 루트의 키보다 크다.

4.     왼쪽 서브 트리와 오른쪽 서브 트리도 모두 이진 탐색 트리이다.



위 트리는 이진 탐색 트리의 특성을 모두 가지고 있다루트 노드의 왼쪽 서브 트리의 모든 값은 루트 노드의 값보다 작고오른쪽 서브 트리 값은 모두 크다또 각 노드의 값들은 모두 고유한 값을 가지고 있으며 서브 트리들도 이진 탐색 트리의 특성을 모두 가지고 있다.


출처 : http://blog.naver.com/songsmir?Redirect=Log&logNo=100117234824

Below, the instruction set for the PowerPC architecture is given. A lot of instructions were intentionally left out:

  • Instructions for 64-bit Implementations Only
  • Floating Point Instructions
  • Supervisor-Level Instructions
  • I/O-specific Instructions
  • Instructions for Multiprocessor Support
  • Trap / System Call Instructions

This leaves 107 instructions: the core PowerPC Instruction Set.

When following the links below, you will be taken to a page describing a (family of) instructions. Note that these descriptions are taken from the 64-bit version of the instruction set; bit numbering are different for some instructions on 32-bit implementations. The lab course software uses a 32-bit PowerPC emulator.

The mnemonics column shows all valid forms of an instruction; it also shows simplified mnemonics in italics.

InstructionMnemonicsDescription
add add / add. / addo / addo. Add
addc addc / addc. / addco /addco. Add Carrying
adde adde / adde. / addeo /addeo. Add Extended
addi addi / li / la / subi Add Immediate
addic addic / subic Add Immediate Carrying
addic. addic. / subic. Add Immediate Carrying and Record
addis addis / lis / subis Add Immediate Shifted
addme addme / addme. / addmeo / addmeo. Add to Minus One Extended
addze addze / addze. / addzeo / addzeo. Add to Zero Extended
and and / and. AND
andc andc / andc. AND with Complement
andi. andi. AND Immediate
andis. andis. AND Immediate Shifted
b b / ba / bl / bla Branch
bc bc /bca / bcl bcla Branch Conditional
bcctr bcctr / bcctrl Branch Conditional to Count Register
bclr bclr / bclrl Branch Conditional to Link Register
cmp cmp / cmpw Compare
cmpi cmpi / cmpwi Compare Immediate
cmpl cmpl / cmplw Compare Logical
cmpli cmpli / cmplwi Compare Logical Immediate
cntlzw cntlzw / cntlzw. Count Leading Zeros Word
crand crand Condition Register AND
crandc crandc Condition Register AND with Complement
creqv creqv / crset Condition Register Equivalent
crnand crnand Condition Register NAND
crnor crnor / crnot Condition Register NOR
cror cror / crmove Condition Register OR
crorc crorc Condition Register OR with Complement
crxor crxor / crclr Condition Register XOR
divw divw / divw. / divwo / divwo. Divide Word
divwu divwu / divwu. / divwuo / divwuo. Divide Word Unsigned
eqv eqv / eqv. Equivalent
extsb extsb / extsb. Extend Sign Byte
extsh extsh / extsh. Extend Sign Half Word
lbz lbz Load Byte and Zero
lbzu lbzu Load Byte and Zero with Update
lbzux lbzux Load Byte and Zero with Update Indexed
lbzx lbzx Load Byte and Zero Indexed
lha lha Load Half Word Algebraic
lhau lhau Load Half Word Algebraic with Update
lhaux lhaux Load Half Word Algebraic with Update Indexed
lhax lhax Load Half Word Algebraic Indexed
lhbrx lhbrx Load Half Word Byte-Reverse Indexed
lhz lhz Load Half Word and Zero
lhzu lhzu Load Half Word and Zero with Update
lhzux lhzux Load Half Word and Zero with Update Indexed
lhzx lhzx Load Half Word and Zero Indexed
lmw lmw Load Multiple Word
lswi lswi Load String Word Immediate
lswx lswx Load String Word Indexed
lwbrx lwbrx Load Word Byte-Reversed Indexed
lwz lwz Load Word and Zero
lwzu lwzu Load Word and Zero with Update
lwzux lwzux Load Word and Zero with Update Indexed
lwzx lwzx Load Word and Zero Indexed
mcrf mcrf Move Condition Regisiter Field
mcrxr mcrxr Move to Condition Register from XER
mfcr mfcr Move from Condition Register
mfspr mfspr / mfxer / mflr / mfctr Move from Special-Purpose Register
mftb mftb Move from Time Base
mtcrf mtcrf Move to Condition Register Fields
mtspr mtspr / mtxer / mtlr / mtctr Move to Special-Purpose Register
mulhw mulhw / mulhw. Multiply High Word
mulhwu mulhwu / mulhwu. Multiply High Word Unsigned
mulli mulli Multiply Low Immediate
mullw mullw / mullw. / mullwo / mullwo. Multiply Low Word
nand nand / nand. NAND
neg neg / neg. / nego / nego. Negate
nor nor /nor. NOR
or or / or. OR
orc orc / orc. OR with Complement
ori ori OR Immediate
oris oris OR Immediate Shifted
rlwimi rlwimi / rlwimi. / inslwi / insrwi Rotate Left Word Immediate then Mask Insert
rlwinm rlwinm / rlwinm. / extlwi / extrwi
rotlwi / rotrwi / slwi / srwi
clrlwi / clrrwi / clrlslwi
Rotate Left Word Immediate then AND with Mask
rlwnm rlwnm / rlwnm. / rotlw Rotate Left Word then AND with Mask
slw slw / slw. Shift Left Word
sraw sraw /sraw. Shift Right Algebraic Word
srawi srawi / srawi. Shift Right Algebraic Word Immediate
srw srw / srw. Shift Right Word
stb stb Store Byte
stbu stbu Store Byte with Update
stbux stbux Store Byte with Update Indexed
stbx stbx Store Byte Indexed
sth sth Store Half Word
sthbrx sthbrx Store Half Word Byte-Reverse Indexed
sthu sthu Store Half Word with Update
sthux sthux Store Half Word with Update Indexed
sthx sthx Store Half Word Indexed
stmw stmw Store Multiple Word
stswi stswi Store String Word Immediate
stswx stswx Store String Word Indexed
stw stw Store Word
stwbrx stwbrx Store Word Byte-Reverse Indexed
stwu stwu Store Word with Update
stwux stwux Store Word with Update Indexed
stwx stwx Store Word Indexed
subf subf / subf. / subfo / subfo. / sub Subtract From
subfc subfc / subfc. / subfco / subfco. / subc Subtract from Carrying
subfe subfe / subfe. / subfeo. / subfeo. Subtrect from Extended
subfic subfic Subtract from Immediate Carrying
subfme subfme / subfme. / subfmeo / subfmeo. Subtract from Minus One Extended
subfze subfze / subfze. / subfzeo / subfzeo. Subtract from Zero Extended
xor xor / xor. XOR
xori xori XOR Immediate
xoris xoris XOR Immediate Shifted

출 처 : http://pds.twi.tudelft.nl/vakken/in1200/labcourse/instruction-set/

출처 : http://kldp.org/node/52160

 

svn diff a.c 
를 하면 vimdiff로 바로 보이게 하려면.

 

1. 적당한 디렉토리에 vimdiff.sh를 만들고 PATH를 걸어준다
$ more ~/bin/vimdiff.sh
#!/bin/sh
while test $# -gt 2; do shift; done
vimdiff $@


2. vimdiff.sh를 실행 가능으로 만든다.

$ chmod a+x ~/bin/vimdiff.sh

 

3. svn 설정 파일에 diff-cmd 값을 지정한다.

$ cat ~/.subversion/config | grep diff-cmd
diff-cmd = vimdiff.sh

이번에 컴퓨터를 업그레이드 하고 안드로이드 개발 환경을 다시 구축하는 도중, eclipse에 ADT 플러그인이 제대로 설치되지 않는 문제가 발생하였다. 그래서 eclipse 버젼도 바꿔보고, 수동으로 ADT 플러그인을 내려 받아서 설치도 해보았지만 제대로 진행이 되지 않았다.

정확한 error 메시지는 기억이 나지 않는다.
"The operation cannot be completed. See the details.: 였던 것 같다.

윈도우즈 임시 폴더를 임의로 다른 파티션으로 잡아 놓았었는데, 이걸 다시 C:\ 바꿔서 잡아주니 설치가 되는 것이였다.
현재 내 환경은 windows7 untimate k 64비트 sp1 버젼이다.

kernel 2.4 이후 부터는 initrd를 apio로 압축하기 때문에 

kernel 2.6에서 initrd를 mount 하기 위해서는 아래와 같은 순서로 하면 된다.

>> mkdir initrd_mount
>> cd ./initrd_mount
>> cp /boot/initrd-xxx.img initrd.img.gz
>> gzip -d ./initrd.img.gz
>> mkdir mnt
>> cp initrd.img ./mnt/
>> cd ./mnt
>> cpio -idmv < initrd.img

위와 같은 순서로 실행하면 mnt밑에 initrd.img가 압축 해제되있다.

+ Recent posts