728x90

3. Memory mapped I/O
 

#include <sys/mman.h>

void * mmap(void* addr,//힌트일 뿐이며 보통 NULL을 넘긴다.

size_t len,

int prot,//접근권한

int flags,//추가적인 동작 방식

int fd,//대상

off_t offset);//시작위치

prot 옵션

PROT_NONE 권한없음

PROT_READ 읽기 가능한 페이지

PROT_WRITE 쓰기 가능한 페이지

PROT_EXEC 실행 가능한 페이지

flags 옵션

MAP_FIXED addr을 요구사항으로 취급하다록 지시. 해당주소에 mapping하지 못하면 호출실패

프로세스 주소공간에 대한 상세한 지식을 요구, 호환성이 떨어짐.

MAP_PRIVATE mapping을 공유하지 않음. 파일은 write후 복사로 mapping되며 변경된 메모리 속성은 실제 파일이나 다른 프로세스의 map에는 반영되지 않는다.

MAP_SHARED 동일파일을 mapping한 모든 프로세스들이 mapping을 공유.

read시 다른 프로세스가 write한 내용도 반영

mapping은 page단위로 구성됨 -> addr과 offset은 반드시 page size의 정수배가 되어야 함

ex)

void *p;

p = mmap (0, len, PROT_READ, MAP_SHARED, fd, 0);

if(p == MAP_FAILED) //ERROR

#include <unistd.h>

long sysconf(int name); // page size를 얻기위한 표준 method(POSIX)

int getpagesize(void); // page size를 얻기위한 표준 method(linux)

<asm/page.h>

PAGE_SIZE //정의된 정적 매크로, 실행시점이 아니라 컴파일 시점에서

시스템 페이지 크기를 조회

#include <sys/mman.h>

int munmap (void *addr, size_t len);

mmap()으로 만들어진 mapping 제거

ex)

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcn시.h>

#include <unistd.h>

#include <sys/mman.h>

struct stat sb;

off_t len;

char *p;

int fd;

fd = open (filename, O_RDONLY);

if(fstat(fd, &sb) == -1) // ERROR

if(!S_ISREG (sb.st_mode)) //ERROR

p = mmap (0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);

if(p == MAP_FAILED) //ERROR

if(close (fd) == -1)//ERROR

for(len = 0; len < sb.st_size; len++)

putchar(p[len]);

if(munmap(p, sb.st_size) == -1) //ERROR



장점

- 사용이 편리(다른 작업없이 메모리에 접근하기만 하면 된다. 포인터로 접근)

- 메모리 절약(추가적인 버퍼 메모리가 필요 없다.)

- 속도가 빠르다. (파일이 클수록, OS영역에 캐싱되어 있을수록 속도차이가 난다.)

- 다중 프로세스가 동일 객체를 메모리에 mapping할 때, 모든 프로세스가 자료를 공유한다

단점

- memory와 I/O가 주소공간을 공유(사용 가능한 주소 공간이 제한됨)

- page size의 정수배만 가능하다.(여분의 공간이 낭비됨)

- 연속적인 공간이 있어야 하므로 크기가 다른 mapping이 많으면 단편화 때문에 적당한 공간을 찾지 못할 수도 있다.(32bit일때. 64bit 주소공간에서는 크게 문제되지 않는다)

추가

- 파일이 모두 메모리에 올라오는 것이 아니라 메모리 access시 메모리를 할당해주고 I/O가 발생
 

mmap size 조정 // 리눅스 전용

#define _GNU_SOURCE

#include <unistd.h>

#include <sys/mman.h>

void * mremap (void *addr, size_t old_size,

size_t new_size, unsigned long flags);

접근 권한 변경

#include <sys/mman.h>

int mprotect (const void *addr, size_t len, int prot);

성공하면 0을 return.

mapping으로 파일 동기화 // fsync()와 유사

#incldue <sys/mman.h>

int msync (void *addr, size_t len, int flags);

flags 설정(OR연산 가능)

MS_ASYNC 동기화가 비동기식으로 일어나야 함

MS_INVALIDATE 캐시된 복사본이 유효하지 않음을 명세, 향후 이 파일의 map에 접근할 경우 새롭게 동기화된 디스크 내용을 반영

MS_SYNC 동기화가 동기식으로 일어나야 함,

msync() 호출은 모든 페이지를 드스크에 다시 쓰기 전까지 결과를 반환하지 않음.


madvise

