byidev.com
Study/Computer Science (8)
2023-05-16 11:39:55

1. 프로세스 메모리의 스택 구조와 역할

- 함수 내의 로컬 변수를 임시 저장

- 함수 호출 시 파라미터 전달 복귀 주소 저장

- 스택은 먼저 입력한 값이 마지막에 나오는 FILO (First In Last Out) 구조.

2. 스택의 데이터 I/O

- DATA IN ⇒ PUSH

- DATA OUT ⇒ POP

3. ETC

- Intel CPU에서는 EBP, ESP 등을 이용해 스택을 구현.

- EBP ⇒ 현재까지 실행된 주소

- ESP ⇒ 스택 포인터

4. 예제

#include <stdio.h>
constexpr auto SIZE = 100;
int stack[SIZE] = { 0, };
int stackTop = -1;

int isFull()
{
	if (stackTop >= SIZE - 1)
		return (true);
	return (false);
}

int isEmpt()
{
	if (stackTop < NULL)
		return (true);
	return (false);
}

int push(int n)
{
	if (!isFull())
	{
		stack[++stackTop] = n;
		return (n);
	}
	return (false);
}

int pop()
{
	if (!isEmpt())
		return (stack[stackTop--]);
	return (false);
}

int main(void)
{
	for (int i = 0; i < SIZE; i++)
		printf("psuh(%d)\n", push(i));
	for (int i = SIZE; i > 0; i--)
		printf("pop(%d)\n", pop());

	return (0);
}
2023-05-11 17:07:45

Processor(CPU) Register

Processor register는 CPU 내부에 존제해 프로세서에서 사용할 수 있는 가장 빠른 엑세스 위치이다. 아키텍처 로드/저장 여부에 관계없이 거의 모든 컴퓨터는 산술, 비트 연산 및 기타 연산에 레지스터로 데이터를 로드하고 기계 명령에 의해 조작된다.

1. 레지스터란?


  1. CPU 내부에 존재하는 저장 공간
    1. 장점 : CPU가 데이터를 빠르게 처리 가능
  2. 빠른 연산을 위해 사용
  3. 실행 중인 명령어 제어
  4. 메모리 번지 지정
  5. 산술 연산 수행
  6. 명령어의 임시 보관
  7. 데이터의 일시적인 중간 결과 저장

2. IA-32, 레지스터 종류


IA-32

  1. IA-32는 Intel 32bit micro processor 명령 집합 아키텍처에 관한 내용이다.
  2. 이전에 사용되던 IA-16 아키텍처의 32비트 확장이다.
  3. 대부분의 개인용 컴퓨터에서 사용되고 있다.

종류

  1. Basic program execution registers
    1. General Purpose Registers - 32bit 8개 구성
      1. 주소, 변수 저장에 사용
      2. Assembly 명령어(MUL, DIV, LODS, etc)로 특정 레지스터 조작
      3. EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP 총 8개
        1. EAX : 산술 연산, 입출력, 함수 리턴 값
        2. EBX : 산술 연산, 메모리 주소
        3. ECX : 루프 카운터로 사용
        4. EDX : EAX 확장, 연산 시 추가 데이터 저장
        5. EDI : 메모리 복사에 사용 / data operation 결과 저장 지시 (writing)
        6. ESI : data operation을 위한 src idx
        7. EBP : stack frame 기법 (바텀)
        8. ESP : stack frame 기법 (탑)
    2. Segment Registers - 16 bit 6개 구성
      1. 6개 각각의 크기는 2byte
      2. 세그먼트 레지스터가 가리키는 디스트럽터와 가상 메모리가 조합되어 선형 구조를 가지며, 페이징 기법에 의해 선형 주소가 물리 주소로 변환됨.
      3. CS, SS, DS, ES, FS, GS
        1. CS : Code Segment
        2. SS : Stack Segment
        3. DS : Data Segment
        4. ES : Data Segment
          1. 추가 데이터 세그먼트
        5. FS : Data Segment
          1. 추가 데이터 세그먼트
          2. 고급 디버깅에서 주소 계산에 사용
        6. GS : Data Segment
          1. 추가 데이터 세그먼트
    3. Program Status and Control Register - 32bit 구성
      1. 플래그 레지스터 - EFLAGS, 4byte 크기
        1. 2바이트의 FLAGS 레지스터 확장
        2. 각각의 비트는 각자의 의미를 지님.
        3. 일부 비트는 시스템, 일부 비트는 프로그램에서 사용된 명령에 의해 세팅
        4. ID, VIP, VIF, AC, VM, RF, NT, IOPN, OF, DF, IF, TF, SF, ZF, AF, PF, CF
          1. ZF : Zero Flag - 연산 명령 후 결과 값 0이면 ZF가 1 세팅
          2. OF : Overflow Flag - 부호 있는 수 오버플로우 발생 시 1세팅
          3. CF : Carry Flag - 부호 없는 수 오버플로우 발생 시 1 세팅
          4. ZF, OF, CF는 조건 분기 명령에 사용되는 중요 플래그
    4. Instruction Pointer - 32bit 구성
      1. Instruction Pointer(EIP)는 CPU가 처리할 명령의 주소
      2. 크기는 2byte인 IP 레지스터의 확장형인 4Byte
      3. CPU는 EIP에 저장된 주소의 명령어 처리 후, 처리한 명령어 길이만큼 EIP를 증가시켜 다음 명령 처리.
      4. 다른 레지스터와 달리 EIP는 직접 변경 불가, 특정 명령어 필요
  2. X87 FPU registers
  3. MMX registers
  4. XMM registers
  5. Control registers
  6. Memory management registers
  7. Debug registers
  8. Memory type range registers
  9. Machine specific registers
