로드 가능한 커널 모듈을 사용하여 Linux 3.2.x에 새 시스템 호출 추가 [닫기]


11

리눅스 커널 3.2.x에서 특정 새로운 시스템 호출을 추가하고 싶지만로드 가능한 커널 모듈 (커널을 다시 컴파일하고 싶지 않기 때문에)

인터넷과 SO에 대한 많은 게시물을 읽었으며 일부 장소에서는로드 할 수있는 모듈로 시스템 호출을 구현할 수 없지만 다른 곳에서는 가능하다고 주장합니다.

무엇 이니? 가능하다면 어떻게합니까?


이 질문은 여기에 주제 꺼져 : 유닉스 및 리눅스는 하지 프로그래밍에 대해, 사용 및 관리에 관한 것입니다. 스택 오버플로를 요청해야합니다 . 모호하지 마십시오 : Stack Overflow 에서 찾은 게시물에 연결하고 결정적이지 않거나 모순되는 것을 설명하십시오.
Gilles 'SO- 악마 그만'

2
나는이 질문이 프로그래밍 자체보다는 OS로서 리눅스와 더 관련이 있다고 생각한다. 시스템 능력을 확장 할 수있는 가능성과 한계가 무엇인지 아는 것도 중요합니다. 예를 들어, 일부 기능이로드 가능한 모듈로 구현할 수없고 커널 패치가 필요한 이유를 이해할 수 있습니다. 이것이 왜 그런지 알면 커널 개발자가 만들어야 할 보안 대 유용성에 대한 아이디어를 줄 수도 있습니다. OP가 가능한지 여부와 왜 이것을 구현하지 않는지 왜 묻지 않는다면 그 질문에 더 많은 주제가 있습니까?
Krzysztof Adamski

1
Linux Kernel Mailing List에 대한 수많은 <stroke> flames </ stroke> 토론이있었습니다. 예를 들어 reiserfs는 Linus를 포함하여 일부 핵심 개발자들에게 사랑받지 못한 자체 시스템 콜을 사용했습니다. 귀하의 경우에는 단순히 ioctl()작업에 s를 사용 하고 쉽게 모듈화 할 수 있습니다. Afaik은 syscall의 수가 엄청나게 하드 코딩 된 것이기 때문에 아무도 이것을 어렵게 만드는 주된 이유이며 아무도 그림에 들어갈 혼란을 원하지 않습니다. 그러나 sysfs, ioctls 등과 같은 동일한 기능에 도달하기위한 수많은 커널 인터페이스가 있습니다.
peterh-Reinstate Monica

답변:


14

시스템 호출 테이블 ( sys_call_table)이 정적 크기 배열 이므로 불가능합니다 . 그리고 그 크기는 컴파일 타임에 등록 된 syscall 수에 의해 결정됩니다. 이것은 다른 공간이 없다는 것을 의미합니다.

정의 된 arch/x86/kernel/syscall_64.c파일의 x86 아키텍처에 대한 구현을 확인할 수 있습니다 sys_call_table. 크기는 정확히 __NR_syscall_max+1입니다. __NR_syscall_max로 정의 arch/x86/kernel/asm-offsets_64.c됩니다 sizeof(syscalls) - 1(마지막 syscall 수). 여기서 syscall모든 syscall이있는 테이블입니다.

하나의 가능한 해결책은 sys_setaltroot메모리에 더 많은 공간이 필요하지 않기 때문에 기존의 일부 syscall 번호 (예 : 아키텍처에 하나가 있으면 더 이상 사용되지 않는 것)를 재사용하는 것입니다. 일부 아키텍처에는 syscall 테이블 (예 : x86의 64 비트 버전)에 구멍이있을 수 있으므로이 아키텍처도 사용할 수 있습니다.

새로운 syscall을 개발 중이고 실험하는 동안 재부팅하지 않으려는 경우이 기술을 사용할 수 있습니다. 새 시스템 호출을 정의하고 syscall 테이블에서 기존 항목을 찾은 다음 모듈에서이를 교체해야합니다.

커널이 sys_call_table2.6 버전으로 모듈로 내보내지지 않기 때문에 커널 모듈에서이 작업을 수행하는 것은 쉬운 일이 아닙니다 (이 기호를 내 보낸 마지막 커널 버전은 2.5.41).

이 문제를 해결하는 한 가지 방법은 커널을 변경하여 sys_call_table심볼을 모듈 로 내보내는 것 입니다. 이렇게하려면 다음 두 줄을 추가 해야 합니다 kernel/kallsyms.c( 생산 시스템에서는이 작업을 수행하지 마십시오 ).

extern void *sys_call_table;
EXPORT_SYMBOL(sys_call_table);

다른 기술은 syscall 테이블을 동적으로 찾는 것입니다. 알려진 시스템 호출 함수에 대한 포인터와 각 단어를 비교하여 커널 메모리를 반복합니다. 테이블에서이 알고있는 syscall의 오프셋을 알고 있으므로 테이블 시작 주소를 계산할 수 있습니다.


1

불행히도 커널에 시스템 호출을로드 가능한 모듈로 추가 할 수 없습니다. 새로운 시스템 호출을 추가 할 때마다 커널을 컴파일하는 데 어려움을 겪어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.