0

운영체제에서 세그먼트 화 주제를 다뤘습니다.세그먼트 화의 작동 방식과 세그먼트 테이블에서 실제 메모리 주소를 계산하는 방법

세분화의 개념은 메모리에로드 된 프로세스의 주소 공간에 존재할 수있는 여유 공간으로 인해 발생한다는 것을 알게되었습니다.

제발 나와 함께있어주세요. 나는 내 연구에서 이해 한 몇 가지 사항을 먼저 설명하려고 노력할 것입니다. 잘못이 있다면 제게 정정하십시오.

은 세분화 이상적인 경우

내가 프로세스 주소 공간에 배치되지 않을 수도 memory.As에로드 된 작은 주소 공간과 프로세스를하지 않을 수있는 사용되지 않는 예를 들어 말할 수 있습니다 실제 메모리의 시작. 프로그램 코드 (코드 세그먼트, PC가 지시되는 명령이 실행되는 곳에서부터)를 실제 물리적 메모리 주소로 변환하는 메커니즘이 필요하다. 따라서 우리는 실행중인 프로세스의 기본 값과 바운드 값을 유지하는 하드웨어 레지스터 (MMU)를 사용합니다. 실행중인 프로세스의 총 크기 또는 프로세스가 배치 된 실제 메모리의 시작 주소 인 기본 값입니다. 실행중인 프로세스의 마지막 주소. MMU가 전역이므로 컨텍스트를 전환하는 동안 기본/경계 값을 저장해야합니다.

그래서 여기 physical memory address = virtual memory address + base;

이제 우리는 큰 주소 space.We와 프로세스를 힙 및 스택 사이에 많은 양의 무료 공백을 포함 할 수있는 프로세스 주소 공간 여유 공간의 활용도에 대한 분할과 같은 몇 가지 메커니즘이 필요 말할 수 또는 코드 및 힙.

세그먼트 화를 위해 우리는 각 프로세스에 대한 세그먼트 테이블을 유지 관리합니다 (컨텍스트 스위칭 중에 PCB에 테이블을 저장해야 함).

분할에서 우리는 실행중인 프로세스 주소 공간의 각 논리 세그먼트에 대한 기본/바운드 값을 유지합니다. 이상적으로 우리는 코드, 스택 및 힙 세그먼트 각각에 대한 기준/경계 값을 유지하고 이러한 값을 세그먼트 테이블에 저장합니다.

그래서 세그먼트 테이블에 .. 같이 다소

 Segment | Base | Bounds 
    --------------------------- 
    Code  | 16K | 1K 
    Heap  | 28K | 1K 
    Stack | 20K | 2K 

을 보일 것입니다 물리적 메모리는 무엇과 같이 몇 가지를 보일 수 있습니다 ..

0 |---------------------| 
    |   OS   | 
    |      | 
       .... 
    |      | 
    |      | 
    |      | 
16K |---------------------| 
    | (program code) |    
    |      |    
17K |---------------------| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxx free xxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
20K |---------------------|    
    |      | 
    |      | 
    |  (stack)  |    
    |      |    
22K |---------------------|    
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxx free xxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
28K |---------------------|    
    |      | 
    |  (heap)  |    
29K |---------------------|    
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxx free xxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
    |xxxxxxxxxxxxxxxxxxxxx| 
32K |---------------------| 

을 이제 프로세서가 변환 할 필요가있는 경우 코드 명령어를 실행하는 동안 가상 메모리 주소를 실제 메모리 주소로 가져 오는 방법 세그먼트 테이블에 많은 기본 값이있을 수 있으므로 어떤 기본 값을 선택해야하는지 어떻게 알 수 있습니까?

명령이 일부 스택 변수를 업데이트한다고 가정 해 봅시다.이 경우 스택의 기본 값을 어떻게 선택합니까?

그래야 실제 메모리 주소 = 스택의 기본 주소 + 명령어의 가상 메모리 주소가됩니까?

외부 조각화와 별도로 세그먼트 화의 단점은 무엇입니까?

세분화 // 페이지/가상화의 개념에 대한 자세한 설명이 포함 된 외부 링크는 정말 유용 할 것입니다.

감사합니다.

+0

세그먼트 화는 kludge입니다. 그것은 항상 진흙탕이었습니다. 메모리 관리 (특히 인텔이 마침내 64 비트 모드에서 세분화를 버린 이후)를 이해하려면 세그먼트없이 가상 메모리 시스템 시스템이 어떻게 작동하는지 배우는 것이 좋습니다. – user3344003

+0

이 질문은 프로그래밍이 아닌 컴퓨터 아키텍처 설계 및 구현에 관한 주제이므로 다루지 않습니다. 작동하지 않는 프로그램이 있으면 여기에 올릴 수 있습니다. 아마도 http://cs.stackexchange.com이이 유형의 질문에 더 적합 할 것입니다. –

답변

1

세그먼트 화를 지원하는 프로세서에는 프로세서가 컨텍스트에 따라 올바른 세그먼트를 선택하는 데 사용할 내부 또는 외부 레지스터가 있어야합니다. 그것은 프로세서 아키텍처에 의존합니다. 지원 세그먼트 화에 대해 알고있는 유일한 프로세서는 Intel 프로세서입니다.

세그먼트 레지스터/선택기가 x86 인 경우 (Intel 8086 : Segmentation) cs, ds, ss입니다. 프로세서는 명령어를 실행하는 동안 코드 cs 세그먼트를 사용하고 그렇지 않은 경우를 제외하고는 메모리가있는 데이터 세그먼트 ds을 사용하거나 스택 명령어 ss을 스택 명령어로 스택합니다.

x86을 제외한 대부분의 최신 프로세서는 페이징 만 지원합니다. 따라서 대부분의 최신 운영 체제에서 메모리 관리, x86 세그먼트 화 effect is disabled을 통합하고 페이징을 사용하여 가상 메모리를 관리해야합니다.

관련 문제