2023-05-11 15:26:04

엔디안(Endianness)


개요

  1. 컴퓨팅에서 엔디안은 컴퓨터 메모리에 있는 디지털 데이터의 바이트 순서 또는 시퀀스를 의미한다.
  2. 엔디안은 주로 다음과 같이 나뉜다.
    1. BE (Big-endian) - 빅 엔디안
      1. 작은 것에서 큰 것으로 배열.
      2. 사람이 보기 편하다.
      3. 디버깅에 좋다.
      4. RISC 계열 CPU (Unix 서버에 많이 사용)
      5. 네트워크 프로토콜
    2. LE (Little-endian) - 리틀 엔디안
      1. 큰 것에서 작은 것으로 배열.
      2. 산술 연산과 데이터 타입의 확장/축소에 효율적.
      3. intel x86 계열의 CPU
    3. ME (Middle-endian, Mixed-endian) - 미들 엔디안, 믹스 엔디안
      1. 두 경우에 속하지 않거나, 둘을 모두 지원하는 경우.
    4. BIE (Bi-endian) - 양방향 엔디안
      1. 데이터 가져오기, 저장, 명령 가져오기를 위해 전환 가능한 엔디안을 특징으로 컴퓨터 아키텍처에서 지원하는 기능.
TYPE NAME SIZE BE LE
BYTE b 1 [12] [12]
WORD w 2 [12][34] [34][12]
DWORD dw 4 [12][34][56][78] [78][56][34][12]
CHAR[ ] str 6 [61][62][63][64][65][00] [61][62][63][64][65][00]

특징

  1. 내부적으로 컴퓨터는 하드웨어가 데이터를 저장하고 로드하는 데 동일한 엔디안을 사용하기 때문에 사용자는 이를 모르고 있어도 문제가 없다.
  2. 컴퓨터간 데이터 전송, 메모리 덤프의 내부 바이트 참조 등과 같은 작업을 하는 프로그래머는 이에 대한 개념이 필수이다.

개념

BE - 빅 엔디안 / LE - 리틀 엔디안

왼쪽 다이어그램의 빅엔디안 컴퓨터는 주소 a 에서 최상위 바이트 0x0A로 정수 저장을 시작해 a+3 에서 최하위 바이트 0x0D로 끝이난다.

오른쪽 다이어그램의 리틀엔디안 컴퓨터는 주소 a 에서 최하위 바이트 0x0D로 정수 저장을 시작해 a+3 에서 최상위 바이트 0x0A로 끝이난다.

각 컴퓨터는 정수를 저장하고 검색하는 데 동일한 엔디안을 사용하므로, 결과값은 동일하다. 하지만, 정수 대신 바이트로 메모리 주소를 지정하거나 엔디안이 다른 컴퓨터 간에 메모리 내용이 전송 될 경우 문제가 발생할 수 있다.

빅엔디안은 가장 중요한 바이트를 먼저 전송하는 인터넷 프로토콜에서 가장 많이 쓰인다. 반대로, 리틀엔디안프로세서 아키텍처(x86, ARM, RISC-V)와 메모리 구조에서 많이 쓰이고 있다.

ME - 미들, 믹스 엔디안

32비트 정수를 두개의 리틀엔디안 16비트로 저장하고, 빅엔디안 순서를 사용하는 것.

BIE - 양방향 엔디안

