일반 압축은 크개 두가지로 나눌수 있습니다.


손실압축과 비손실압축인데요 


의도적으로 데이터에 손상을 주는 것입니다.


손실압축은 사람이 느낄수없을 정도만 손실을 주어서 데이터의 크기를 줄이는것입니다.


손실압축된 파일은 다시 복구할수없습니다.


압축할때 데이터가 사라지기떄문입니다.


손실 압축에는 주로 mp3나 mp4등 음악, 영상 등 에서 주로 쓰임니다.


비 손실압축은 대이터의 크기를 줄여서 보관 및 이동에 용의하도록 한것입니다.


비손실압축은 압축할떄 데이터가 사라지지 않아서 다시 복구 할수 있습니다.


비손실 압축에는 알고리즘이 필요하고 또한 많은 알고리즘이 있습니다.


대표적으로  Run-Length, Lempel-Ziv, Huffman 등이 있습니다.


그리고 이기반으로한 많은 압축 알고리즘이있습니다.


흔이 사용하는 알집이나 7-zip 빵집같은것이 비손실압축에 해당합니다.


실행압축은 실행가능한 파일을 압축 시키는것입니다.


실행압축에는 실행시 압축해제를 한후에 실행을 시키는 것입니다.


실행 압축된 파일은 역시 실행 가능한 파일이고 압축방법은


ep코드에서 decoding 루팅 되면서 메모리에 압축을 푸는것입니다.


일반 압축과 실행 압축의 차이점입니다.



항목  

 일반압축

 실행압축

 대싱파일 

모든파일 

pe파일 (exe, dll, sys) 

 압축결과물

 zip, rar

 pe파일 (exe, dll, sys)

 압축 해제 방법

전문 프로그램으로 해제 

내부의 decoding 루틴 

자체 실행 가능 여부 

 장점 

모든 파일에 대해 높은 압축율로 압축 가능 

별도의 해제프로그램이 필요없다. 

 단점

압축 해제 프로그램이 없으면 해제 불가 

실행시간이 decoding 루틴 떄문에 미세하게 느려진다. 


실행 파일을 압축시키는 프로그램이나 알고리즘은 무엇일까여?


실행 파일을 압축시키는 것을 실행 압축기 즉 packer라고 합니다.


정식 명칭은 run time packer 로 pe파일 전문 압축기 입니다.


하지만 패커에도 회손율이 다름니다


압축율이 크고 원본 파일을 회손시켜서 바이러스에 이용되는 패커가 있고


압축율이 작지만 원본파일을 보호하는 패커가 있습니다.


웝본 파일을 회손 시키는  패커로 압축된 프로그램은 av제품에서 바이러스로 인식이 됨니다.


그런데 패커는 압축박에 못합니다.


요즘에는 컴퓨터 속도도 빠르고 인터넷 속도도 빠름니다. 구지 할 칠요가 있을까여?


그래서 압축과 동시에 보호 할수도 있는 프로텍터가 있습니다.


단순히 일반 패터 처럼 압축만하는것 이아니라 리버싱을 막기위한 다양한 기법이 있습니다.


리버싱 하기에 매우 어렵습니다.


헌데 가끔은 원본 파일보다 크기가 커지기도 합니다.


프로텍터를 사용하는 이유는 다음과 같습니다.


실행 파일을 압축 시키는 이유는 다음과 같습니다.


크래킹 방지 (cracking)


자신이 만든 프로그램이 크랙이되어 불법적으로 사용된다면 좋아할 사람은 없져


그런경우 프로텍터로 압축 하면 도움이 됨니다.


코드 및 리소스 방지


프로텍터는 pe자체를 보호하여 파일이 실행되었을떄 프로세스 메모리를 보호하여서 덤프를 뜨게 하지 못하게 합니다.


따리서 리소스나 코드를 보호 할수 있습니다.


또한 게임이나 보안 프로그램에도 주로 쓰임니다.


게임핵이 생기면 많은 플래이어 들이 피해를 보게 됨니다.


프로텍터를 사용하면 게임핵이 만들어지기 힘들어지고 성공하면 금전적 이익을 볼수 있기 떄문입니다.


따라서 패커로 리소스나 코드를 보호 하여서 게임핵을 막을 수있습니다.


패커를 자주 바꿔 준다면 게임핵을 만들기 힘들어 짐니다.


하지만 이런 프로텍터가 악용 되기도 합니다.


악성 코드 처럼 컴퓨터에 피해를 입히는 프로그램에 사용되면 av(안티바이러스)에서 잡기 어려워 짐니다.


av 제품에서 감지를 최대한 늦추기 위해서 프로텍터를 사용하기도 합니다.




Posted by 준P

기계어의 구성

기계어는 전류가흐르지않는 0과 전류가 흐르는 1로구성되어있다. 전기는 최대 흐르지않는다와 흐른다의 의미만 표현할수있기때문이다.

0과 1은 2진수라고 하는데 컴퓨터할떄 2진수를 사용하는것이 이이유이다.

허나 0과1로 표현하면 너무커지기 때문에 16진수로 나타내는경우가있다. 16진수로 나타내면 보기가 편해지기떄문이다. 따라서 16진수를 쓰는경우가 대부분이다.

기계어는 16진수로 표기를 하여도 보기가 힘들다. 따라서 인간이 보기편한 어셈블리어로 볼수가있는데 cpu에서 기계어를 쓰듯이 어셈블리어도 cpu에 바로쓸수있다. 기계어와 어셈블리어는 1:1대응한다.

어셈블리어는 크개두가지로 나눌수있다.

