문제

내 질문은 커널에서 사용자 공간 프로그램으로 데이터를 전달하는 것입니다. 시스템 호출 "get_data (size, char *buff, char ** meta_buf)"를 구현하고 싶습니다. 이 호출에서 버프는 사용자 공간 프로그램에 의해 할당되며 크기 인수로 길이가 전달됩니다. 그러나 Meta_buf는 (사용자 공간 프로그램의 VM 페이지에서) 할당되고 커널로 채워진 가변 길이 버퍼입니다. 사용자 공간 프로그램은이 지역을 해방시킬 것입니다.

(사용자 공간 프로그램이 Meta_buff의 크기를 알지 못하므로 사용자 공간에 데이터를 할당 할 수 없습니다. 또한 사용자 공간 프로그램은 고정 된 양의 메모리를 할당하고 시스템 호출을 다시 전화하여 전체 메타 데이터를 읽을 수 없습니다. Meta_Data는해야합니다. 하나의 단일 시스템 호출로 반환 됨)

  1. 커널 스레드에서 사용자 공간 프로그램에 대한 메모리를 어떻게 할당합니까? (비슷한 작업을 수행하는 다른 시스템 호출을 지적 할 수 있더라도 감사하겠습니다. 커널에 할당하고 사용자 공간에서 자유롭게 할 수 있습니다)
  2. 이 인터페이스가 맞습니까 아니면 더 좋은 방법이 있습니까?
도움이 되었습니까?

해결책

커널에서 사용자 공간에 메모리를 할당하려고 시도하지 마십시오. 이것은 커널의 추상화 레이어링을 크게 위반 한 것입니다. 대신 몇 가지 다른 옵션을 고려하십시오.

  • 사용자 공간에 필요한 공간이 얼마나 필요한지 묻습니다. 사용자 공간은 할당 된 다음 커널에서 메모리를 가져옵니다.
  • 사용자 공간 MMAP 페이지를 운전자가 소유 한 주소 공간에 직접 소유하도록하십시오.
  • 필요한 데이터 양에 대한 상한을 설정하십시오. 그렇게 많이 할당하십시오.

모르면 더 많은 말을하기가 어렵습니다 이것은 원자력이어야합니다. 실제로 메모리를 할당하는 것은 어쨌든 방해 할 필요가 있거나 성공하지 못할 가능성이 높습니다. 따라서 커널로 나가는 것이 많이 아프지 않을 것입니다. 사실로, 어느 사용자 공간 메모리에 쓰십시오 ~ 해야 하다 IO가 필요한 페이지 결함의 가능성이 있으므로 방해 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top