양방향 엔디안은 일반적으로 하드웨어에 대한 엔디안 형식으로 데이터를 계산하거나 전달하는 기능을 말한다.

2023-05-11 12:02:42

진법 (base-radix)

진법은 수를 셀 때, 자릿수가 올라가는 단위를 기준으로 하는 셈법의 총칭.

(”위치 적 기수 법”으로도 불림)


2진법(binary)

개요

  1. 2진법은 0과 1이라는 두 개의 숫자만을 사용하여 수를 나타내는 진법.
  2. 미적분학의 창시자 고트프리트 빌헬름 라이프니츠가 고안.
  3. 전자기기의 경우 신호를 특정 순서로 그룹 화 해 인지하기 때문에 2진법을 기반으로 발전.
  4. on(1), off(0)

표현 법

  1. 1의 보수(1's complement, 1'C)를 활용한 표현 법
    1. 0000 0100 (숫자 5)
    2. 1111 1010 (1의 보수에서 -5) ⇒ 비트 반전
  2. 2의 보수((2's complement, 2'C))를 활용한 표현 법
    1. 0000 0100 (숫자 5)
    2. 1111 1011 (2의 보수에서 -5) ⇒ 비트 반전 후 +1

2의 거듭제곱 220 219 218 217 216 215 214 213 212 211

10진수 표기 1048576 524288 262144 131072 65536 32768 16384 8192 4096 2048  
2진수 표기 100000000000000000000 10000000000000000000 1000000000000000000 100000000000000000 10000000000000000 1000000000000000 100000000000000 10000000000000 1000000000000 100000000000  
2의 거듭제곱 210 29 28 27 26 25 24 23 22 21 20
10진수 표기 1024 512 256 128 64 32 16 8 4 2 1
2진수 표기 10000000000 1000000000 100000000 10000000 1000000 100000 10000 1000 100 10 1

ETC

  1. 2의 보수 표기는 10진수와 상호 변환이 가장 어려운 표기법.
  2. 컴퓨터를 포함한 전자기기는 2의 보수를 사용한다.
  3. 2의 보수는 연산에서 양수와 음수를 똑같이 취급할 수 있다는 이점이 있다.
  4. 이진 로그를 이용하면, 2진법으로 표기된 수를 좀 더 쉽게 다룰 수 있다.
    1. 시간 복잡도, 알고리즘 등의 정의에 사용.
  5. BCD(Binary-Coded Decimal) 코드
    1. 10진수의 각 자리수를 모두 분리해 각각 2진수 형태로 표현한 것.
    2. 365[10] ==> 0011(1) 0110(2) 0101(3) BCD

8진법(octal)

개요

  1. 0~7 범위의 숫자를 통해 숫자를 표현하는 진법.

표현 법

  1. 숫자 뒤에 (8) 또는 알파벳 o를 붙여 8진법임을 표시.
  2. 알파벳으로 표현이 가능하다.
1 2 3 4 5 6 7
l s n m t u o
  1. 8진법을 컴퓨터에서 쓰는 이유는 자릿수 하나가 2^3을 표현할 수 있어서 2진수를 직관적으로 빠르게 변환 가능하기 때문.
  2. 8진법 ⇒ 2진법 변환
    1. 714(8) ⇒ 111(7)001(1)100(4) ⇒ 111001100(2)
  3. 2진법 ⇒ 8진법 변환
    1. 1의 자리부터 3개씩 끊어 변환해준다.

ETC

  1. UNIX 파일 액세스 권한 설정에 8진법이 사용.
  2. 실행 권한을 지정할 때 읽기, 쓰기, 실행 권한 3비트를 8진수 하나로 묶어 표기.
  3. C에서 8진법을 사용할 때는, 숫자 앞에 0을 붙이는 규칙이 존재.
int octal = 01234;
  1. 8진법은 7의 배수를 구하는데 최적화.

10진법(decimal)

개요

  1. 0~9 범위의 숫자를 통해 숫자를 표현하는 진법.
  2. 현대의 거의 모든 사람들이 기본으로 사용하는 진법.
  3. 10진법은 고대 이집트부터 전세계 통일.

상세

  1. 10진법이 정착된 가장 큰 이유는 손가락이 10개이기 때문.
  2. 손가락으로 2진법을 적용하면 1024 까지의 수를 셀 수 있다.

특징

  1. 10진법에서만 해당되는 수의 분류

