먼저 사용자 공간 메모리 쓰기, 사용자 공간에서 버퍼를 malloc을 내가 읽을 수있는, 마지막으로,
을, 커널 버퍼의 포인터를 전달 넷 링크 소켓을 사용, 그리고 'A'
모두와 함께 버퍼를 작성 사용자 공간에서 직접 전달 된 원시 포인터를 사용하여 버퍼를 작성합니다.
왜?
커널에서 사용자 공간 메모리에 직접 액세스 할 수있는 이유는 무엇입니까?
Linux Device Driver, Third Edition, 415 페이지에 따르면 커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다.커널 읽기/
Q
커널 읽기/
1
A
답변
0
요점은 커널에서 직접 사용자 주소에 액세스하면 가끔이 작동한다는 것입니다.
할당 된 동일한 프로세스의 컨텍스트에서 사용자 주소에 액세스하려고 시도하고 프로세스가 이미 오류를 일으켰으며 사용자가 3 : 1 메모리 매핑을 사용하는 커널을 사용하는 경우 (4 : 4 맵핑을 사용하는 경우도 있음) 커널이 할당이있는 페이지를 스왑 아웃하지 않으면 액세스가 작동합니다.
문제는 이러한 모든 조건이 항상 올바른 것은 아니며 프로그램 실행 시간에서 다른 조건으로 변경 될 수 있다는 것입니다. 따라서 커널 드라이버 작성자는 사용자 주소에 액세스 할 수 있어야합니다.
일어날 수있는 최악의 상황은 작동한다고 가정하고 실험실에서 항상 작동하게하고 고객 사이트에서 너무 자주 충돌하게 만드는 것입니다. 이것이 책 발표문의 이유입니다.
0
이 책에서 '커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다'라는 말은 물리적 메모리에 관한 것입니다. 다른 말로 - 커널은 물리적 메모리에 한 번에 매핑 될 수있는 x86에서 800-900 MB 밖에 없습니다. 전체 물리적 메모리 커널에 액세스하려면이 영역을 계속 재 매핑해야합니다.
넷 링크는 물리적 메모리를 전혀 다루지 않습니다. 이것은 사용자 공간 < -> userspace 또는 userspace < -> kernelspace 사이의 양방향 통신을 위해 설계되었습니다.
관련 문제
- 1. 커널 모듈에서 dmesg 읽기
- 2. 커널 공간의 블록 장치에서 읽기
- 3. 리눅스 커널 매개 변수 읽기
- 4. 커널 모드 레지스트리 액세스 읽기?
- 5. 리눅스 커널 Procfs 다중 읽기/쓰기
- 6. 포인터가있는 커널 내에서 커널 메모리에 액세스
- 7. UMDF 드라이버에서 커널 모드 드라이버로 IRP 읽기/쓰기 패킷을 보내십시오.
- 8. 리눅스 커널 프로그래밍, 코딩 또는 읽기 학습을 시작하는 방법은 무엇입니까?
- 9. 리눅스 커널 모듈의 문자 장치
- 10. DST_METRIC_READ_ONLY 커널 3.0.26을 비활성화하는 방법
- 11. 커널 API 또는 커널 API 사용
- 12. 커널 : UNIX
- 13. 커널 추정은
- 14. 커널 모듈
- 15. 커널 추정
- 16. 커널 구성
- 17. 리눅스 커널
- 18. 커널 개발
- 19. 커널 프로그래밍
- 20. malloc에 커널
- 21. CUDA 커널
- 22. 변경 커널
- 23. 시스템에 다른로드가없는 syscalls 차단 (Linux 커널)
- 24. 커널 작업간에 데이터를 공유하는 방법은 무엇입니까? (커널/커널 태스크가있는 게임 엔진)
- 25. 프로그램은 어떻게 소통 하는가 - 마이크로 커널 모 놀리 식 커널 엑소 커널
- 26. 어떻게 커널 스레드 통신을 할 수 있습니까?
- 27. 출구 장치 용 커널 sk_buff 빌드 리눅스 커널
- 28. 비 커널 헤더를 포함하여 Linux 커널 (2.6) 모듈을 컴파일
- 29. 커널 스레드를 이해하는데 문제가 있습니다. 실제로 커널 스레드는 무엇입니까?
- 30. 커널 : 커널 빌드를위한 새로운 소스 파일을 추가하는 방법은 무엇입니까?
@BaliC Linux Device Driver, 제 3 판, 15 장, 메모리 매핑 및 DMA, 고/저 메모리 부분 커널은 커널의 주소 공간에 매핑되지 않은 메모리를 직접 조작 할 수 없습니다. – Ali
미안하지만 내 실수는 숙제처럼 보였다! :) –