본문 바로가기
운영체제

윈도우즈 운영체제: 기본 개념 및 용어 소개 2

by oobw 2023. 10. 17.

지난 글에 이어서 추가적으로 윈도우즈 운영체제의 기본 개념들에 대해서 다룹니다. 이번 글에서는 잡(JOB), 가상 메모리, 커널 모드, 유저 모드에 대해서 간략히 소개합니다.

작업 (Job)

Windows는 프로세스 모델에 '작업(Job)'이라는 확장 기능을 제공합니다. Windows에서의 작업(Job)은 프로세스 그룹을 관리하는 객체로 이해할 수 있습니다. 여러 프로세스들을 하나의 그룹으로 묶어 관리함으로써, 리소스 할당이나 제한 등을 효율적으로 관리할 수 있습니다. 특히, 관련 프로세스들 간의 리소스 사용을 제한하거나 모니터링 할 때 유용합니다. 예를 들면, 특정 잡에 속한 모든 프로세스가 사용할 수 있는 최대 메모리 양을 지정하는 것이 가능합니다. 또한 작업과 연관된 모든 프로세스들에 대한 기본 계정 정보들도 기록을 합니다. Windows에는 프로세스 간의 트리 구조가 존재하지 않아서 그룹 관리가 어려운데 작업 객체의 도입을 통해  이 부재를 어느 정도 보완합니다. 

 

Process Explorer를 통해 이 작업 객체에 대해서 관찰 할 수 있습니다. 작업에 의해 관리되는 프로세스를 갈색으로 표시할 수 있습니다. 이 기능은 기본적으로 활성화되어 있지 않지만 옵션 메뉴를 통해 활성화할 수 있습니다. 또한, 프로세스의 속성 페이지에는 작업 객체 자체에 대한 정보를 제공하는 추가적인 '작업' 탭이 있습니다. 이를 통해 프로세스에 대해서 어떤 '작업'에 속해있는지 파악 할 수 있습니다.

가상 메모리 (Virtual memory)

가상 메모리 관리는 운영체제들이 모두 제공하는 가장 중요한 개념 중에 하나입니다. 가상 메모리는 물리적 메모리의 크기를 초과하는 프로그램 실행을 가능하게 하는 시스템입니다. 이는 디스크의 일부를 RAM처럼 사용하여, 실제 물리적 메모리보다 큰 용량의 메모리를 프로그램에 제공하는 것처럼 보이게 합니다. 가상 메모리는 프로세스마다 독립된 메모리 공간을 제공하여, 다른 프로세스의 메모리 영역을 침범하는 일을 방지합니다.

 

Windows는 각 프로세스에 커다란 개별적인 주소 공간을 갖는 것처럼 느끼게 하는 선형적 주소 공간을 기반으로 한 가상 메모리 시스템을 구현하고 있습니다. 가상 메모리는 메모리에 대한 논리적인 모습을 제공하고 이 것은 실제 물리 메모리와는 일치하지 않을 수 있습니다. 런타임 도중에 메모리 관리자는 하드웨어의 도움을 받아 가상 주소를 실제 저장된 물리 주소로 변환하거나 매핑합니다. 가상 메모리를 통해 운영체는 개별 프로세스들이 서로 충돌하거나 다른 프로세스의 메모리를 침범하여 보안을 해치는 등의 위협으로부터 보호합니다.

실행 중인 프로세스에서 사용되는 총 가상 메모리보다 훨씬 적은 물리 메모리를 가진 대부분의 시스템에서 메모리 관리자는 일부 메모리 내용을 디스크로 전송, 또는 페이징합니다. 디스크로 데이터를 페이징하면 물리 메모리를 해방시켜 다른 프로세스나 운영 체제 자체에 사용될 수 있게 합니다. 스레드가 디스크로 페이징된 가상 주소에 접근하면, 가상 메모리 관리자는 디스크에서 정보를 다시 메모리로 로드합니다.

페이징을 활용하려면 응용 프로그램을 어떤 방식으로도 변경할 필요가 없으며, 하드웨어 지원으로 메모리 관리자는 프로세스나 스레드의 지식이나 도움 없이 페이징할 수 있습니다. 가상 메모리의 일부가 물리 메모리(RAM)로 매핑되는 반면 다른 부분은 디스크로 페이징됩니다. 이러한 조각들은 페이지라고 불리며, 기본 크기는 4 KB입니다.

가상 주소 공간의 크기는 하드웨어 플랫폼마다 다릅니다. 32비트 x86 시스템에서는 가상 주소 공간의 이론적 최대치가 4 GB입니다. 기본적으로, Windows는 이 주소 공간의 하반부를 프로세스의 고유한 개인 저장소를 위해 할당하고 상반부를 보호된 운영 체제 메모리 활용을 위해 할당합니다. 32비트 Windows에서 지원하는 두 가지 전형적인 가상 주소 공간 레이아웃이 있습니다. 64비트 Windows는 프로세스에 훨씬 더 큰 주소 공간을 제공합니다. 

커널 모드 vs 유저 모드

Windows는 중요한 운영 체제 데이터에 접근하고 수정하는 사용자 응용 프로그램을 보호하기 위해 유저 모드와 커널 모드라는 두 가지 프로세서 접근 모드를 사용합니다.

 

커널 모드는 운영체제의 핵심 부분이 실행되는 모드입니다. 이 모드에서는 모든 하드웨어 리소스에 접근할 수 있으며, 시스템의 중요한 작업을 수행합니다. 예를 들어, 디바이스 드라이버나 인터럽트 핸들러와 같은 시스템 수준의 코드가 여기에서 실행됩니다.

 