피보나치수, 정n각수, n제곱수, 친화수, 부부수, 사교수,소수, 합성수, 약수의 개수가 n인 자연수, 소인수의 개수가 n인 자연수, 각 소인수 지수의 총합이 n인 자연수, 제곱인수가 없는 정수, 불가촉 수, 반완전수, 괴짜수, 두 소수의 합으로 나타내는 방법이 n가지인 수, n가지의 방법으로 표현할 수 있는 가장 작은 수, n가지 방법으로 표현할 수 있는 수의 개수, 두 소수의 합으로 나타내는 방법이 n가지일 때, 서로 다른 n가지 방법을 모두 썼을 때 사용되는 소수의 개수, 어떤 자연수의 모든 진약수의 합으로 나타내는 방법이 n가지인 자연수, n가지의 방법으로 나타낼 수 있는 가장 작은 수.

  1. 진법에 전혀 관계 없이 항상 그대로이다.

ETC

  1. 한국에서 숫자를 기록하거나 말할 때 초, 중, 후 를 나누는 기준
    1. 0~2 - 초반
    2. 3~6 - 중반
    3. 7~9 - 후반

12진법(duodemical)

개요

  1. 10진법처럼 숫자를 기록하는 방식.
  2. 4 이하의 모든 자연수의 최소공배수로 2, 3, 4, 6으로 나눠지므로 등분이 편리.

표현 법

  1. 18976(10) ⇒ 10 x 12^3 + 11 x 12^2 + 9 x 12 + 4 ⇒ AB94(12)
A B 9 4
10 x 12^3 11 x 12^2 9 x 12 4

특징

  1. 시간 단위
    1. 시계, 달력, 황도 12궁, 십이지 및 갑오개혁 이전의 시간(자시, 오시) 등에서 볼 수 있듯 시간 쳬계에서 12를 한 단위로 쓰는 경우가 많다.
    2. 각도기 없이 고전적 방법으로 원(태양 주기)를 일정하게 나눌 때 12로 나누는 것이 이상적.

16진법(hexdecimal)

개요

  1. 0~15 범위의 숫자를 통해 숫자를 표현하는 진법.
  2. 컴퓨팅 분야의 숫자 표현 위한 진법 방식.
  3. 2진수의 가독성 향상을 위해 나온 진법 체계.

표현 법

  1. 10~15의 수는 A, B, C, D, E, F를 통해 표현.
1 2 3 4 5
1 2 3 4 5
6 7 8 9 10
6 7 8 9 A
11 12 13 14 15
B C D E F
  1. 16진법 ⇒ 2진법 변환
    1. 25FB(16) ⇒ 0010(2)0101(5)1111(F)1011(B) ⇒ 10010111111011(2)
  2. 2진법 ⇒ 16진법 변환
    1. 10111010101010101011110100010(2) ⇒ (000)1 0111 0101 0101 0101 0111 1010 0010 ⇒ 175557A2(16)

ETC

  1. C에서 16진법을 사용할 때는, 숫자 앞에 0x를 붙이는 규칙이 존재.
int hexdecmial = 0x1234;
  1. 컴퓨터에서 16진법을 사용하는 이유는, 자릿수 하나가 2^4를 표현할 수 있기 때문.
  2. 훈련된 상황이면 16진법의 숫자를 보고 바로 2진법 수로 변환이 가능하기 때문에 유용.
  3. 16진수로 표시되는 함수(SHA256)을 쓰는 비트코인과도 밀접한 관계를 갖는다.
  4. 블록 헤더를 구성하는 요소들도 0x가 들어간다.

60진법(sexagesimal)

개요

  1. 60을 한 묶음으로 하여 자릿수를 올려가는 방법.
  2. 시간을 재는데 주로 사용.

ETC

  1. 화씨 온도는 60진법을 기반으로 만들어졌다.
  2. 기하학에서 각도의 단위로 쓰였다.
  3. 인코딩 NewBase60은 대소문자를 구분해서 쓴다.
#include <stdio.h>
#define BIT 16

void printB(int num)
{
    int MAX = BIT; // BIT MAX 지정

    while (MAX--)
        printf("%d", (num >> MAX) & 1); // 연산 및 표출
    printf("\n");
}