memorymap에 포함된 page와 관련된 동작방식을 조언. 리눅스 커널은 기본적으로 동적으로 동작방식을 조율하며 성능을 최적화하지만 madvise는 부하상황에서 바람직한 캐시와 미리읽기 동작방식을 보장한다.

#include <sys/mman.h>

int madvise (void *addr, size_t len, int advice);

advice 설정(POSIX에서 정의한 의미)

MADV_NORMAL 특별한 조언을 하지 않는다.

MADV_RANDOM page에 random 순서로 접근하려고 함

MADV_SEQUENTIAL 낮은 주소에서 높은 주소의 순서대로 페이지 접근

MADV_WILLNEED 당분간은 지정된 영역에 있는 페이지에 접근하려고 함

MADV_DONTNEED 당분간은 지정된 영역에 있는 페이지에 접근하지 않음

advice 옵션(linux 2.6 kernel에서의 동작)

MADV_NORMAL 커널이 적절히 미리읽기 작업을 수행(평상시와 동일)

MADV_RANDOM 커널이 미리읽기를 비활성화함, 매번 물리적인 연산이 일어날 때마다 최소 자료만 읽음

MADV_SEQUENTIAL 커널이 공격적인(적극적인) 미리읽기 작업을 수행

MADV_WILLNEED 커널이 미리읽기 작업을 시작해서 페이지를 메모리로 읽어 들인다.

MADV_DONTNEED 커널이 페이지와 관련된 자원을 해제하고, 변경되었지만 아직 동기화되지 않은 페이지는 버린다. 이후 mapping된 자료에 대한 접근이 있으면 파일에서 페이지를 읽어들인다.

728x90
728x90

명  령  어

설                                               명

Data Transfer

MOV

Move

데이터 이동 (전송)

PUSH

Push

오퍼랜드의 내용을 스택에 쌓는다

POP

Pop

스택으로부터 값을 뽑아낸다.

XCHG

Exchange Register/memory with Register

첫 번째 오퍼랜드와 두 번째 오퍼랜드 교환

IN

Input from AL/AX to Fixed port

오퍼랜드로 지시된 포트로부터 AX에 데이터 입력

OUT

Output from AL/AX to Fixed port

오퍼랜드가 지시한 포트로 AX의 데이터 출력

XLAT

Translate byte to AL

BX:AL이 지시한 데이블의 내용을 AL로 로드

LEA

Load Effective Address to Register

메모리의 오프셋값을 레지스터로 로드

LDS

Load Pointer to DS

REG←(MEM), DS←(MEM+2)

LES

Load Pointer ti ES

REG←(MEM), ES←(MEM+2)

LAHF

Load AH with Flags

플래그의 내용을 AH의 특정 비트로 로드

SAHF

Store AH into Flags

AH의 특정 비트가 플래그 레지스터로 전송

PUSHF

Push Flags

플래그 레지스터의 내용을 스택에 쌓음

POPF

Pop Flags

스택으로부터 플래그 레지스터로 뽑음

Arithmetic

ADD

Add

캐리를 포함하지 않은 덧셈

SBB

Subtract with Borrow

캐리를 포함한 뺄셈

DEC

Decrement

오퍼랜드 내용을 1 감소

NEG

Change Sign

오퍼랜드의 2의 보수, 즉 부호 반전

CMP

Compare

두 개의 오퍼랜드를 비교한다

ADC

Add with Carry

캐리를 포함한 덧셈

INC

Increment

오퍼랜드 내용을 1 증가

AAA

ASCII adjust for Add

덧셈 결과 AL값을 UNPACK 10진수로 보정

DAA

Decimal adjust for Add

덧셈 결과의 AL값을 PACK 10진수로 보정

SUB

Subtract

캐리를 포함하지 않은 뺄셈

AAS

ASCII adjust for Subtract

뺄셈 결과 AL값을 UNPACK 10진수로 보정

DAS

Decimal adjust for Subtract

뺄셈 결과의 AL값을 PACK 10진수로 보정

MUL

Multiply (Unsigned)

AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장

IMUL

Integer Multiply (Signed)

부호화된 곱셈

AAM

ASCII adjust for Multiply

곱셈 결과 AX값을 UNPACK 10진수로 보정

DIV

Divide (Unsigned)

AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장

IDIV

Integer Divide (Signed)

부호화된 나눗셈

AAD

ASCII adjust for Divide

나눗셈 결과 AX값을 UNPACK 10진수로 보정

CBW