작동코드와 오퍼랜드로 나눌수있다.

작동코드에는 명령어가 들어가고 오퍼랜드에는 수행할 주소가있다.

작동코드는 jmp cmp mov sub 등 여러가지가있다. 작동코드 뒤에는 오퍼랜드가 들어가는데 연산을 할려면 2개 이상의 대상이필요하다 허나 어셈블리어에서는 1개또는 2개의 오퍼랜드만쓴다. 3개이상의 오퍼랜드는 쓰지않는다.

오퍼랜드를 알아보자 오퍼랜드는 16비트 32비트 64비트가 있는데 컴퓨터의 발전에 따라 늘어난다.

16비트에서는 ax,bx,cx,dx,si,di가 있는데 32비트에서는 e가붙어서 eax,ebx,ecx,edx,esi,edi로 비뀌었고 32비트에서 16비트 레지스터를 사용할수있고 64비트에서는 e가 r로 변경되어 rax,rbx,rcx,rdx,rsi,rdi로 쓸수있다.

역시 64비트에서도 32비트레스터와 16비트레지스터를 쓸수있다.

각 레지스터가 의미하는것은

EAX - 주로 변수,산술 계산을 하며 리턴값

EBX - 주로 변수,리턴값영도로는 사용하지 않음

EDX - 주된 용도가 없고 마이크로 프로세서에서 추가적인 레지스터 만들어놓것

ECX - 카운터 변수로 사용

ESI - 시작 인덱스

EDI - 목적지 인덱스

를 의미합니다.

이렇게 글로만 하는것보단 직접어셈블리 코딩을 해보는것이 좋을것이나 어셈블리코딩을 해보자

파일 asm.asm


section .data

db msg "hello hell"0x0A

section .text


golbal _start


_start

mov eax,4

mov ebx,1

mov ecx,msg

mov edx,12

int 0x80

mov eax,1

mov ebx,0

int 0x80


이렇게 코드를 작성한후에 저장을 한 후 nasm를 설치해주자 

우분투에서는 

sudo apt-get install nasm

데비안에서는

sudo yum install nasm

윈도우에서는 nasm홈페이지에 들어가서 윈도우용 nasm를 다운받는다. (홈페이지는 직접찾아주세용)


설치를 했으면 컴파일을 해야한다.

컴파일 하기전에 자신의 시스템이 32비트인지 64비트인지 알아야한다.

uname -p명령어로 알아본다

x86 이뜨면 32비트이고  x86_64가 뜨면 64비트이다.

윈도우에서는 제어판에가서 알아보자

32비트의경우 

nasm -f elf asm.asm

64비트의경우 

nasm -f elf64 asm.asm

으로 컴파일한후 공통적으로 

ld asm.o

로 링크를 해준뒤 ./a.out 으로 링크한 프로그램을 실행한다.

실행해보면 hello hell 이라는 문자가 출력될것이다.

어셈블리어로 코딩을 한것이다.

이러면 section과 mov 그리고 int 0x80이 궁금할것인데

section .data 는 어셈블리에서 문자열이나 변수를 저장하는  구역이고

section .text 는 어셈블리어 코드가 들어가는 구역입니다.

mov는 앞오퍼랜드에 뒤의오퍼랜드를 대입한다는 것입니다.

int 0x80은 실행을 의미하는 작동코드와 오퍼랜드이고요

eax 에 write함수를 의미하는 시스템콜번호가 들어갓고요 ebx에는 정상적인 write함수의 출력번호이고 ecx에는 문자열이 edx에는 문자열 크기가 담겨있고요

기본적으로 알아두어야할 작동코드는 

mov sub add cmp test jmp  inc dec ret xor or rep and  zf je pop push pushad popad 등이 있습니다. 다못쓰갯어요

mov 는 뒷오퍼랜드를 앞오퍼랜드에 대입시키는것이고

sub는 앞오퍼랜드에서 뒷어포랜드를 뺀다는것이고

add는 앞오퍼랜드에 뒷오퍼랜드를 더한다는것이고

cmp는 앞오퍼랜드에서 뒷오퍼랜드를 뺸값이 0이면zf를 1로 변환합니다.아닐경우에는 0으로 변환하고요

참고로 실제로 빼는것이아닌 가짜로 뺀값입니다. 레스트터의 값을 확인해보면 변하지 않습니다.!!!

je는 zf가 0이면 오퍼랜드로 jmp를 합니다.

cmp와 je는 같이 쓰이므로 기억해두시면 좋습니다.

jmp는 오퍼랜드 주소로 이동합니다.

test는 앞오퍼랜드와 뒷오퍼랜드를 and연산하여서 연산값이 0이면 zf를 0으러 변환하고 0이아니면 1로 변환한다.

test도 가짜로 and연산을 하여서 나타낸다 레지스터의 값은 변하지 않는다.

test또한 zf와 같이 쓰인다. 

inc는 오퍼랜드값이서 1를 더한다

dec는 오퍼랜드 값에서 1를 뺸다.

ret은 호출된 함수에서 호출한 함수로 복귀하고

xor은 앞오퍼랜드와 뒤오퍼랜드값을 xor연산을 한다.

or도 앞오퍼랜드와 뒤오퍼랜드값을 or연산을 한다.

and 도 앞오퍼랜드와 뒤오퍼랜드값을 and연산을 한다.

rep 는 ecx레지스터를 카운터로 사용하여 0이될떄까지 오퍼랜드값으로 이동한다 반복문이되는셈이다,

이 외에도 이려가지 작업코드가 있으므로 알아보는것이 좋다.

