커널 소스 파일에 math.h #include 를 포함시키는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1012742

  •  06-07-2019
  •  | 
  •  

문제

Linux 커널 모듈에 Math.h를 포함 시키려고합니다. 내가 사용하면

#include '/usr/include/math.h'

그것은 나에게 오류를 준다 :

error: features.h: No such file or directory
error: bits/huge_val.h: No such file or directory
error: bits/mathdef.h: No such file or directory
error: bits/mathcalls.h: No such file or directory

왜 이런거야?

도움이 되었습니까?

해결책 11

전문가 관점에서는 커널 공간과 사용자 공간 간의 데이터를 전달하는 좋은 접근법이 아닙니다. 커널 공간에서 또는 사용자 공간에서만 완전히 작동합니다.

그러나 하나의 해결책은 사용할 수 있습니다 읽다() 그리고 쓰다() 커널 모듈로 명령하여 사용자 공간과 커널 공간 사이의 정보를 보냅니다.

다른 팁

커널 모듈에서 C 라이브러리를 사용할 수 없으므로 수학 라이브러리 부분에 더욱 그렇습니다.

커널 공간에 사용자 공간 C 모듈을 포함시킬 수 없습니다. 또한이 일을하고 싶습니까? 이 스레드가 도움이 될 수 있습니다 http://kerneltrap.org/node/16570. 커널 내부에서 수학 기능을 수행 할 수 있습니다. http://lxr.linux.no/ 필요한 기능의 경우.

커널에서는 표준 라이브러리를 사용할 수 없습니다. 여기에는 LIBC, LIBM 등이 포함됩니다. 해당 라이브러리의 일부 기능은 ~이다 커널 공간에서 구현되면 일부는 그렇지 않습니다. 당신이 전화하려고하는 것을 모르고, 커널 공간에서 당신이하려는 일을 해야하는지 확실히 말하는 것은 불가능합니다.

또한 커널은 FPU에 액세스 할 수 없습니다. 이는 작업 전환시 시간을 절약하기위한 것입니다 (FPU 레지스터를 저장하면 컨텍스트 스위치를 수행 할 때 불필요한 오버 헤드가 추가되기 때문에). 너 ~할 수 있다 실제로 원한다면 커널 공간에서 FPU에 액세스 할 수 있지만 그렇게 할 때 사용자 공간의 FPU 레지스터를 버리지 않도록주의해야합니다.

편집하다: 이것 FPU에 대한 경고를 나보다 훨씬 더 잘 요약합니다.

플로팅 포인트 작동은 커널에서 지원되지 않습니다. 커널 컨텍스트에서 사용자 컨텍스트로 전환 할 때 레지스터를 저장해야하기 때문입니다. 커널이 플로팅 포인트를 사용한다면 플로팅 포인트 레지스터도 저장해야하므로 각 컨텍스트 스위치에 대해 성능이 나빠질 수 있습니다. 따라서 부동 소수점은 거의 필요하지 않기 때문에 특히 커널에서는 지원되지 않습니다.

당신이 정말로해야한다면 :

  • 어쩌면 부동 소수점 지원으로 자신의 커널을 컴파일 할 수 있습니다.
  • 부동 소수점 작업 내에서 컨텍스트 스위치를 차단할 수 있습니다.
  • 가장 좋은 점은 고정 점 산술을 사용하는 것입니다.

Afaik 커널 공간은 사용자 공간과 분리되며 소스 코드도 마찬가지입니다. /usr/include는 일반 프로그래밍을위한 것입니다.

이것 커널에서 플로팅 포인트 수학을 수행하는 것은 사용자 공간 코드에서 간단하지 않다고 제안합니다. 또 다른 이것은 이것이 어렵다는 것을 암시합니다.

여전히 더 확실한 답을 찾고 있습니다.

글쎄요, 모듈에 필요한 기능을 다시 작성할 수 있습니다. 더럽지만 작동해야합니다 ...

귀하의 의견에 감사드립니다

수학 기능을 사용합니다

커널 소스 파일에서 평면 C 응용 프로그램을 만들고 변수를 통과 할 수 있습니까? 따라서 C 응용 프로그램은 변수를 계산하고 정보를 다시 보냅니다.

커널 소스 파일 (커널 공간) ---> C 응용 프로그램 (사용자 공간)

                                       |

                                   <---|

커널 소스 파일

따라서 커널 소스 코드에 헤더 파일이 포함될 수 있습니다. 이벤트의 경우 값을 C 응용 프로그램 (사용자 공간)으로 전달합니다.

세부: HID 조이스틱 이벤트 (Absolute X, Y)를 수정하려고 노력하고 있으므로 개선 된 위치로만 이동할 수 있으며, 이는 내 응용 프로그램에 의해 생성 될 수 있으며 (Pow, Tan 등) 일부 수학 기능이 있습니다.

그래서 나는 hid-input.c를 사용하여 원시 이벤트를 얻고 수정했습니다. HID 커널 모듈을 통해 입력 서브 시스템에 사용됩니다.

귀하의 의견을 찾고 있습니다

문안 인사.

다른 중요 섹션에 영향을 미치지 않고 이러한 레지스터를 잠그고 보존 할 수있는 커널 노하우가 많지 않으면 종종 커널에서 부동 소수점 레지스터를 사용 할 수 없으며 물론 커널에서 "처리"를 수행하는 데 부적절합니다. 다른 많은 사람들이 이것을 언급했습니다. 성능은 끔찍할 것입니다. 따라서 Math.h는 커널 모듈에 제공되지 않습니다. 우리는 이것을 받아들이고 계속 움직입니다 ...

하지만, 나는 또한 미친 요구 사항의 희생자이자 다른 사람들이 우리에게 강요 한 완전히 미친 디자인의 희생자이기 때문에 이것은 합법적 인 질문입니다. 성능 영향을 최소화하기 위해 Math.h API의 사용법을 줄인 후 올바른 컴파일러 설정을 통해 부동 소수점 에뮬레이션 (소프트 플로트)을 사용하여 부동 소수점 레지스터를 사용하지 않고 필요한 기능을 구현할 수 있습니다. 커널 코드는 이미 이러한 소프트 플로트 설정으로 컴파일해야합니다.

구현하기 위해 math.h 기능은 볼 수 있습니다 glibc 또는 uclibc 그리고 아마도 다른 사람들. 이 라이브러리는 모두 구현하는 LIBM의 일반 "C"구현을 가지고 있습니다. math.h 특수 고유 또는 플랫폼 별 유형을 사용하지 않으면 커널에서 잘 컴파일해야합니다.

UCLIBC : 위의 링크는 UCLIBC의 LIBM 섹션으로 직접 이동합니다.

glibc : "git"-ing glibc 이후, Glibc/sysdeps/ieee754/flt-32에서 찾고있는 것을 찾을 수 있습니다.

GLIBC는 더 정교하고 그 자체가 더 많은 상호 의존성을 가지고 있기 때문에 이해하기가 더 어려울 수 있지만 UCLIBC는 현재 (현재) C89 Math.h를 제공합니다. C99+에서와 같이 단일 정밀도 (읽기 : 더 빠른) 또는 복잡한 수학 기능을 원한다면 GLIBC를 살펴 봐야합니다.

단일 따옴표 대신 이중 인용문 ( ")을 사용해 볼까요?

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