Convert byte to word

AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장

CWD

Convert word to double word

AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환

Logic

NOT

Invert

오퍼랜드의 1의 보수, 즉 비트 반전

SHL/SAL

Shift logical / arithmetic Left

왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0)

SHR

Shift logical Right

오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0)

SAR

Shift arithmetic Right

오른쪽 자리이동, 최상위 비트는 유지

ROL

Rotate Left

왼쪽으로 오퍼랜드만큼 회전 이동

ROR

Rotate Right

오른쪽으로 오퍼랜드만큼 회전 이동

RCL

Rotate through Carry Left

캐리를 포함하여 왼쪽으로 오퍼랜드만큼 회전 이동

RCR

Rotate through Carry Right

캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동

AND

And

논리 AND

TEST

And function to Flags, no result

첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트

OR

Or

논리 OR

XOR

Exclusive Or

배타 논리 합 (OR)

String Manipulation

REP

Repeat

REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복

MOVS

Move String

DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송

CMPS

Compare String

DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정

SCAS

Scan String

AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정

LODS

Load String

SI 내용을 AL 또는 AX로 로드

STOS

Store String

AL 또는 AX를 ES:DI가 지시하는 메모리에 저장

Control Transfer

CALL

Call

프로시저 호출

JMP

Unconditional Jump

무조건 분기

RET

Return from CALL

CALL로 스택에 PUSH된 주소로 복귀

JE/JZ

Jump on Equal / Zero

결과가 0이면 분기

JL/JNGE

Jump on Less / not Greater or Equal

결과가 작으면 분기 (부호화된 수)

JB/JNAE

Jump on Below / not Above or Equal

결과가 작으면 분기 (부호화 안 된 수)

JBE/JNA

Jump on Below or Equal / not Above

결과가 작거나 같으면 분기 (부호화 안 된 수)

JP/JPE

Jump on Parity / Parity Even

패리티 플레그가 1이면 분기

JO

Jump on Overflow

오버플로가 발생하면 분기

JS

Jump on Sign

부호 플레그가 1이면 분기

JNE/JNZ

Jump on not Equal / not Zero

결과가 0이 아니면 분기

JNL/JGE

Jump on not Less / Greater or Equal

결과가 크거나 같으면 분기 (부호화된 수)

JNLE/JG

Jump on not Less or Equal / Greater

결과가 크면 분기 (부호화된 수)

JNB/JAE

Jump on not Below / Above or Equal

결과가 크거나 같으면 분기 (부호화 안 된 수)

JNBE/JA

Jump on not Below or Equal / Above

결과가 크면 분기 (부호화 안 된 수)

JNP/JPO

Jump on not Parity / Parity odd

패리티 플레그가 0이면 분기

JNO

Jump on not Overflow

오버플로우가 아닌 경우 분기

JNS

Jump on not Sign

부호 플레그가 0이면 분기

LOOP

Loop CX times

CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기

LOOPZ/LOOPE

Loop while Zero / Equal

제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기

LOOPNZ/LOOPNE

Loop while not Zero / not Equal

제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기

JCXZ

Jump on CX Zero

CX가 0이면 분기

INT

Interrupt

인터럽트 실행

INTO

Interrupt on Overflow

오버플로우가 발생하면 인터럽트 실행

IRET

Interrupt Return

인터럽트 복귀 (리턴)

Processor Control

CLC

Clear Carry

캐리 플레그 클리어

CMC

Complement Carry

캐리 플레그를 반전

CLD

Clear Direction

디렉션 플레그를 클리어

CLI

Clear Interrupt

인터럽트 플레그를 클리어

HLT

Halt

정지

LOCK

Bus Lock prefix


STC

Set Carry

캐리 플레그 셋

NOP

No operation


STD

Set Direction

디렉션 플레그 셋

STI

Set Interrupt

인터럽트 인에이블 플레그 셋

WAIT

Wait

프로세서를 일지 정지 상태로 한다

ESC

Escape to External device

이스케이프 명령

MOVS 무브와 비슷한 작동을합니다


Push: sp 레지스터를 조작하는 명령어중의 하나이다.

스택에 데이터를 저장하는데 쓰인다.

ex:) Push eax

:스택에 Eax의 값을 스택에 저장한다.

ex:) Push 20

:즉석값인 20을 스택에 저장한다.

ex:) Push 401F47

:메모리 오프셋 401F47의 값을 스택에 저장한다.


