UFO ET IT

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

ufoet 2020. 12. 8. 20:29
반응형

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


나는 누군가가 리눅스 커널 소스에서 사용되는 __user 매크로의 뉘앙스를 설명 할 수 있기를 바랍니다.

우선 매크로 :

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

이제 인터넷 검색을 통해이 매크로를 사용하면 포인터를 사용자 주소 공간에 속하는 것으로 지정할 수 있으며 역 참조해서는 안된다는 것을 읽었습니다.

몇 가지 명백한 사실이 누락되었을 수 있지만 누군가 그러한 매크로의 의미를 설명해 주시겠습니까? 예를 들어,이 매크로가 어디에 사용되는지에 대한 좋은 예는 무엇입니까? 다시 말하지만, 내가 명백한 것을 놓치고 있으면 용서하십시오.

이를 어떤 맥락에서 설명하기 위해 USB 코드 (linux / usbdevice_fs.h)를 검사하는 동안 매크로를 건너 왔습니다. 커널 내에서 사용되는이 매크로 (또는 이와 유사한 다른 매크로)에 대한 일반적인 이해를 찾고 있습니다.

찾아 주셔서 감사합니다!


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


나는 __user가 사용자 공간 포인터를 표시하고 개발자 / 시스템에게 그것을 신뢰하지 말라고 말한다고 생각합니다. 사용자가 "유효하지 않은"포인터를 제공하면 커널이 참조를 시도하고 (커널은 모든 곳에서 참조 할 수 있음) 자체 공간을 손상시킬 수 있습니다.

예를 들어 "read"(in you usbdevice_fs.h)에서 결과를 쓸 (__user) 버퍼를 제공해야합니다. 따라서 copy_to_user를 사용해야하지만 memcopy, strcpy 또는 이와 유사한 것은 사용하지 마십시오.

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


__user매크로와 같은 다른 매크로를 정의 __force/ __kernelcompiler.h 헤더 파일 등. 실제로 GCC / ICC 등의 기존 컴파일러에는 사용되지 않습니다. 그러나 sparse와 같은 커널 정적 분석 도구에 유용합니다 (자세한 내용은 여기에서 Sparse-Linux Kernel Newbies). __user/ __kernel/ __forceetc 와 같은 매크로를 언급하면 ​​희소성에 대한 특별한 의미를 유지합니다. Linux 커널 메일 링리스트에서 Linus Torvalds는 다음과 같이 사용법을 설명합니다.

이것은 기억하는 것이 중요합니다. gcc의 경우 희소 주석은 의미가 없습니다. 그들은 여전히 그냥 이야기하는 것이 유용 할 수있는 프로그래머 가 상당히 읽을 수있는 방식으로 "이봐, 당신이있어 그 포인터는 정상적인 포인터가 아니었다",하지만 당신은 스파 스 사용하지 않는 한 결국, 실제로하지 않습니다 것을.

하나. 당신이 때 어떻게 사용 구문 분석을, 그것은 문제가 완전히 다른 것입니다. "sparse"의 경우 "__iomem"에는 많은 의미가 있습니다.

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

즉 "iomem"은 두 가지 별개의 것을 의미합니다. 이는 희소가 불평해야 함을 의미합니다.

포인터가 직접 역 참조 ( "noderef"포인터)되고 일반 주소 공간 (0)과 반대로 "주소 공간 2"에있는 경우.

이제, 이는 그러한 포인터가 정규 포인터를 원하는 함수에 전달되면 희소 가 불평 할 것이라는 것을 의미합니다 (일반 포인터가 아니기 때문에 분명히 "strcmp ()"등과 같은 작업을해서는 안됩니다). , 그리고 sparse는 다른 주소 공간의 다른 포인터로 캐스팅하려고 시도하면 불평합니다.

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

반응형