push 오퍼랜드를 스택에 넣는다.

pop 스택에서 맨위값을 오퍼랜드에 대입시킨다.

PUSHAD : 모든 레지스터를 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순서로스택에넣고

popad는 반대로 꺼냄니다.

번지 지정 방식과 MODR/M 그리고 SIB

번지 지정 방식은 프로그램이 수행되는 동안 사용될 데이터의 위치를 지정하는것이다. 따라서 효울적인 지정방식이 필요하다. 


mod r/m 오퍼랜드가 레지스터 또는 메모리에 있는지를 나타낸다.  mod, reg/opcode, r/m의 세개의 필드로 구성되어 있다.

SIB Byte ModR/M 필드에 의해 간접 어드레스 형태로 주소가 지정되어졌의면 베이스 어드레스나 스케일 인덱스와 같은 추가적인 어드레스 지정 형식을 구성하고자 할 대 그 정보가 들어간다 SS, Index, Base 의 세 가지 필드로 구성되어 있다

번지 지정 방식이란 프로세서가 취급할 정보가 위치하는 메모리 번지 또는 레지스터를 지정하는 방법을 말하는 것이며, 인텔의 경우 오퍼랜드가 레지스터 내에 위치할 경우에 사용한다.32비트, 16비트, 8비트 일반 레지스터 중 하나가 될수 있다.

주소 지정 : 실제 데이터 값을 구하려고  인스트럭션의 주소 부분의 값을 수정하거나 다른 것으로 대체하는것

주소 지정 이유 : 융통성 제공 및 주소부분(Operand)의 브트수 절약것것허나 컴퓨터 내에서 주소를 지정하는 방식에는 접근에 의한 방식과 계산에 의한 방식이 있음

접근 방식에 의한 주소 지정


즉시 주소 지정 연산자, 실제데이터

주소 필드에 있는 값이 실데 데이터가 되는 방식그래서 메모리 참조를 하지 않는다.

주기억장치의 참조가 없어서 가장 빠르나 오퍼랜드의 길이에 제약이 있어 모든 데이터를 표현할 수 없다


직접 주소 지정

주소 필드에 있는 값이 실제 데이터가 기억된 메모리 내의 주소가 되는 방식 메모리 참조를 한번 한다. 


간접 주소 지정

주소 필드가 지정하는 곳에 있는 메모리의 값이 실제 데이터가 저장된 주소를 가지고 있는 방식이다.

적은 비트의 명령어로 넓은 기억 장소의 번지를 지정할 때 유용하다 메모리 참조는2회 이상힌다.


처리속도 : 즉시주소(빠르다) → 직접 주소 → 간접 주소(느리다)

명령어 길이 : 간접 주소(짧다) → 직접 주소 → 즉시 주소(길다)


계산에 의한 주소 지정: 실제 데이터가 들어갈 메모리의 위치를 지정할 때 명령어의 주소 부분에 있는 값과 특정 레지스터에 기억된 값을 더해서 지정하는 방식


상대 주소지정: 프로그램 카운터와 주소 부분이 더해져서 유효 주소 결정. 특정 레지스터가 PC(프로그램 카운터)인 경우


인덱스 주소지정: 인덱스 레지스터값과 주소부분이 더해져서 유효 주소 결정. 특정 레지스터가 인덱스 레지스터인 경우


베이스 레지스터 - 베이스 주소를 이용

인덱스 레지스터 - 인덱스 레지스터를 이용

상대주소 - 프로그램 카운터(PC)를 이용

프로그램 카운터 : 다음에 실행될 명령어를 메모리 주소를 기억한다.


Posted by 준P

제2장데이터의 표현과 메모리 구조 

2진법, 16진법의 표현법과 비트, 바이트 

진법은 수를 표시하는 기법을 말하는데 2진수는 0과1을 사용하여 나타낸다. 6을나타낼려면 110으로 나타낸다.우리는 주로 십진수를쓰는데 컴퓨터에서는전기가흐른다의 1 과 흐르지안는다의 0 만 쓰기떄문에 변환하여야하는데 변환공식이 10진수를 2로 계속 나누는 것이다.목이 1이될때까지 그리고 나눈 값의 목과 나머지가 2진수이다

2) 49

2) 24---1

2)12---0

2)6---0

2)3---0

2)1---1

2)1

110001이 49를 2진수로 표현한 값이다. 밑에서부터 순서되로 읽어주면된다.

16진수 는 10진수로 표현하기 힘든 수를 편하게 표현하기위해서 만들어졋다. 우리는 읽기힘들지만 켬퓨터는 편하다.

16진수는 0에서f까지 사용하며 10진수에서 16진수로 변환공식은 10진수로 표현된 수를 16으로 계속나누는 것이다.16진수도 2진수와 같이 목과 나머지값을 거꾸로읽은 값이 16진수이다. 참고로 10==a, 11==b, 12==c, 13==d, 14==e, 15==f 이다.

16)49

16)2--13

2는 16진수에서도 2이고 13은 d이므로 49는 16진수로 2d이다. 

컴퓨터는 데이터량을 표시할떄 비트 바이트 키로바이트 메가바이트 기가바이트 테라바이트 엑사바이트를 사용하는데

8비트다 바이트이고 1024바이트가 1키로바이트 1024키로바이트가 1메가바이트 1024메가바이트가 1기가바이트 1023기가바이트가 1테라바이트 1024테라바이트가 1엑사바이트 이다. 하드디스크를보면 분면 1테가라써있는데 실제용량이다른걸본적있는가? 그이유는 1테가바이트의 상위1만남기고 나머지숫자는 내림하여 없앳기떄문이다. 따라서 실제용량과는 다른다. (뭔가 사기당한기분)  

