리눅스 커널의 이해에서 메모리 세그먼트 방식에 대한 질문입니다
글쓴이: 익명 사용자 / 작성시간: 수, 2011/08/10 - 6:30오후
'리눅스 커널의 이해' 2장 58페이지부터 67페이지에 설명된
하드웨어 세그먼테이션, 리눅스에서의 세그먼테이션, 세그먼트 디스크립터에 대한 설명을 읽어봤는데
무슨 말인지 이해가 전혀 안되네요
이 설명이 흔히 메모리 모델 중 세그먼트 방식과 페이징 방식에서의
그 세그먼트 방식에 대해 설명하고 있는 것인가요?
제가 페이징 방식은 알고 있는데
세그먼트 방식은 전혀 몰라서...
그 메모리 세그먼트 방식이 맞다면,
혹시 그 세그먼트 방식이 현재 리눅스에도 일반적으로 사용되고 있는 건가요?
아니면 특별한 경우나 일부에서만 사용되고 있는 것인가요?
답변주시면 감사하겠습니다
Forums:
알고 계시는 그 세그먼트가 맞을겁니다.
기본적으로 논리 주소에서 물리 주소로의 변환은
Logical Address >> Segment Unit >> Linear Address >> Paging Unit >> Physical Address
이런 과정으로 이루어집니다.
하지만, 실제로 리눅스에서는 다른 아키텍처와의 호환성을 위해서 세그먼테이션보다 페이징을 선호합니다.
Talk is cheap. Show me the code.
https://www.potatogim.net/
답변 감사합니다
답변 감사합니다
말씀하신 그 부분이 항상 애매한데,
"하지만, 실제로 리눅스에서는 다른 아키텍처와의 호환성을 위해서 세그먼테이션보다 페이징을 선호합니다."
이 의미가 현재 리눅스에서 세그먼테이션 방식을 사용하지 않고 페이징 방식만 사용한다는 것인지,
아니면 두 방식 모두 사용하는데 페이징 방식 위주로 사용한다는 것인지 궁금합니다.
그건 아닙니다.
단, 제한적으로 코드 & 데이터 세그먼트와 TSS, LDT 정도에만 세그먼테이션이 적용되고,
이외의 메모리 어드레싱에 관해서는 페이징이 적용되는 것으로 알고 있습니다.
커널의 이해에서는 RISC 프로세서와의 호환성이 이야기가 나왔던 것으로 기억하고 있기에 그 부분에 대해 말씀을 드렸었습니다.
Talk is cheap. Show me the code.
https://www.potatogim.net/
네
네 알겠습니다
그러니까 기본적으로는 페이징을 사용하고
일부에서(코드 & 데이터 세그먼트와 TSS, LDT 정도) 세그먼테이션도 사용된다고 이해하면 되겠네요
답변 감사했습니다
리눅스가 페이징을 선호하는 건 두가지
리눅스가 페이징을 선호하는 건 두가지 이유때문인데,
1. 모든 프로세스가 동일한 세그멘테이션 레지스터 값을 사용할 때 메모리 관리가 더 간단하다.
2. 리눅스의 디자인 목표는 이식성이다. RISC 구조는 세그멘테이션에 대한 지원이 제한되어 있다.
검색해보니 이렇게 나오네요~
세그멘테이션 혹은 페이징이 물리 메모리 1:1로 맵핑되어 그냥 쓰이는 일은 없을 거라고 들었습니다.
가상메모리 개념이 들어가야 고정분할(?) 뭐 이런것들 하고 좀 더 다르니까요.
그리고 알고 계시는 개념이 맞는듯 합니다.
세그멘테이션으로 나누고 그게 또 페이징으로 나누고.. 이런식으로 리눅스에서 쓰이는 걸로 알고 있습니다.
물리 메모리는 버디 알고리즘이던가.. 그걸로 또 관리가 되고요~
#################
Enjoy Life~!
제알 알고 있는 배경 지식 내에서 말씀
제가 알고 있는 배경 지식 내에서 말씀 드려봅니다.
최초? 8086 프로세서에서 세그멘테이션을 지원했습니다. (CS, DS, SS 레지스터...)
이를 통해 640KB의 제한된 물리 메모리를 가변 분할 방법으로 사용했습니다.
당시에는 아예 페이징이 지원되지 않았습니다.
이 후 80386, 486...에서는 리얼모드의 한계를 극복한 보호모드가 도입 되었고 페이징 기술이 적용 되었습니다.
하지만 하위 호환성을 이유로 x86은 프로세서 시작 시 세그멘테이션만 사용 할 수 있는 리얼모드로 진입 하도록 만들었습니다.
윈도우는 리얼모드, 보호모드 모두에서 세그멘테이션을 유용하게 사용한다고 합니다.
(어떻게 사용을 하는지는 코드가 공개 되지 않아 알 수 있는 방법이 없다고 합니다.)
8086과는 달리 ARM, MIPS와 같은 RISC 프로세서는 훨씬 늦게 만들어진 프로세서 입니다.
애시당초 기술적 한계로 인해 리얼모드 같은 방식을 사용할 필요가 없었습니다.
즉, 태생부터 보호보드와 페이징을 지원하였습니다.
리눅스는 x86의 과거 잔재인 8086 하위 호환을 위해 세그멘테이션을 지원하고 있습니다.
하지만 실질적으로 세그멘테이션이라는 용어가 정의하고 있는 메모리 관리 동작은 하지 않고 있습니다.
x86이 어떻게 세그멘테이션을 하는지는 "만들면서 배우는 OS 커널의 구조와 원리"에 잘 나와있습니다.
참고로 ARM, MIPS와 같은 RISC 프로세서는 페이징만을 사용합니다.
댓글 달기