유저 모드는 일반 애플리케이션이 실행되는 모드입니다. 이 모드에서는 제한된 권한으로 실행되므로, 핵심 시스템 리소스나 데이터에 직접 접근하는 것은 불가능합니다. 만약 애플리케이션에서 시스템 서비스나 리소스에 접근해야 하는 경우, 시스템 호출을 통해 커널 모드로 전환하여 해당 작업을 수행합니다. 

 

응용 프로그램 코드는 사용자 모드에서 실행되며, 시스템 서비스나 장치 드라이버와 같은 OS 코드는 커널 모드에서 실행됩니다. 커널 모드는 모든 시스템 메모리와 모든 CPU 명령어에 대한 접근 권한을 부여하는 프로세서의 실행 모드를 나타냅니다. 일부 프로세서는 코드 권한 레벨 또는 링 레벨과 같은 용어로 이러한 모드를 구분하는 반면, 다른 프로세서는 감독자 모드와 응용 프로그램 모드와 같은 용어를 사용합니다. 무엇이라고 부르든, 프로세서가 운영 체제 커널에 사용자 모드 응용 프로그램보다 더 높은 권한 레벨을 제공함으로써, 운영 체제 설계자는 오작동하는 응용 프로그램이 전체 시스템의 안정성을 방해할 수 없도록 보장하는 필요한 기반을 제공합니다.

Windows 프로세스마다 고유한 개인 메모리 공간이 있지만, 커널 모드 OS와 장치 드라이버 코드는 단일 가상 주소 공간을 공유합니다. 가상 메모리의 각 페이지는 페이지를 읽고/또는 쓰기 위해 프로세서가 어느 접근 모드에 있어야 하는지 나타내기 위해 태그됩니다. 시스템 공간의 페이지는 커널 모드에서만 접근할 수 있으며, 사용자 주소 공간의 모든 페이지는 사용자 모드와 커널 모드에서 접근할 수 있습니다. 읽기 전용 페이지(정적 데이터를 포함하는 페이지와 같은)는 어떤 모드에서도 쓰기 가능하지 않습니다. 또한, no-execute 메모리 보호를 지원하는 프로세서에서 Windows는 데이터가 포함된 페이지를 실행 불가능하게 표시함으로써 데이터 영역에서의 의도하지 않은 또는 악의적인 코드 실행을 방지합니다.

반면에 커널 모드에서 실행되는 컴포넌트에 의해 사용되는 메모리 접근은 어떠한 보호도 제공하지 않습니다. 다시 말해, 커널 모드에 있으면 OS 및 장치 드라이버 코드는 시스템 공간 메모리에 완전히 접근할 수 있고 객체에 접근하기 위해 Windows 보안을 우회할 수 있습니다. Windows OS 코드의 대부분이 커널 모드에서 실행되므로, 커널 모드에서 실행되는 컴포넌트가 시스템 보안을 위반하거나 시스템 불안정성을 야기하지 않도록 주의 깊게 설계되고 테스트되어야 합니다.

64비트 및 ARM 버전의 Windows 8.1에서는 커널 모드 코드 서명(KMCS) 정책이 모든 장치 드라이버(플러그 앤 플레이만 해당되는 것이 아님)가 주요 코드 인증 기관 중 하나에 의해 할당된 암호화 키로 서명되어야 한다고 명시하고 있습니다. 사용자는 관리자로서도 서명되지 않은 드라이버의 설치를 명시적으로 강제할 수 없습니다. 그러나 한 번의 예외로, 이 제한을 수동으로 비활성화할 수 있습니다.

Windows 10에서는 더욱 중요한 변경이 이루어졌으며, 모든 Windows 10 드라이버는 일반 파일 기반 SHA-1 인증서와 그 20개의 기관 대신 SHA-2 확장 검증(EV) 하드웨어 인증서로만 서명되어야 합니다. EV로 서명된 후, 하드웨어 드라이버는 SysDev 포털을 통해 Microsoft에 제출되어야 하며, 드라이버는 Microsoft 서명을 받게 됩니다. 

 

사용자 응용 프로그램은 시스템 서비스 호출을 할 때 사용자 모드에서 커널 모드로 전환됩니다. 예를 들면, Windows의 ReadFile 함수는 결국 파일에서 데이터를 읽는 실제 Windows 루틴을 호출해야 합니다. 그 루틴은 내부 시스템 데이터 구조에 접근하기 때문에 커널 모드에서 실행되어야 합니다. 특별한 프로세서 명령의 사용은 사용자 모드에서 커널 모드로의 전환을 트리거하고, 프로세서가 커널 내의 시스템 서비스 디스패치 코드로 진입하게 합니다. 이것은 차례로 Ntoskrnl.exe 또는 Win32k.sys 내의 적절한 내부 함수를 호출합니다. 사용자 스레드에 제어권을 반환하기 전에, 프로세서 모드는 다시 사용자 모드로 전환됩니다. 이런 방식으로, OS는 자체와 데이터를 사용자 프로세스의 검토와 수정으로부터 보호합니다.

 

이상으로 Windows 운영체제의 주요 개념인 작업(Job), 가상 메모리, 커널 모드, 유저 모드에 대해 간략히 살펴보았습니다. 이러한 기본 개념들을 이해하면 Windows의 작동 원리와 구조를 더 깊게 파악하는 데 도움이 될 것입니다.