정수의 표현

컴퓨터에서는 정수를 2진수로 변환 한후에 마이너스이면 2의보수를 추한뒤에 계산을한다.2의보수를취하는 이유는  가장왼쪽에있는 비트에 1이저장되어있으면 음수이다. 하지만 00000101은 5이고 10000101은 -5일거같지만 계산해보면 

2의보수는 1의 보수에 1을더해주는것이다. 1의보수는 not연산과 같이 1과0을 반전시키는것이다.

2)   00000101

2)+ 10000101

2)   10001010

0이아닌 전혀다른 값이나온다. 따라서 우리는 2의 보수를 추한뒤에 계산한다.

2)  00000101

2)+11111011

2) 100000000

맨왼쪽 1이 올려진후 버려짐으로 0이된다.

실수의 표현 

///실수의 표현 

문자의 표현 주로 ascii코드를 사용한다.

컴퓨터에서는 문자를 여러 비트로 모아서 표기하기 때문에 ascii코드,bcd(binary coded decimal), EBCDIC가있다.

bcd는 십진수를 2진수로 변환해준다. 2진수의 4자리수로 맟추어서 표현한다.처음에는 4비트로 사용했는데 특수문자나 대/소문자를 구별하기위해 2비트(zone bit)를 추가하여 6비트로 사용하엿다.



문자나 특수문자에 주로 사용된다.

ASCII코드 아스키코드는 7개의 비트로 구성된 코드이다.(3개의 zone비트와 4개의 digit 비트로이루어져있다.)

존비트에는 영문자 숫자 특수문자를 구별할수잇도록 하엿고 요즘에는 앞에 1비트를 추가해 오류검사코트로 사용한다.(패리티비트) 마지만 디지비트에는 값이저장되있다.

EBCDIC비트에는 4개의 존비트와 4개의 디지비트로 구성되있다. 256개의 문자를 표시할수잇다. 이코드는 imb의 대형컴퓨터에서 주로사용되엇다.

어러검출용 비트또는변환비트

피리티비트

1비트의 검사용비트를 더해 기꼐적에러를 검출한다.

해밍코드

해밍코드는 해밍이란사람이 고안했으며 잘못돤정보를 발견하고 수정해주는코드이다.

그레이코드 

한숫자에서 다른숫자로 갈떄 오직하나의 티므나 바뀐다. 데이터의전송 입출력장치 아날로그에서 디지털로 변환기 또는 주변장치에서 주로쓰이는 비가중치 코드이다.

엑세스코드 

bcd에서 3을 더한 코드로 3초과 3중코드로 불리는 코드이다. 그래이코드와 같이 특별한의미가없는 비가중치 코드이다.

2-5진코드 

1자리를 나타내는데 7비트를 사용하고 7비트를 2비트와 5비트로 나눈다음 2비트의 에러검출과 5개의 2진코드가있어서 에러검출이쉽다.

바이트 순서(Little Endian과 Big Endian) 

리틀에디안 인텔에서 사용하는 데이터 표기순서이다. 리틀에디안은 수를 거꾸로 써넣어서 계산을 최대한 빠르겟 하는것이다. 짝수 홀수 비교할떄도 맨첫번째 자리 수만 2로나누어보면 되니 참으로 간편하다. 

빅에디안은 리틀에디안과 다르게 순서대로 표기한다. 빅에디안은 tcp/ip의 표준이며 tcp/ip공부를 할때 htonl등 여러가지 변환함수를 보게되는데 이것이 리틀에디안을 빅엗디안으로 변환 해주는 함수이다.

아레표는 리틀에디안과 빅에디안을 비교한것이다.값은 0125365898을 비교해보겟다.

빅에디안

01

25

36

58

98

리틀에디안

98

58

36

25

01

참고로 두자리씩 표기하기떄문에 두자리는 순서가 바뀌지않는다 

메모리의 구조 

CPU와 메모리간의 연결 

1. 8086에서 짝수 번지, 홀수 번지 


2. 80386, 80486, 그리고 Pentium에서의 데이터 전송

fsb는 시피유와 노스브릿간의 버스인데요 메인보드에서 장치간에 데이터이동주파수를 말함니다.여기서 ddr의 주파수가 400mhz라면 400(mhz) x64(bit)=25600(Mbit/sec)로 처리함니다.


Posted by 준P

폰노이만 구조: 프로그램과 자료를 실행전에 메모리에 저장해놓고 프로그램이 실행되면 메모리에서 읽어드려 실행하는 거 저장이나 변경사항을 다시 기억장치에 저장하는 방법

 

8080:8bit 마이크로 프로세서,일반 목적용 컴퓨터를 위하여 설계

8086:16bit 마이크로 프로세서

 

8bit 의 한계

8bit 로 최대 0~255에 수만을 표한할 수가 없는 문제가 있다.

하지만 16bit 는 0~65535 까지의 수 를 다룰 수 있어 8bit보다 더 높은 효율의 장점을 가지고 있다.

 

그럼 16bit 8bit가 무엇일까.

16bit 마이크로프로세서라 하면 16비트 데이터버스를 의미 하는 것으로 데이터를 전송을 위해 16개의 핀을 사용한다는 것이다.

 

전송하기위해서 데이터 버스를 사용한다면 위치를 참조하기위해 어드레스 버스를 사용한다.

 

8086에 경우 16bit 마이크로프로세서에 20bit 어드레스 버스를 사용한다.

이는 보다 많은 메모리에 엑세스 하기 위해서이다.

