2011-10-20 2 views
1

이것은 실제 구현보다 많은 지식 문제와 같습니다. 시스템이 시작된 후 커널 기능이 다른 가상 주소를 가질 수 있는지 궁금합니다. 실행 가능한 컴파일에 대한 이해는 가상 주소가 바이너리로 할당되었지만 물리적으로 가상으로 실행은 실행시에 os에 의해 수행된다. (페이징, 나는 그걸 알고있다.) 따라서, 커널 기능의 경우에는 시스템을 재시작 할 때마다 다른 가상 주소를 갖는 것을보십시오. 1. 커널 함수가 주소 범위에서 어떻게 매핑됩니까? 2. 런타임시 다른 가상 주소에 맵핑 될 수 있습니까? (나는 그것이 어떻게 가능 할까?) 3. dll에 대한 주소 매핑은 어떻게되어 있습니까? 컴파일시 가상 주소가 부여되었거나 런타임에 상대 주소가 할당 되었습니까? (나는 그렇게 생각합니다.) 4. 커널 가상 주소가 물리적 메모리에 고정되어 있는지 확인하는 방법이 있습니까?커널 함수가 서로 다른 가상 주소를 가질 수 있습니까?

감사

답변

4

전통적으로, 실행 파일은 컴파일 시간에 고정 된 가상 주소 매핑을 할당됩니다. 그러나 최근 몇 년 동안, 이것은 보안에 좋지 않음이 드러났습니다. 공격자는 악용의 일부로 물건이 메모리에있는 정확한 위치에 대한 지식을 사용할 수 있습니다. 이를 완화하기 위해 위치 독립적이거나 재배치 가능한 실행 파일을 사용하여로드 주소가 무작위 화되도록 할 수 있습니다 (적어도 Linux에서는). 그러나 이것은 단점이 있습니다. 동적 로더가 재배치를 수행해야하기 때문에 프로그램을 시작하는 데 더 많은 시간이 걸립니다 (위치 독립적 시스템 코드에서 런타임에 추가 오버 헤드가 발생 함).

OS 커널의 경우 부트 오버 헤드에 비해 추가 오버 헤드가 거의 없습니다. 실제로 Windows 커널은 실제로 많은 구성 요소를 동적으로 연결합니다. 따라서 커널은로드 주소를 임의로 지정하는 분명한 장소입니다.

+0

감사합니다. 커널을 언로드 한 후 런타임에 다른 위치에 모듈을 다시로드합니다. 커널 라이브러리의 상대 매핑을 시도하지만 가상 모듈이로드되면 다른 모듈이 해당 주소에 종속적으로 변경됩니다. 하지만 이러한 주소가 쿼리해야하는 테이블에 유지되면 런타임로드/언로드가 작동 할 수 있습니다. 따라서 커널은 런타임에 가상 주소를 계속 이동할 수 있습니다. 그러나 시스템에서 발생할 수있는 몇 가지 중요한 커널 루틴에 대해이를 수행하지 못할 수도 있습니다 언로드 할 때) 어떤 가상 주소가 phy 메모리에 고정되어 있는지 알 수 있습니까? –

+1

@ agent.smith, 의견에서 복잡한 후속 조치를 요청하는 대신 다른 질문을하십시오. 또한 여러 가지 질문을하는 것 같습니다. 어떤 사람들은 질문 중 일부에 대해서만 답을 알 수 있지만 전부는 아는 것이 아니기 때문에 이것을 별개의 질문으로 질문하십시오. – bdonlan

1
  1. 어떻게 커널 기능이 주소 범위에 매핑됩니까?

사용자 공간에 매핑되지 않아도됩니다. 이 영역에서 연습을 중단 할 때까지 소프트 인터럽트에 도달했습니다.

+0

예. 따라서 4GB 주소 공간을 고려하면 공간의 절반 정도가 커널 코드/데이터와 절반 사용자 공간을 포함합니다. 커널 코드는 모든 사용자 공간 프로그램에서 동일하게 유지됩니다. 어떤 커넬 루틴을 호출하기를 원할 때 그곳으로가는 길은 그 주소 범위에 접근 할 수 없기 때문에 소프트웨어 인터럽트이다. 내가 알고 싶은 것은 커널 가상 주소가 주어지는 방법이다. –

+0

@ agent.smith 내가 말하는 것을 받아 들인다면 질문은 의미가 없습니다. 커널은 프로세스의 사용자 모드 공간과는 다른 자체 주소 공간을 가지고 있으므로 커널 주소가 사용자 공간에 매핑되는 방법에 대한 질문은 발생할 수 없습니다. – EJP

관련 문제