sourcecode

Linux __user 매크로의 의미는 무엇입니까?

copyscript 2022. 7. 23. 13:54
반응형

Linux __user 매크로의 의미는 무엇입니까?

Linux 커널 소스에서 사용되는 __user 매크로의 뉘앙스를 설명해 주셨으면 합니다.

우선, 매크로:

# define __user         __attribute__((noderef, address_space(1)))

이 매크로는 포인터를 사용자 주소 공간에 속하는 것으로 지정할 수 있으므로 참조되지 않도록 합니다.

제가 몇 가지 명백한 사실을 놓치고 있는 것 같습니다만, 그런 매크로의 의미를 설명해 주실 수 있을까요?예를 들어, 이 매크로가 어디에 사용될지에 대한 좋은 예는 무엇입니까?다시 말씀드리지만, 제가 명백한 것을 놓쳤다면 용서해주세요.

어떤 맥락에서 보면, USB 코드(linux/usbdevice_fs.h)를 검사하는 중에 매크로에 액세스했습니다.커널 내의 이 매크로(또는 이와 유사한 것)의 사용에 대한 일반적인 이해를 구하고 있을 뿐입니다.

봐주셔서 감사합니다!

이를 통해 sparse와 같은 툴은 커널 개발자에게 신뢰할 수 없는 포인터(또는 현재 가상 주소 매핑에서 유효하지 않을 수 있는 포인터)를 부적절하게 사용하고 있음을 알릴 수 있습니다.

__user는 사용자 공간 포인터를 표시하고 개발자/시스템에 신뢰하지 말라고 말합니다.사용자가 "잘못된" 포인터를 제공하면 커널은 이를 참조하려고 하고(커널은 어디에서나 참조할 수 있음에 유의하십시오) 자체 공간을 손상시킬 수 있습니다.

예를 들어 "read"(usbdevice_fs.h에서는)에서 결과를 쓸 (_user) 버퍼를 제공해야 합니다.따라서 copy_to_user를 사용해야 하지만 memcopy, strcpy 등은 사용할 수 없습니다.

주의: 이것은 공식적인 정의/설명은 아니지만 제가 알고 있는 유일한 부분입니다.

__user는 다른 됩니다.__force/__kernel을 사용하다GCC/ICC 등의 기존 컴파일러에는 전혀 도움이 되지 않습니다.단, 스파스와 같은 커널 정적 분석 도구에 유용합니다(자세한 내용은 여기: 스파스 - Linux 커널 뉴비).다음과 같은 매크로를 언급할 때__user/__kernel/__forceetc는 sparse에 특별한 .Linux Torvalds linux linux linux 。

이 점은 기억해야 합니다.gcc의 경우 스파스 주석은 의미가 없습니다.프로그래머에게 "이봐, 네가 받은 포인터는 정상적인 포인터가 아니야"라고 말하는 것만으로도 여전히 유용할 수 있지만, 결국, 스파스를 사용하지 않는 한, 그들은 실제로 아무것도 하지 않는다.

하지만.parse를 사용하는 경우는 전혀 다른 문제입니다."sparse"의 경우 "_iomem"은 다음과 같은 많은 의미를 가집니다.

# define __iomem __attribute__((noderef, address_space(2)))

즉, "iomem"은 두 가지 개별적인 것을 의미합니다. 즉, 희박하게는 불만을 제기해야 한다는 것을 의미합니다.

포인터가 직접 참조되지 않고('noderef' 포인터) 일반 주소 공간(0)이 아닌 '주소 공간 2'에 있는 경우.

즉, 이러한 포인터가 일반 포인터가 필요한 함수에 전달된 경우(일반 포인터가 아니기 때문에 해당 포인터에서 "strcmp()" 등의 작업을 해서는 안 되기 때문에), sparse가 다른 주소 공간에 있는 다른 포인터에 전송하려고 하면 sparse가 불평합니다.

언급URL : https://stackoverflow.com/questions/4521551/what-are-the-implications-of-the-linux-user-macro

반응형