하지만 8086에 경우 모든 레지스터가 16bit 이어서 20bit까지 표현을 못하는 문제를 가지고 있다. 이를 해결하기위해서 레지스터 2개를 조합하여 문제를 해결할 수 있었다.

 

하지만 이 방법에도 문제가 있는데 8086에 경우 레지스터 개수 자체가 얼마 되지 않아 문제가 발생했다, 이러한 문제를 해결하기위해 세그먼트라는 방법을 고안해냈다.

 

 

 

80286: 8086에 빠른 속도와 더 많은 24bit어드레스 버스와 함께 보호보드 라는 것이 적용되었다.

 

80360: 80386부터 본격적으로 32bit환경이 조성되었다, 어드레스 버스, 데이터버스, 레지스터등 모두 32bit로 구성되었다. 최대 표현 정수 데이터가 40억 정도 까지 늘어나 효율이 극대화 되었고 또한 MMU(메모리 관리장치)가 포함됨으로 메모리 할당 등을 하드웨어가 부담으로 소프트웨어에 부담을 덜어 주었다.


또한 80386은 시스템 레지스터가 추가되었는데

CR0 - 페이징,보호모드,실제 모드 관리,

   cr0 레지스터에 pe비트가 1로 세팅되면 보호모드, 0이면 실제모드

 

CR2 페이지폴트시 마지막 주소를 가리키고 있음

CR3 페이지디렉토리 베이스 주소를 가지고 있다.

또다른 시스템 레지스터 그룹인

DR0~DR3

브레이크 포인터에 관련된 레지스터

 

TLB(Translarion Lookaside Buffer) :

페이징 작업시 가상 메모리의 내용을 실제 메모리값으로 변경하려면 시간이 많이 걸린다. 이것을 해결하기위해 고안된 방법으로 캐쉬와 비슷한 방법인데. 일정개수 만큼 버퍼에 보관하여 변화하는데 드는 시간을 줄여준다.

 

80486 부터는 구조적 변화보다는 호환성 위주로 발전.

명령어 파이프 라인 구조를 채택함

- 병령 처리가 가능함

명령어 파이프 라인이 원활하게 동작하기위해서 원할한 데이터 공급은 필수인데 이것을 해겨하기위해 8byte L1캐쉬를 마이크로 프로세서 내부에 추가하였다.



----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

컴퓨터의 구조

컴퓨터는 여러가지 장치가 조합하여 사용할수있다. 입력장치 출력장치 연산장치보조기억장지 주기억장치 제어장치가 필수적으로 필요하다. 그리고 이를 총괄적으로 제어할수있는 소프트웨어가필요한데 바로 시스템소프트웨어이다.바로운영체계이다. 그리고 운영체계에서 사용할 응용소프트웨어도 필요한데 흔이말하는 프로그램이다.

이를 사진으로 정리하겟다.



먼저 하드웨어의 중앙처리장치를 보자면 제어장치와 연산장치 주기억장치를 사용하는데 시피유와 램을 같이사용하여 연산을 처리한다. 연산장치에서 수를 처리했는데 이것을 기억시키지못하고 소멸시킨다면 아무런이유가없지않은가

이 수를 기억하기위해 주기억장치를이용하고 수를 연산하기위해 시피유를사용한다.참고로 주기억장치에는 명령어와 결과가 저장된다. 그리고 이시퓨유먼저살펴보자자자



시피유는 연산장치 제어장치 레지스터로 이루어져있는데 이것을 이어주는 것이 바로 내부 cpu버스이다.

그런데 시피유에서 정말로 수를저장하지못할끼? 가능하다. 레지스터에 저장할수있다. 그런데 왜 구지 주기억장치를사용할까? 바로 시피유의 레지스터는 크기도작고 임시로 기억하기떄문이다. 허나 주기억장치도 임시적으로 기억할뿐이다.

그냥컴퓨터나껏다키면 바로 소멸되기떄문이다.

이것을저장하기위해 보조기억장치가잇다.보조기억장치는 컴퓨터 전원이꺼져도 기억하며 언제든지 불러올수있다.

시피유가 연산을하기위해일시적으로 진동하는것을 클록이다고한다. 이쿨럭을hz로 표시하며 한번진동하는데1hz로쓴다.

1초에 10의 6승을 진동하는것을 mhz라고하고 1초에 10의 9승을진동하는것을 ghz라고한다.

명령어처리속도는 1초에100만번을진동하는것을 mips라고한다.

연산장치는 산술 및 부울논리연산기와 상태플러그 이동기 보수기로 구성되어있으며 연산기에서는 산술놀리연산장치와alu가있는데 산술논리연산기는 덧셈뺄셈 과같은연산과 and ,xor,or등 논리연산을계산하는 디지털회로이다.alu는 실제적인 논리연산을한다.그리고 상테를표시하는플러그와 음수 0 양수 등을 표시한다.alu는 이동기와 보수기로 되어있고 이동기의 비트이동은 2를곱하거나 나누는것으로 해석된다. 보수기에서는 데이터의 보수연산을하며 2의 보수는 덧셈뻴셈을 빨리한다.


레지스터의 종류에는 데이터, 주소.,범용,부동,상수,특수,명령,색인레지스터가있다. 데이터레지스터는 정수데이터값을저장할수있고 주소레지스터는 기억장치의 주소를기억할수있다.범용레지스터는 데이터와주소를모두기억할수있다.부동레지스터는 부동소수점을저장하기위해사용된다.상수레지스터는 0이나1고정된데이터값을저장하기위한레지스터이다.특수레지스터는 실행중인레지스터의상테를저장하는레지스터이다.(프로그램카운터,상테레지스터)명령레지스터는 현제실행중인명령을기억한다.색인레지스터는 실행중인 피연산자의주소를계산하는데사용한다.

