프로세스 address space에 유저 스페이스와 커널 스페이스가 따로 존재하는 이유?

ktyktukti의 이미지

처음에는 커널 스페이스가 같은 프로세스의 영역에 접근하기 위해서라고 생각했는데
커널은 제한 없이 유저스페이스에 접근이 가능하다고 들었습니다.
왜 그런데 굳이 커널 스페이스가 존재해야 하나요?
그냥 메모리의 일정영역에 커널이 존재하고
interrupt가 발생하면 그것을 커널이 해결하면 되지 않을까요?

바라미의 이미지

커널 스페이스는 말그대로 커널이 사용하는 자료구조 및 변수,함수 등이 들어있는 메모리 영역입니다.
이것들은 하나라도 잘못된 값이 들어가게 되면 시스템에 치명적인 문제가 발생하죠.

따라서 유저 프로세스들이 커널 스페이스에 접근할 수 없도록 영역을 구분해둔 것입니다.
유저 프로세스에서 잘못된 포인터 연산으로 커널의 자료구조나 변수가 잘못된 값으로 되게되면 심하면 커널 패닉까지 일어나기에
커널 스페이스를 유저 스페이스영역에서 접근할 수 없도록 한겁니다.

그 과정에서 단순히 메모리에 존재하는 위치만 다르게 하는건 안정하지 않은 방법이기에,
아예 메모리 주소를 나누어 놓고 일정영역은 커널만 사용할 수 있게 해 놓은 것입니다.

님께서 말씀하신 사항들은 이미 사용하고 있습니다. 인터럽트가 발생하면 해당 함수가 호출 되는데, 그것들이 전부 커널 스페이스에 들어있는 거죠.

그렇다고 시스템에서 커널용으로 용량을 잔뜩잡아 놓고 있다고 생각하시는 분도 있을터인데.
리눅스는 페이징을 사용하기에 실제로 메모리를 잔뜩 잡아놓지 않습니다. 메모리를 추가로 필요할 때마다 페이징 유닛을 통해 할당하고, 안쓰게 되면 해제하게 되는거죠.