전공/시스템프로그래밍

[05] BYTE ORDERING

vss121 2022. 10. 27. 23:29
Memory model

Physical memory

- DRAM chips can read/write 4, 8, 16 bits 

- DRAM modules can read/write 64 bits

 

Programmer's view of memory

Conceptually very large array of bytes 굉장히 큰 공간을 연속적으로 할당받고 있다

 Stored-program computers: keeps program codes and data in memory

 Running programs share the physical memory

• OS handles memory allocation and mangement

 

word size

• Nominal size of integer-valued data

- Including addresses (= pointer size)

 

• Machines use 32 bits (4 bytes) words

- Limits addresses to 4GB

- Becoming too small for memory-intensive applications

32b 컴 -> 가상공간 2^32 -> 4GB

 

• Most current systems use 64 bits (8 bytes) words

- Potential address space ~ 1.8 X 1019 bytes (18 Exabyte)

- x86-64 machines support 48-bit addresses: 256 Terabytes <- Intel 64b CPU + OS 사용시

 

• Machines support multiple data formats

- Fractions or multiples of word size

- Always integral number of bytes

 

 

Data Representations

2^64 -> 8B 필요

1byte는 8bit.

1byte는 16진수 두 글자 들어감

 

Word-level Memory Access

Addresses specify byte locations   / 메모리에는 전부 다 address가 있음
• Address of first byte in word
• Addresses of successive words differ by 4 (32-bit) or 8 (64-bit)
• Usually, addresses should be aligned to the word boundary

4B, 8B로 OS가 쉽게 관리하기 위해 워드 단위로 메모리 조각 관리

access는 1B 단위로도 ㄱㄴ

 

Byte Ordering
How should bytes within multi-byte word be ordered in memory?


• Big Endian 

Least significant byte has highest address / 높은 address 쪽으로

MSB부터 차례대로 높은 쪽으로 저장된다고 생각하자

• Little Endian 반대로!!!

Least significant byte has lowest address

끝~0

LST부터 차례대로 높은 쪽으로 저장된다고 생각하자

//0D0C0B0A


• Problem when the binary data is communicated over a network between different machines

binary data를 주고받을 때 메모리 저장하는 방식이 달라서 맞춰주어야

 

 

 

Byte Ordering Example (2)

Disassembly
• binary machine code -> text

• Generated by program that reads the machine code

 

0x12ab 값이

pad to 32bits : 0x000012ab

split into bytes : 00 00 12 ab

메모리 저장에는 reverse : ab 12 00 00 // little endian 반대로

 

C -> 어셈블리어 -> 기계어

 

Byte Ordering Example (3)

What is the output of this program?
• Solaris/SPARC: big endian 12 34 56 78
• Linux/x86: little endian 78 56 34 12

#include <stdio.h>
union { 
int i;
unsigned char c[4];
} u;

int main () { 
u.i = 0x12345678;
printf ("%x %x %x %x\n", u.c[0], u.c[1], u.c[2], u.c[3]);
}

 

 

Representing Integers

int A = 15213; // 3B6D

빅엔 00 00 3B 6D

리엔  6D 3B 00 00

리엔 6D 3B 00 00 00 00 00 00

 

int B = -15213

빅엔 93 C4 FF FF

리엔 FF FF C4 93

 

Representing Pointers

Different compilers & machines assign different locations to objects

int *P = &B;

P 저장?

 

Representing Strings

Represented by array of characters • Each character encoded in ASCII format
- Standard 7-bit encoding of character set 

- Character "0" has code 0x30
- Digit i has code 0x30+i
• String should be null-terminated
- Final character = 0x00 = '\0'
- Not '\n'
Compatibility
• Byte ordering not an issue

 

문자열을 한 바이트 한 바이트 들의 배열로 취급됨

각 바이트를 하나씩 연속해서 저장

한 바이트 내에서는 바이트 오더링 필요없음

따라서 똑같이 저장됨

string 형태로 주고받으면 됨

-str 문자열은 char 배열이기 때문에 바이트를 하나씩 연속해서 저장한다. 따라서 Endian 형식과 상관이 없다.