제이및상태레지스터도있다. 이레지스터들은 일반사용자에게 보여지는 레지스터이다.일반목적용레지스터 프로그래머에게의해 여러용도로사용되는레지스터 데이터레지스터 데이터저장에만사용할수있는레지스터주소레지스터 주소저장용으로 쓰이는레지스터 스텍포인터 스텍의 최상위주소를기억하는레지스터 부포비트 경에는 음수인지양수인지표시 영(제로)비트해당데이터가 0이라는것을알려준다.오버플로우비트 연산중에 오버플로우가발생하엿다는것을 알려준다.

상테레지스터에는 많은비트로이루어저있는데 부호비트 영비트 올림수비트 동등비트 오버플로우비트 인터럽트비트가 있다. 부호비트는 음수인지양수인지구별할떄쓰이는비트이며 영비트는 데이터가 0인지 구별할떄시이며 올림수비트는 해당데이터가 자리올림이발생하엿다는것을알려준다.동등레지스터는 비교대상과 해당레지스터가 동일하는것을알려준다. 오버플로우비트 해당비트에서 오버플로우가발생햇다는것을 알려준다. 안터럽트비트 인터럽트가능여부를알려준다.

프로그램상태비트에는 디렉션비트 트랩비트 보조올림수비트 패리티비트 수퍼바이저비트가있다. 디렉션비트는 문자열조작에서 참일경우 자동으로감소하고 거짓일경우 자동으로 증가하는 비트이다.트랩비트참일경우에 한명령어실행시 인터럽트발생 보조올림수비트 연산결과가 4비트를 넘어섯을경우에만 참이된다. 이진화 십진법연산에 사용된다.

패러티 비트 연산결과가 1의 값을 같은 비트의 수가 짝수일떄만 참이다.수퍼바이저비트슈퍼바이저비트는 시피우가 수퍼바이저모드혹은일반사용자보드에서실행준인지 나타내는비트이다.

제어장치에서는 주기억장치에서 받은명령어코드를 해독하고 제어신호를 해당장치에 전달하는 역활을수행한다.

명령어는 연산코드와기억주소로이루어져있는데 연산코드에는 실행될 코드가지정되어있고 기억주소는 해당연산을수행할 데이터가 저장되어있는주소를 가르킨다.제어장치는 버퍼레지스터와 명령어레지스터 해독기 기억장치주소레지스터와 프로그램카운터로이루어져있다.그런데 내부시피유버스는 왜있는것일까? 그냥 장치끼리바로연결해서사용하면안될까? 내부시피유버스를  사용하는이유는 장치들간의 속도차떄문이다.시피유간의 속도차는 극복할수있지만 왜부장치의속도차는극복할수없다. 따라서 내부시피유버스가 이를 조절하는 버퍼역활을한다.

주기억장치에서 명령레지스터까지 갈려면 처리속도가 미세하게있으므로 버퍼를지나야하는데 연산과정은아레와같다


명령어레지스터에는 명령어를저장하고 해독기는 명령어를해독하고 주소레지스터에는 당연히 명령어가저장된 주소를기억한다.프로그램카운터는 다음수행할 명령어의주소를기억하고있다


주기억장치에서는 텍스트영역 데이타영역 bss영 코드영역이있다.



메모리구조를 c언어  형테로 보았다. 먼저 초기화되지않은 변수는 bss에 저장이되고 선언되고 초기화가된변수는 데이터영역에 저장된다. 텍스트영역에는 변수가 명령어를 사용하여 시피유를통해 연산할 명령어가저장된다. 여기서 시피유에전달될명령어가 저장된다.스텍영역에는 지역변수나 메개변수가 저장되는 곳이다.함수호출이끝나면 소멸한다.힙영역에는 동적메모리를 할당한다 프로그래머가 할당해재를해주어야한다. 프로그램이끝나면 운영체계에서 해제해주기도한다.

텍스트영역위에 코드영역이있는데 그곳에는 프레임 포인터와 리턴주소가있다. 프레임 포인터에는 프로그램이 시작되었을때 주소값이저장되어있다. 프로그램이끝나면 이주소로 복귀한다. 리턴주소는 프로그램이끝날주소를기억하고있다. 참고로 오버플로우공격이 이 리턴주수로를 위조하여 쉘코드를얻어내는공격이다.


컴퓨터의 역사


컴퓨터는 계산기에서 시작되었다.

사람들은 복잡한 계산을 대신할 것이 필요햇고 그에 맞추어 계산기가 나타낫다.

세계 2차 대전과 대전중에 기계식 회로와 아날로그 회로에서 전자회로와 디지털 회로로 바뀌는 변화가 있었고.

시간이 지나면서 제 1세대 진공관이 나타나면서 애니악이 만들어졋다. 하지만 애니악의 진공관은 유리일 뿐더러 잘 부서졋고 부피도 커서 공간을 많이 차지하엿다. 18000여대의 진공관과 1500개의 계전기를 사용하기 때문에 전력 소비가 엄청낫다. 이 외에도 문제가 많았지만 트렌지스터가 개발된뒤로 많은 문제가 해결 되었다. 트렌지스터는 매우 작을 뿐더러전기소모도 적었고 유리가 아니어서 깨질 위험도 없었다. 제2세대 트렌지스터가 계발 된 뒤로 많은발전이 있었지만 아직도 많은 트렌지스터가 필요하엿고 개인용으로 쓰기에는 벅찻다. 그 뒤로 제3세대 ic가 개발되었고 그 뒤로 제4세대인 lsi 고밀도 집적도를 높혓다. 이 뒤로 컴퓨터의 크기는 매우 작아졋다.

