운영 체제의 복잡한 내부 구조는 일부 이해하지만 커널과 사용자 공간을 이해하는 데는 큰 격차가 있습니다.
이제 이것을 어떻게 이해하는지 설명하겠습니다.
먼저, 플랫 메모리인 RAM
예가 있으며 , 또는 메커니즘을 사용하여 메모리의 모든 부분에 액세스할 수 있습니다 .8GB
CPU
DMA
Virtual Memory
시스템이 시작되면 초기 단계에서 부트로더가 메모리에 로드되지만 이 단계에서는 메모리가 원시 상태이므로 커널이 이러한 기능을 제공하므로 개념이 없습니다 . 여기에 대해 궁금한 점이 두
가지 모드가 더 있습니다 .real mode
protected mode
내가 아는 한 이러한 모드는 CPU 기능입니다. 주요 차이점은 보호 모드에서는 프로세스가 자체 메모리 공간에 격리된다는 것입니다. 하지만 이것이 어떻게 작동합니까? 프로세스는 단지 운영 체제 개념입니다. 이 단계에서는 메모리에 운영 체제가 로드되어 있지 real
않으며 protected mode
, 메모리는 다른 장치에서 액세스할 수 있는 하드웨어일 뿐입니다. 예를 들어 메모리에 로드된 BIOS는 메모리의 모든 영역에 액세스할 수 있습니다. 하지만 이것은 A 프로세스가 아니며 메모리의 일부 주소에 0과 1만 로드되고 CPU는 각 명령어를 하나씩 읽고 실행합니다.
예를 들어, 커널이 메모리에 로드된 후 커널은 0x000000 to 0x000fff
다른 모든 메모리에서 메모리를 가져옵니다. 이는 프로그램에 사용할 수 있는 여유 메모리입니다. 이제 우리는 메인 프로그램을 커널 메모리에 로드했지만 이는 CPU가 실행하는 명령어 목록일 뿐입니다.
내가 이해하는 한, 커널은 필요한 모든 서비스, 관리자를 설정합니다... 이제 커널은 사용 가능한 메모리를 사용하기 위한 API를 제공합니다(예: RAM 크기 - 메모리의 커널 크기 - + 다양한 인터럽트 핸들러 및 기타 항목). CPU
권한 모드 라는 기능도 있는데 , 이는 CPU
장치에 대한 액세스를 제어하는 레지스터의 플래그일 뿐이며, 현재 권한이 장치에 액세스하기에 충분하지 않으면 CPU가 인터럽트 등을 트리거합니다.
내가 맞나요?
이 깃발은 누가 통제하나요? 예를 들어, 사용자 공간의 코드가 커널 모드에 들어가고 해당 플래그가 높은 권한으로 설정된 경우 사용자 프로그램이 전체 메모리에 액세스하여 나쁜 작업을 수행할 수 없는 이유는 무엇입니까?
또 다른 개념은 입니다 system call
. 시스템 호출은 덜 까다로운 기능에 사용되며 특권 모드에서만 사용할 수 있습니다.
실제 시스템 호출이 무엇인지는 모두가 알고 있지만 glibc
이것은 단지 사용된 래퍼일 뿐이며 시스템 호출이 필요한 메모리 주소를 어떻게 알 수 있습니까? 예를 들어 프로세스가 시스템 호출을 원할 때 glibc는 이를 어디에 넣을지 IP (instruction pointer)
, 시스템 호출을 수행하는 방법을 어떻게 알 수 있습니까?
제가 이해하기 가장 어려운 것 중 하나는 커널과 사용자 공간이 함께 작동한다는 것입니다. 커널 공간과 사용자 공간이 두 사람이 혼자 일하고 필요할 때 User space guy
도움을 요청하는 것과 같은 그림과 다이어그램이 많이 있습니다.Kernel guy
그런데 그만해, 무슨 일이야? single CPU system
한 번에 하나의 명령어만 실행한다고 생각해 보세요 . 병렬 작업이 없으면 CPU는 하나만 있습니다.
커널 및 사용자 공간 측면에서 작동하는 방식. CPU만 있었다면 사용자 모드에서 커널 모드로 전환하는 일이 정말 충격적이었습니다.
이러한 사항을 이해하도록 도와주세요. 질문을 강조하고 답을 찾으려고 노력했지만 여전히 성공하지 못했습니다. 어쩌면 제가 훌륭한 기사를 놓쳤을 수도 있으니 어떤 도움이라도 주시면 감사하겠습니다.
답변1
리얼 모드는 잊어버리세요. 이는 1980년대 프로세서와 호환되도록 설계된 x86 아키텍처의 세부 사항일 뿐입니다.
프로세서에는 현재 권한 수준을 나타내는 플래그가 있습니다. 이 플래그의 세부 사항은 프로세서 유형에 따라 다르지만 단순화를 위해 사용자와 커널이라는 두 가지 설정으로 생각하면 됩니다.
권한 수준을 변경할 수 있는 프로세서 명령어가 있습니다. 안전을 위해 가장 중요한 것은더 높은 권한 수준을 입력하면 미리 정의된 주소로 이동합니다.. 주소는 커널 코드에 의해서만 수정이 허용되는 레지스터에 있거나 사용자 모드에서 액세스할 수 없도록 커널(MMU를 통해)에 의해 구성된 메모리에 있을 수 있습니다. 이 주소의 코드는 사용자 코드의 요청을 주의 깊게 확인하며 사용자 코드의 임의 요청을 수락하지 않습니다.
일반적으로 더 높은 권한을 얻는 방법에는 여러 가지가 있습니다. 시스템 호출(사용자 코드가 명시적으로 커널 모드로 전환할 때), 인터럽트(주변 장치가 프로세서에 작업을 수행해야 한다고 신호를 보낼 때), 트랩(프로세서가 커널 모드로 전환하려고 할 때) 등 최소한 세 가지가 있습니다. 매핑되지 않은 메모리에 액세스하거나 알 수 없는 명령과 같은 잘못된 cide를 실행합니다.
시스템 호출에서 사용자 코드는 점프할 위치를 지정하지 않고 단지 시스템 호출 명령을 발행하고 프로세서가 점프할 위치를 결정합니다. 호출할 시스템 호출을 결정하기 위해 커널 코드는 레지스터의 내용을 확인합니다. 일반적으로 시스템 호출 번호가 포함된 레지스터가 있으며 커널의 시스템 호출 스케줄러는 테이블에서 해당 번호를 찾습니다.
당신은 또한 볼 수 있습니다사용자 공간에서 커널 공간으로의 전환그리고커널은 악성 프로그램이 모든 물리적 RAM을 읽는 것을 어떻게 방지합니까?