int main()
{
    int num = 0;

    printf("INPUT => ");
    scanf_s("%d", &num); // 10진수 입력 값
    printf("NUM => %d",num);
    printf("\n");
    printf("\n* BINARY\n=> ");
    printB(num); // 2진수
    printf("* OCTAL\n");
    printf("=> %o\n",num); // 8진수
    printf("* HEXDECMIAL\n");
    printf("=> %x", num); // 16진수
    return (0);
}
2023-04-29 00:02:25

  • Source Port / Destination Port : 출발지 포트와 목적지 포트.
  • Sequence Number : 올바른 순서로 데이터로 보내기 위한 고유 일련번호.
  • Acknowledgement Number : 다음 세그먼트를 수신할 준비가 된 상태를 나타내는 번호.
  • Header Length : Header 길이를 32bit 단위로 나타냄. 최소 필드값 20Bytes.
  • Control Flag Field : 6개의 segment 상태를 나타내기 위한 공간. ( 0,1 표시)
  • Window Size Field : TCP segment의 내용 유효 검증.
2023-04-29 00:00:35

- IPV4

- IPV6

  • Version 필드 (4bit) : TCP/IP 제품은 IPv4를 사용.
  • Header Length 필드 (4bit) : IP 헤드의 길이를 32비트 단위로 나타냄. 대부분의 IP 헤더 길이는 20바이트. 필드 값은 거의 항상 5.
  • (5*32 = 160bit or 20Byte)
  • Type-of-Service Flags : 서비스의 우선 순위를 제공.
0 보통 (normal) 보통 데이터 취급. 대부분 IP 데이터는 이 분류 속함.
1 비용 최소화 (Minimize Cost) 비용이 가장 적게 드는 경로 통해 패킷 라우트 할 것을 요구하는 경우 사용. (플래그0 - 보통1 - 저비용)
2 신뢰성 최대화 (Maximize Reliability) 신뢰성 있는 네트워크 통해 패킷을 라우트 할 것을 요구하는 경우 사용. (플래그0 - 보통1 - 높은 신뢰성)
4 처리량 최대화 (Maximize Throughput) 데이터 패킷이 많은 처리를 하면서 라우트 할 것을 요구하는 경우 사용. (플래그0 - 보통1 - 높은 처리량)
8 지연 최소화 (Minimize Delay) 데이터 보다 더 신속한 패킷의 라우트를 요구하는 경우 사용. 자신의 입력 에코(echo)를 신속하게 보고 싶어하는 Telnet과 같은 App에 유용. (플래그0 - 보통1 - 지연 줄임)
15 보안 최대화 (Maximize Security) 안전한 경로를 통해 패킷을 라우트할 것을 요구할 수 있다고 함. 실험용이므로 지원 하지 않는 공급 업체가 많다.

 

Telnet 8
FTP Control Channel 8
FTP Data Channel 4
Trivial FTP 8
SMTP Commands 8
SMTP Data 4
DNS UDP Query 8
DNS TCP Query 0
DNS Zone Transfer 4
NNTP 1
ICMP Error Messages 0
SNMPP 2
  • Total Packet Length 필드 (16bit) : 전체 IP 패킷 길이를 바이트 단위로 나타냄.
  • Fragment Identifier 필드 (16bit) : 분열이 발생한 경우, 조각을 다시 결합, 원래의 데이터를 식별하기 위해 사용.
  • Fragmentation Flags 필드 (3bit) : 첫 1bit는 항상 0 설정, 나머지 2비트의 용도는 다음과 같음.
    • May Fragment : IP 라우터에 의해 분열된 여부.
      • 플래그 0 - 분열 가능 1 - 분열 방지
    • More Fragments : 원래 데이터의 분열 조각 더 있는지 판단.
      • 플래그 0 - 마지막 조각, 기본값 1 - 조각 더 있음.
  • Fragmentation Offset 필드 (13bit) : 8바이트 오프셋으로 조각에 저장된 원래 데이터의 바이트 범위.
  • Time-to-live 필드 (8bit) : 데이터를 전달할 수 없는 것으로 판단되어 소멸되기 전 데이터가 이동할 수 있는 단계의 수를 나타냄. Time-to-Live 필드는 1~255 사이 값을 지정하며 라우터들은 패킷을 전달 할 때마다 이 값을 하나씩 감소시킴.
  • Protocol Identifier 필드 (8bit) : 상위 계층 프로토콜
    • 1 - ICMP | 2 - IGMP | 6 - TCP | 17 - UDP
  • Header Checksum 필드 (16bit) : IP 헤더의 체크섬을 저장, 라우터를 지나갈 때 마다 재 계산을 해서 속도가 떨어짐.
  • Source IP Address 필드 (32bit) : 출발지 IP 주소
  • Destination IP Address 필드 (32bit) : 목적지 IP 주소
  • Option (선택적) 필드 (가변적) : Type-of-Service 플래그처럼 특별한 처리 옵션을 추가로 정의 가능.