Pop: 이또한 sp 레지스터를 조작하는 명령어중 하나

이다. 스택에서 데이터를 꺼내는데 쓰인다.

ex:) Pop eax

:스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장

주의점: Push 의 역순으로 값은 스택에서 Pop 된다.


Mov: 메모리나 레지스터의 값을 옮길떄[로 만들떄]

쓰인다.

ex:) Mov eax,ebx

:ebx 레지스터의 값을 eax로 옮긴다[로 만든다].

ex:) Mov eax,20

:즉석값인 20을 eax레지스터 에 옮긴다[로 만든다].

ex:) Mov eax,dword ptr[401F47]

:메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다]


Lea: 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다.

ex:) Lea eax,ebx

:eax레지스터의 값을 ebx의 값으로 만든다.


Inc: 레지스터의 값을 1증가 시킨다.

ex:) Inc eax

:Eax 레지스터의 값을 1증가 시킨다.


Dec: 레지스터의 값을 1 감소 시킨다.

ex:) Dec eax

:Eax 레지스터의 값을 1 감소 시킨다.


Add: 레지스터나 메모리의 값을 덧셈할떄 쓰임.

ex:) Add eax,ebx

:Eax 레지스터의 값에 ebx 값을 더한다.

ex:) Add eax,50

:Eax 레지스터에 즉석값인 50을 더한다.

ex:) Add eax,dword ptr[401F47]

:Eax 레지스터에 메모리 오프셋 401F47의 값을 더한다.



인터넷에서 정리되어있는걸 가져왔습니다.

잘모르시는 어셈문도 있을겁니다^^

728x90
728x90

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AlphaImage implements AdjustmentListener
{
 private JFrame frame;
 private Canvas canvas;
 private JScrollBar jsp;
 private Image image;
 private AlphaComposite alphaComposite;
 private Label label;
 
 public AlphaImage()
 {
  image = Toolkit.getDefaultToolkit().getImage("1.jpg"); //원하는 이미지
  frame = new JFrame();
 
  jsp = new JScrollBar();
  jsp.addAdjustmentListener(this);
  jsp.setMaximum(265);
  jsp.setMinimum(0);
  image = Toolkit.getDefaultToolkit().getImage("1.jpg");
  label = new Label("alpha = " + jsp.getValue());
 
  canvas = new Canvas(){
   public void paint(Graphics g)
   {   
    alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float)jsp.getValue()/255); //alpha값
    Graphics2D g2 = (Graphics2D)g;
    g2.setComposite(alphaComposite);
    g2.drawImage(image, 0, 0, this);   
   }
  };
  frame.add(canvas, BorderLayout.CENTER);
  frame.add(jsp, BorderLayout.EAST);
  frame.add(label, BorderLayout.SOUTH);
  frame.setSize(300,300);
  frame.setVisible(true);
 }

 public void adjustmentValueChanged(AdjustmentEvent e)
 {
 
  if(label != null)
   label.setText("alpha = " + jsp.getValue());
  if(canvas != null)
   canvas.repaint();
 }

 public static void main(String[] args)
 {
  new AlphaImage();
 }
}


728x90

'Projects > 얼굴특징점추출' 카테고리의 다른 글

tip : YCbCr to RGB, RGB to YCbCr  (0) 2010.07.04
728x90

정말 막 만든 것 같다.
그래도 datagridview를 프린트할수 있게 되서 한가지는 얻었다.

그런데 마지막에 세마포어 갯수가 넘친다는 오류는 못잡겠다.
전체를 catch해도 나오지 않는다.. 대체 어디서 해야하는거지?

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

아무튼 요구사항도 정확치 않고 대략적인 엑셀파일만 받아 시작한 내용
만드는 것보다 Test가 훨씬 힘들다는 사실을 실감했다.
사실 기자재부분은 test해봤지만 시약부분은 어떻게 돌아가는지 확인조차 정확히 안해봤다.
오류가 있는 프로그램을 그대로 보내버린 것은 자존심 상하는 일이지만
지금 그걸 잡고 있자니 시간이 너무 부족하다. 이것도 예상보다 커져서 더 오래 잡고 있었는걸..( 원래 2주만에 끝낼려고 했는데 중간에 피서가는 바람에 일주일이 더 소비되었다.. )
728x90

'Projects > 실험실기자재관리' 카테고리의 다른 글

사람들이란..  (2) 2008.09.17
아~ MySQL  (2) 2008.08.18

+ Recent posts