페이지 폴트같은 경우는 폴트가 난 위치가 커널 영역이냐 유저 영역이냐에 따라 처리 과정이 다릅니다. 커널 영역에서 폴트가 난 경우는 pid 0 프로세스의 pgd 를 확인해서 실제 그 영역이 사용중이라면 현재 프로세스의 pgd 에도 같은 값으로 설정을 해줍니다. 이렇게 해주는 이유는, 커널 영역(0xc0000000~)은 모든 프로세스가 공유해야하는데 프로세스가 바뀔때마다 가상 공간 전체가 바뀌므로 하나의 기준점을(pid 0 process) 잡아서 사용합니다.
유저 영역이라면 현재 프로세스의 vm_area_struct 를 확인해서 사용가능한 영역이면 버디로 1개짜리 페이지 프레임을 할당받아서 사용가능하게 해줍니다. 물론 스와핑이 붙으므로 실제 동작 과정은 더 복잡합니다.
간단히, 버디는 실제 물리 메모리를 4k 페이지 단위로 나눈 페이지 프레임을 관리하는 알고리즘입니다. 이 알고리즘의 목표는 페이지 단위의 단편화를 제거하고, 보다 큰 물리적으로 연속적인 페이지 프레임을 유지하는 것입니다.
그리고 연속적이냐, 불연속적이냐는 물리적으로 연속적이냐, 불연속적이냐라는 의미입니다.
이게 무슨 말인가하면, 예를 들어, 가상 주소 공간 0xd0000000 ~ 0xd0004000 의 공간을 버디로 1개짜리 페이지 프레임 4개를 할당받아서 이어붙인다면, 이건 가상적으로는 연속이지만, 물리적으로는 비연속적인 공간입니다. 하지만 버디로 4 개짜리 페이지 프레임을 할당받으면 이건 물리적으로도 연속이 됩니다. 이게 필요한 경우는 실제 cpu 를 타고 나가는 주소의 경우는 pgd 나 pte entry 주소를 제외한 모든 주소가 mmu 를 거치므로 상관이 없지만, dma 같은 경우, 즉 다른 디바이스에서 메모리가 접근이 되는 경우는 물리적으로 연속적이지 않으면 문제가 됩니다.
페이지 폴트같은 경우는 폴트가 난 위치가 커널 영역이냐 유저 영역이냐에
페이지 폴트같은 경우는 폴트가 난 위치가 커널 영역이냐 유저 영역이냐에 따라 처리 과정이 다릅니다. 커널 영역에서 폴트가 난 경우는 pid 0 프로세스의 pgd 를 확인해서 실제 그 영역이 사용중이라면 현재 프로세스의 pgd 에도 같은 값으로 설정을 해줍니다. 이렇게 해주는 이유는, 커널 영역(0xc0000000~)은 모든 프로세스가 공유해야하는데 프로세스가 바뀔때마다 가상 공간 전체가 바뀌므로 하나의 기준점을(pid 0 process) 잡아서 사용합니다.
유저 영역이라면 현재 프로세스의 vm_area_struct 를 확인해서 사용가능한 영역이면 버디로 1개짜리 페이지 프레임을 할당받아서 사용가능하게 해줍니다. 물론 스와핑이 붙으므로 실제 동작 과정은 더 복잡합니다.
간단히, 버디는 실제 물리 메모리를 4k 페이지 단위로 나눈 페이지 프레임을 관리하는 알고리즘입니다. 이 알고리즘의 목표는 페이지 단위의 단편화를 제거하고, 보다 큰 물리적으로 연속적인 페이지 프레임을 유지하는 것입니다.
그리고 연속적이냐, 불연속적이냐는 물리적으로 연속적이냐, 불연속적이냐라는 의미입니다.
이게 무슨 말인가하면, 예를 들어, 가상 주소 공간 0xd0000000 ~ 0xd0004000 의 공간을 버디로 1개짜리 페이지 프레임 4개를 할당받아서 이어붙인다면, 이건 가상적으로는 연속이지만, 물리적으로는 비연속적인 공간입니다. 하지만 버디로 4 개짜리 페이지 프레임을 할당받으면 이건 물리적으로도 연속이 됩니다. 이게 필요한 경우는 실제 cpu 를 타고 나가는 주소의 경우는 pgd 나 pte entry 주소를 제외한 모든 주소가 mmu 를 거치므로 상관이 없지만, dma 같은 경우, 즉 다른 디바이스에서 메모리가 접근이 되는 경우는 물리적으로 연속적이지 않으면 문제가 됩니다.
헉...질문의 요지를 잘못 파악해서 주저리주저리 쓸데없는 얘기를 많이 했
헉...질문의 요지를 잘못 파악해서 주저리주저리 쓸데없는 얘기를 많이 했네요...-_-;
로그인을 안 해서 글도 안 지워지고...
커널에서 페이지 프레임을 관리하는건 오직 버디뿐입니다. 폴트가 났던, 불연속 공간에 메모리를 할당받던지간에 실제 페이지 프레임이 필요한 경우는 버디가 할당해줍니다.
이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~
댓글 달기