이 뒤로 슈퍼 컴퓨터가 출시뒤었고 lsi같은 하드웨어적 공간이 줄어듬으로써 1980년대에 imb에서 첫 개인용 컴퓨터를 내노았다.하지만 사람들이 쓰기에는 불편하엿고 cpu에 따라 프로그램도 달라서 많은 불편함이 있었다.

개인용 컴퓨터가 보급됨에 따라 마이크로소프트의 windows가 나왓고 에플의 ios와 같은 운영체계가 나왔다.

그리고 곧컴파일러가 나오면서 프로그래머들은 cpu마다 다른 프로그램을 만들필요가 없었고 프로그래밍 언어가 나오면서 프로그램 개발은 더욱 편리해 졋다.프로그래밍 언어는 a-b-c 순으로 발달 하엿고 후에 자바나 파이썬같은 새로운언어가 나왓다. c++도c에서 발전하엿단으미로 ++이붙은것이다.

현제 컴퓨터는 4세대 컴퓨터 이며 5세대 컴퓨터를 개발중이다.


Posted by 준P

이 커테고리에 올릴 내용은 


Windows 구조와 원리 OS를 관통하는 프로그래밍의 원리

입니다.

os에 대한 구조와 원리를 설명할것입니다.

총 16 장 되어있습니다.

게시글마다 1장씩 올릴예정입니다.

목차는 

