7

비 커널 포함에 정의 된 기능을 포함하는 Linux 커널 (2.6) 모듈을 컴파일 할 수 있습니까?비 커널 헤더를 포함하여 Linux 커널 (2.6) 모듈을 컴파일

예를 들어

:


kernelmodule.h

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> // printk() 
// ... 
#include <openssl/sha.h> 
// ... 

메이크

obj-m := kernelmodule.o 
all: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules 

clean: 
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean 
    $(RM) Module.markers modules.order 

내가 작성한 커널 모듈 컴파일하려고하는가에있는 기능이 포함되어 있습니다 많은 수의 penssl은 파일을 포함합니다.

위의 표준 메이크 파일은 리눅스 헤더 외부에 포함 할 수 없습니다. 이 기능을 포함 할 수 있습니까? 그렇다면 올바른 방향으로 나를 가리 키시겠습니까?

덕분에, 마이크

답변

11

커널은 사용자 공간 코드를 사용할 수 없습니다 혼자 서 있어야는 (즉, 완전히 자기가 어떤 라이브러리를 포함되지 않습니다), 따라서 표준 헤더를 선택하지 않습니다.

사용자 공간 헤더를 가져 오는 것이 어떤 이점인지는 분명하지 않습니다. 거기에 사용하는 것이 유효하다면 (상수, 일부 매크로는 사용자 공간 함수를 호출하지 않는다는 가정하에 제공 될 것입니다), 필요하다면 커널 호환 부분 만 복사하여 포함하는 것이 더 좋습니다.

사용자 공간 사용을 위해 설계된 라이브러리 (커널을 연결하지 못해도 커널을 연결할 수 없기 때문에)를 커널과 연결할 수 없습니다.

대신 커널에서 사용할 함수를 다시 컴파일하십시오 (예 : malloc - OS와 라이브러리 호출을하지 않는다고 가정하면 어쨌든 수정해야합니다). 커널 모듈에서 사용할 라이브러리에 자신의 라이브러리를 통합하십시오.


최근의 리눅스 버전에는 다양한 SHA 해시를 포함하여 암호화 기능이 포함되어 있습니다. 대신 그 중 하나를 사용할 수 있습니다.


또 다른 아이디어는 커널 공간에서 암호를 시도하고 사용자 공간으로 코드를 이동하는 것을 멈추는 것입니다. 사용자 공간 코드는 쓰기/디버그/유지 보수가 더 쉽습니다.

6

나는 커널 공간에서 작동하도록 (예 : kmalloc() 등) 작성하고 변환 한 사용자 공간 코드를 사용했지만, 그리 어렵지 않습니다. . 그러나 사용자 공간이 아니라 C에 대한 커널의 이해에만 국한되어 있습니다. 특히 다양한 표준 int 유형과 약간 다릅니다.

사용자 공간 DSO에 연결하는 것만으로는 불가능합니다. Linux 커널은 모 놀리 식이며 완벽하게 자체 포함되어 있습니다. userspace libc, 라이브러리 또는 다른 사람들이 지적한 다른 비트는 사용하지 않습니다.

9/10 번 커널에서 어딘가에이 필요합니다.다른 사람이 당신이 가지고있는 것과 똑같은 필요성에 부딪쳤을 가능성이 매우 높습니다. 그리고 당신이 원하는 것을하기 위해 일부 모듈에 정적 함수를 작성했습니다. 그냥 잡아서 다시 사용하십시오.

암호의 경우 다른 사람이 말한 것처럼 커널의 내용 만 사용하십시오. 한 가지주의 할 점은 kconfig에서 활성화해야 사용자가 빌드 할 때 사용자가 선택하는 내용에 따라 발생할 수도 있고 그렇지 않을 수도 있습니다. 따라서 의존성에주의하고 명시 적으로 모듈을 선택했을 때 원하는 암호화 API를 선택하는 kconfig에서 몇 가지 항목을 해킹해야 할 수도 있습니다. 그렇게하면 나무로 지을 때 약간의 고통을 느낄 수 있습니다.

그래서 우리는 "전반적인 부풀림을 추가하면서 물건을 복사하고 이름을 바꾸는 것"을 가지고 있으며, 다른 한편으로는 "사람들에게 완전한 커널 소스가 있어야한다고 말하십시오"라고 말했습니다. 모 놀리 식 커널과 함께 제공되는 단점 중 하나입니다.

Microkernel을 사용하면 거의 모든 것이 사용자 공간에서 실행됩니다. 일부 드라이버의 경우 DSO를 연결하는 데 걱정할 필요가 없습니다 ... 문제는 아닙니다. 의견에서 커널 디자인 철학을 다시 시작하라는 메시지로 간주하지 마십시오.이 질문의 범위에 포함되지 않습니다.