원래 유닉스 커널은 메모리를 어떻게 주소 지정합니까?

원래 유닉스 커널은 메모리를 어떻게 주소 지정합니까?

오늘날 거의 모든 커널은 MMU에서 제공하는 가상 메모리를 사용합니다. 이는 전역 페이지 테이블(주소가 CPU 레지스터에 있음)과 페이지 간 페이지 관리자/매퍼를 사용하여 이를 수행합니다. 예를 들어, "vm"은 vmlinuzLinux 커널이 가상 메모리를 지원함을 나타냅니다.

이 모든 것은 MMU가 연속 메모리 주소를 x86 아키텍처가 이해하는 메모리 세그먼트에 매핑하기 때문에 가능합니다.

실제로 원래 UNIX 커널 버전이 있었는데 vmunix, 비슷한 기술을 사용했을 것으로 생각됩니다. 그러나 원래 UNIX 커널은 MMU를 사용할 수 있기 전에 작성되었습니다. 내 기억이 맞다면 원래 UNIX 커널(줄여서 UNIX 커널 unix)은 x86 아키텍처가 존재하기 전에 작성되었습니다. 역사적으로 PDP-9와 PDP-11에서 실행되었습니다.

이 커널은 메모리 주소 지정 및 관리를 어떻게 수행합니까? 세그먼트 기반 주소 지정(두 개의 숫자)입니까, 아니면 전체 메모리 주소 지정(단일 숫자)입니까? 처리 간에 메모리를 어떻게 분리합니까?

답변1

가상 메모리는 Unix보다 거의 10년 앞서 있습니다.버로스 B50001961. 현대적인 의미(즉, 페이지 기반)의 MMU는 아니지만 동일한 기본 기능을 제공합니다.IBM 시스템/360 모델 67MMU는 1965년(유닉스보다 오래된)부터 존재해왔습니다. Intel x86 프로세서는 1986년 80386이 나올 때까지 MMU를 얻지 못했습니다.

MMU는 실제로 Unix 시스템을 구현하는 데 필요하지 않습니다. 어떤 형태의 가상 메모리가 필요합니다. 그렇지 않으면 구현이 필요합니다.fork시스템 호출매우 어렵습니다. fork기존 프로세스를 복사하여 프로세스를 생성하는 시스템 호출은 첫 번째 버전부터 Unix의 기본 부분이므로 가상 메모리가 필요합니다. 바라보다DM 리치(Ritchie)와 K. 톰슨(K. Thompson),UNIX 시간 공유 시스템, CACM, 1974, §V “프로세스 및 이미지”.

나는 Unix의 첫 번째 버전이 실행된 하드웨어에 대한 세부 사항을 모르지만 가상 메모리 형태를 가지고 있었습니다.분할된 아키텍처. CPU는 프로그램이 참조한 포인터(가상 주소)와 메모리의 실제 위치(물리적 주소) 사이를 변환합니다. 가상 주소에 오프셋을 추가하여 매핑을 수행합니다. 프로세스 간의 모든 컨텍스트 전환에서 오프셋을 포함하는 레지스터가 조정됩니다.

거의 모든 Unix 구현이 프로세스 격리를 제공하지만 메모리 보호가 없는 일부 역사적 하드웨어 구현은 그렇지 않았습니다(1970년대 또는 1980년대).미니엑스8088 및 80286). 메모리 보호는 가상화를 처리하는 데 다소 직교합니다. MMU는 두 기능을 모두 제공할 수 있는 반면 단순 분할 아키텍처는 그렇지 않으며 MPU1은 가상화 없이 보호를 제공할 수 있습니다. MMU가 없는 시스템의 경우 Linux 구현이 있습니다.uCLinux, 그러나 fork많은 프로그램이 누락되어 실행할 수 없습니다(지원되는 유일한 프로그램은 fork다음과 같습니다).vfork이를 위해서는execve그 후 즉시 아이를 부르세요.)

1 MPU(Memory Protection Unit)는 메모리의 각 페이지에 대한 액세스 권한을 기록합니다.

답변2

메모리 보호를 위해 페이징 MMU가 필요하지 않습니다.

페이징 MMU는 메모리 조각화(큰 청크를 사용할 수 없음) 및 mmap파일에서 가장 최근에 사용한 부분만 메모리에 유지됨과 같은 더 많은 고급 문제를 해결합니다. 모든 프로세스에서 파일 액세스를 캐시하기 위해 "통합 페이지 캐시"를 구현하려면 페이징 MMU가 필요합니다.

그러나 기본적인 메모리 보호는 이전 Unix 구현에서 가능했던 보다 간단한 "세그먼트화"를 통해 수행할 수 있습니다. 예를 들어 보호된 커널 메모리는 사용자 모드 코드를 실행할 때 "액세스 금지"로 설정된 세그먼트에 배치될 수 있습니다. 최신 페이징 운영 체제인 Linux에서도 시스템 호출은 brk()분할 sbrk()구현 시대의 호환성 유지로 존재합니다.

기본적으로 분할은 고정 크기 페이지의 가변 수 대신 고정된 수의 가변 크기 "페이지"(실제로는 세그먼트라고 함)만 얻는다는 점을 제외하면 페이징 MMU와 약간 비슷합니다.

오늘날에도 SRAM이 몇 킬로바이트에 불과한 저가형 마이크로 컨트롤러에는 분할 기능이 존재하므로 실제 페이징 MMU가 없더라도 보호된 메모리를 갖춘 소형 운영 체제를 구현할 수 있습니다.

관련 정보