제1장컴퓨터의 구조와 역사
01시스템 프로그래밍과 운영체제
1. 시스템 프로그래밍이란?
2. 운영체제란?
02프로그래머 입장에서 바라본 컴퓨터의 구조와 역사
1. 폰 노이만 구조(Von Neumann Machine)와 ISA(Instruction Set Architecture)
2. 인텔 8008, 8086 마이크로프로세서
3. 8086의 레지스터들
4. 8086 세그먼트 레지스터의 사용
5. 80286과 80386 마이크로프로세서의 출현
6. 80386에서의 레지스터들
7. 컴퓨터 아키텍처(Architecture)와 컴퓨터 오가니제이션(Organization)
8. 80486 마이크로프로세서
9. 펜티엄(Pentium) 프로세서와 슈퍼 스칼라
제2장데이터의 표현과 메모리 구조
012진법, 16진법의 표현법과 비트, 바이트
02정수의 표현
03실수의 표현
04문자의 표현
05바이트 순서(Little Endian과 Big Endian)
06메모리의 구조
07CPU와 메모리간의 연결
1. 8086에서 짝수 번지, 홀수 번지
2. 80386, 80486, 그리고 Pentium에서의 데이터 전송
제3장기계어의 구성
01기계어에 대한 이해와 필요성
02고급 언어, 기계어, 그리고 어셈블리 언어의 예
03명령의 구성과 실행
04기계어의 구성(명령어 형식: Instruction Format)
1. Instruction Prefixes
2. 작동 코드(Opcode: Operand code)
3. 번지 지정 방식과 MODR/M 그리고 SIB
4. 번지 지정 방식
제4장프로시저와 스택 구조
01스택을 사용한 복귀 주소의 저장
02스택을 사용한 로컬 변수의 저장
03스택을 사용한 파라미터 전달
04파라미터 전달의 여러 가지 방법(Calling Conventions)
1. __cdecl
2. __stdcall
3. __fastcall
05스택 프레임을 이용한 스택 백트레이싱
06프로시저에서 리턴 값 전달하기
07Windows에서의 스택 구조
08함수에서의 레지스터 사용
09Name Mangling(name decoration)
제5장프로세스와 스레드
01프로세스와 스레드의 개념
1. 프로세스(Process)
2. 스레드(Thread)
02프로세스의 구조
1. WinDBG를 사용한 프로세스 구조체 살펴보기
2. 프로그램에서 EPROCESS 포인터 얻기
3. 프로세스를 구성하는 요소들
03스레드의 구조
1. WinDBG를 사용한 스레드 구조체 살펴보기
2. 프로그램에서 ETHREAD 포인터 얻기
04구조화된 예외 처리(Structured Exception Handling)
1. 운영체제에서의 예외 처리 과정
2. 아주 간단한 SEH 처리 예
3. Visual C++에서의 SEH 처리 예
4. Visual C++의 SEH에서 제공하는 추가적 기능들
05애플리케이션에서 프로세스와 스레드 관련 정보 얻기
제6장스레드의 스케줄링
01스레드의 상태
02우선순위 알고리즘
1. Windows에서의 우선순위 스케줄링 구현
2. 프로세스 우선순위와 스레드 우선순위
03Performance monitor 프로그램을 이용한 실험
04선점형 스케줄링(Preemptive Scheduling)
1. 선점되어지는 경우
2. Windows에서의 선점형 스케줄링 구현
3. IRQL과 커널레벨 동기화
제7장스레드의 동기화
01스레드 동기화의 필요성
02유저모드에서의 동기화 함수들
1. 크리티컬 섹션(Critical Section)
2. 뮤텍스(Mutex)
3. 세마포어(Semaphore)
4. 이벤트(Event)
03커널 동기화 객체와 그 구조
1. 커널 동기화 객체
2. 디스패처(Dispatcher)와 대기 블록(WaitBlock)
제8장메모리 관리
01가상 주소(Virtual Address)
02가상 주소(Virtual Address)의 구현
1. 페이징 기법
2. 가상 주소와 페이징 시스템
3. 세그먼트 기법
4. 단편화(Fragmentation)
5. 세그먼트와 페이징 기법의 병합
제9장세그먼테이션
01가상 메모리에서 실제 물리 메모리까지
02세그먼트 레지스터와 그 사용
03세그먼테이션(Memory Segmentation)
04세그먼트 디스크립터
05세그먼트 디스크립터의 내용들
1. 베이스(Base) 필드
2. 리미트(Limit) 필드
3. 액세스(Access) 비트
4. 프레젠트(Present) 비트
5. 디폴트(Default) 비트
6. Granularity 비트
7. 시스템(System) 비트와 타입(Type) 비트
06디스크립터 테이블과 세그먼트 셀렉터
1. 디스크립터 테이블
2. LDT(Local Descriptor Table)
3. 세그먼트 셀렉터
07Windows에서의 세그먼트 디스크립터와 레지스터
1. 애플리케이션에서의 세그먼트 레지스터와 그 내용
2. 커널레벨에서의 세그먼트 레지스터와 그 내용
제10장페이징
01페이징(Paging)
02선형 주소에서 물리 주소까지
1. CR3 레지스터
2. 페이지 디렉토리(Page Directory)
3. 페이지 테이블(Page Table)
4. 실습
03Windows에서의 페이지 디렉토리와 테이블
04공유 메모리와 공유 모듈
05메모리 공간의 전환
063GByte의 유저 메모리를 사용하는 Windows
07 Page Address Extensions(PAE)
제11장페이지 관리
01요구 페이지 처리
1. 페이지 폴트 예외 핸들러
2. 선페이징(Prepaging)
3. Paged Memory와 NonPaged Memory
02페이지 교체 정책(Page Replacement Policy)
1. 지역성(Locality)
2. LRU(Least Recently Used) 방식
3. FIFO(First In, First Out) 방식
4. Page Frame Number Database
5. 실습
03작업세트(Working Set) 관리
1. 스레싱(Thrashing) 현상
2. 작업세트 관리
3. 작업세트를 조절하기 위한 Win32 API
04페이지의 효과적 이용 방법
제12장프로세서 내의 캐시 관리
01원리
02캐시 메모리의 주소 매핑 방식
1. 직접 매핑(direct mapping)
2. 어소시에이티브 매핑(associative mapping)
3. 셋 어소시에이티브 매핑(set associative mapping)
03캐시 교체 알고리즘
04캐시 쓰기 정책
1. Write through 정책
2. Write back 정책
05Pentium Processor에서의 캐시 구조
06캐시와 프로그램 최적화
1. 데이터의 위치와 속도
2. 지역성을 이용한 최적화(Locality)
3. 특별한 명령어를 이용한 최적화
4. 데이터의 정렬(Alignment)
제13장윈도우즈에서의 캐시 관리
01Windows에서의 파일 읽기와 그 과정
02내부 구조
1. Windows의 System Cache 영역과 View
2. VACB(Virtual Address Control Blocks)에 의한 View 관리
3. 파일 열기 속성과 캐시 관리자
03캐시 내부 살펴보기
1. FILE I/O 함수에 의한 접근 시의 데이터 관리
2. 메모리 맵드 I/O에 대한 파일 관리
제14장유저레벨과 커널레벨
01특권레벨(Privilege Levels)
02커널모드(Ring 0)와 유저모드(Ring 3)
03Windows에서의 유저레벨 코드 세그먼트
04Windows에서의 커널레벨 코드 세그먼트
05커널레벨에서만 실행되는 CPU 명령어
06세그먼트의 갱신과 특권레벨
1. 데이터의 세그먼트 갱신(DS, ES, FS, GS)
2. 스택 세그먼트 갱신(SS)
07코드 세그먼트의 변경과 특권레벨의 변경
1. 세그먼트간의 JMP 또는 CALL 명령 실행
08인터럽트와 특권레벨
1. IDT(Interrupt Descriptor Table)
2. 인텔에서 정의하고 있는 인터럽트 벡터별 내용
3. 인터럽트 발생과 스택 변화
4. Windows API의 흐름
09I/O 특권레벨 변경
1. TSS(Task State Segment) 변경을 통한 I/O 권한 변경
2. IOPL 변경을 통한 IO 특권레벨 변환하기
15장 실행 파일과 로더
01PE 파일의 레이아웃
1. DOS 헤더와 스터브 코드
2. PE 헤더
3. Optional 헤더
4. 섹션(Section) 헤더
5. 세션(Section)
02PE 파일의 주요 정보와 로더
1. 로더의 내부
2. 기준 재배치(Base Relocations)
3. 익스포트 함수(Export Functions)
4. 임포트 함수(Import Functions)
16장 16비트 에뮬레이션(Emulation)
01MS-DOS 에뮬레이션
1. 메모리 공간의 구성
2. 16비트 명령어의 실행
3. Interrupt에 대한 처리
4. Memory Mapped I/O에 대한 처리
0280286 환경에서 수행되는 Win16 에뮬레이션
부록 A.WinDBG 설치 및 간단한 사용법
부록 B.드라이버 개발 경험이 없는 프로그래머를 위하여
부록 C.디스어셈블링에 대한 이해
부록 D. 디버거의 내부 구조와 원리


Posted by 준P

이 카테고리는 책의 목차를 가지고 인터넷에서 조사를해서 문서로 정리하는 카테고리입니다.


책 이름은 서브 카테고리에 써 있습니다.



Posted by 준P