일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 앙버터마카롱
- 금별맥주
- graphql
- graphql with RN
- graphql 400
- 비동기배열
- promise메서드
- 비동기배열처리방법
- 토라비
- 고르드
- 홍대 토라비
- apolloclient
- 잠실새내 도그존
- 홍대 카페 장쌤
- 잠실새내
- typescript
- graphql react native
- 예쁜술집 예술
- 운정 소바동
- 신촌 소문난집
- promise처리
- graphql mutation error
- 화이트 해커를 위한 웹 해킹의 기술
- 지보싶 신촌점
- 도그존
- useMutation error
- 화이트해커를 위한 웹 해킹의 기술
- graphql with reactnative
- apollo react native
- 홍대 예술
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
8086 Memory Architecture, register 본문
8086 Memory Architecture
시스템이 초기화되면 시스템은 커널을 메모리에 적재, 가용 메모리 영역(available space)를 확인한다.
시스템은 운영에 필요한 기본적인 명령어 집합을 커널에서 찾기 때문에 커널은 반드시 저 위치에 존재해야한다.
32bit 시스템
:CPU가 한꺼번에 처리할 수 있는 데이터가 32bit단위로 되어 있기 때문에 메모리 영역에 주소를 할당할 수 있는 범위가 0~(2^32)-1 이다.
64bit 시스템
:CPU가 64bit씩 처리할 수 있으므로 메모리 영역의 범위 는 0~(2^64)-1 이 된다.
위와 같이 운영체제는 하나의 프로세스를 실행시키면 프로세스를 segment라는 단위로 묶어서 가용 메모리 영역에 저장시킨다. 오늘날 시스템은 멀티 태스킹(multi-tasking)이 가능하기 때문에 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업을 수행할 수 있다.
-> 가용 메모리 영역에 여러 개의 segment들이 저장될 수 있다.
멀티 태스킹(multi-tasking)
:다수의 프로세스가 CPU와 같은 공용자원을 나누어 사용하는 것
Segment
:하나의 프로세스를 묶은 것으로 실행 시점에 실제 메모리의 어느 위치에 저장될 지가 결정된다.
:최대 2^32byte 크기를 갖는다.
:하나의 segment는 code segment, data segment, stack segment로 구성되어 있다.
Code segment
:시스템이 알아들을 수 있는 명령어, instruction등이 있다.
:어셈블리어가 기계어가 되어 들어가는 부분!
instruction은 분기과정과 점프를 수행하는데, 이 과정에서 메모리 상의 특정 위치에 있는 명령을 지정해주어야한다.
그러나 Segment는 실행 시점에 실제 메모리의 어느 위치에 저장될 지 결정되기 때문에
컴파일 과정에서는 어느 위치에 저장될 지 알 수 없어서 정확한 메모리 주소를 지정할 수 없다.
->logical address를 사용한다.
local address를 통해 실제 physical address 구하는 방법
local address는 실제 메모리 상의 주소와 매핑되어 있다.
또한 Segment는 segment selector에 의해 자신의 시작위치 (offset)을 알 수 있다.
따라서 Segement는 시작위치(offset)로부터 상대적인 위치(local address)에 있는 명령을 수행할 지 결정한다.
실제 physical address = offset + logical address
위의 그림을 예시로 IS1의 실제 메모리상 주소를 찾아보자.
0x80010000(offset) + 0x00000100(logical address) = 0x80010100(physical address, 실제 메모리 상의 주소)
Data segment
:프로그램 실행시에 사용되는 전역변수들이 들어가는 공간
:현재 모듈의 data structure, 상위 레벨로부터 받아들이는 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 데이터로 나뉜다.
Stack segment
:현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역(즉, 버퍼가 자리잡는 영역)
:프로그램이 사용하는 multiple 스택을 생성 (스택들 간의 switch 가능)
:지역변수들이 자리잡는 공간
:Last In First Out 구조
-스택은 처음 새성될 때 필요한 크기만큼 만들어지고 프로세스 명령에 의해 데이터를 저장해 나가는 과정을 거치게 된다.
-SP(stack pointer) 레지스터가 스택의 맨 꼭대기를 가리키고 있어 이를 이용해 스택에 데이터 저장,읽기 가능
-SP가 가리키는 곳까지가 데이터가 채워진 영역!
8086 CPU 레지스터 구조
CPU가 프로세스를 실행하기 위해서 프로세스를 CPU에 적재시킨다.
흩어져 있는 명령어 집합과 데이터들을 적절하게 처리 및 저장하기 위해 CPU 내부에 존재하는 메모리를 사용한다.
->CPU 내부에 존재하는 저장공간을 레지스터라고 한다.
레지스터는 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스트럭션(instruction) 포인터로 구성된다.
범용 레지스터
: 프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터
: 논리연산, 수리연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자 메모리 포인터가 저장된다.
범용 레지스터의 종류는 다음 글에서 더 자세히 다루고 있다.
2020/09/06 - [컴퓨터 시스템] - 어셈블리어 명령어와 범용 레지스터
세그먼트 레지스터
:특정 세그먼트를 가리키는 포인터 역할을 한다.
:code segment, data segment, stack segment를 가리키는 주소가 들어가 있다.
-
CS (code segment): 코드 세그먼트의 시작주소
-
DS (data segment): 데이터 세그먼트의 시작주소, 데이터의 위치를 알아낸다.
-
SS (stack segment): 스택 세그먼트의 시작 주소, 메모리 상에 스택 구현을 가능하게 함, 주소와 데이터 임시 저장목적으로 스택을 사용.
-
ES: 메모리 주소지정을 다루는 문자 데이터 연산에서 사용
-
FS, GS: 기억장소 요구사항을 다룬다.
플래그 레지스터
:0,1로 상태를 나타내는 레지스터
:Status Flag와 System Flag로 나뉜다.
Instruction Pointer
:다음 실행할 명령어가 있는 현재 code segment의 offset(시작위치) 값을 가진다.
:하나의 명령어 범위에서 선형 명령 집합의 다음 위치를 가리킬 수 있다.
:control-transfer instruction(JMP, Jcc, CALL, RET)와 IRET instruction이 있는 주소값을 가진다.
EIP register (Extended Instruction register)
:확장된 명령지시자, CPU에게 다음 할 일을 전달, 다음 할 일을 기억
:소프트웨어에 의해 바로 엑세스 불가능 (control-transfer instruction이나 inerrupt, exception에 의해 제어됨)
=>Instruction pointer 값을 수정한다면 EIP 레지스터의 값을 간접적으로 지정할 수 있음
따라서 CPU의 다음 할 일을 임의로 바꿀 수 있다.
(Instruction pointer의 값을 수정해서 CPU에게 원래 해야하는 일이 아닌 우리가 만든 코드를 실행하도록 하면 해킹성공!)
출처: (달고나)와우해커 BOF 기초
'컴퓨터 시스템' 카테고리의 다른 글
gdb 명령어 모음 (0) | 2020.09.07 |
---|---|
gdb 사용하기 (0) | 2020.09.06 |
어셈블리어 명령어와 범용 레지스터 (0) | 2020.09.06 |
컴퓨터 시스템의 기초 (0) | 2020.09.05 |