2012-01-17 2 views
1

먼저 사용자 공간 메모리 쓰기, 사용자 공간에서 버퍼를 malloc을 내가 읽을 수있는, 마지막으로,
을, 커널 버퍼의 포인터를 전달 넷 링크 소켓을 사용, 그리고 'A'
모두와 함께 버퍼를 작성 사용자 공간에서 직접 전달 된 원시 포인터를 사용하여 버퍼를 작성합니다.
왜?
커널에서 사용자 공간 메모리에 직접 액세스 할 수있는 이유는 무엇입니까?
Linux Device Driver, Third Edition, 415 페이지에 따르면 커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다.커널 읽기/

+0

@BaliC Linux Device Driver, 제 3 판, 15 장, 메모리 매핑 및 DMA, 고/저 메모리 부분 커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다. – Ali

+0

미안하지만 내 실수는 숙제처럼 보였다! :) –

답변

0

요점은 커널에서 직접 사용자 주소에 액세스하면 가끔이 작동한다는 것입니다.

할당 된 동일한 프로세스의 컨텍스트에서 사용자 주소에 액세스하려고 시도하고 프로세스가 이미 오류를 일으켰으며 사용자가 3 : 1 메모리 매핑을 사용하는 커널을 사용하는 경우 (4 : 4 맵핑을 사용하는 경우도 있음) 커널이 할당이있는 페이지를 스왑 아웃하지 않으면 액세스가 작동합니다.

문제는 이러한 모든 조건이 항상 올바른 것은 아니며 프로그램 실행 시간에서 다른 조건으로 변경 될 수 있다는 것입니다. 따라서 커널 드라이버 작성자는 사용자 주소에 액세스 할 수 있어야합니다.

일어날 수있는 최악의 상황은 작동한다고 가정하고 실험실에서 항상 작동하게하고 고객 사이트에서 너무 자주 충돌하게 만드는 것입니다. 이것이 책 발표문의 이유입니다.

0

이 책에서 '커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다'라는 말은 물리적 메모리에 관한 것입니다. 다른 말로 - 커널은 물리적 메모리에 한 번에 매핑 될 수있는 x86에서 800-900 MB 밖에 없습니다. 전체 물리적 메모리 커널에 액세스하려면이 영역을 계속 재 매핑해야합니다.

넷 링크는 물리적 메모리를 전혀 다루지 않습니다. 이것은 사용자 공간 < -> userspace 또는 userspace < -> kernelspace 사이의 양방향 통신을 위해 설계되었습니다.

관련 문제