2014-11-06 4 views
3

내가 알고 싶습니다? 나는 커널 모듈을 작성 중이며 하나의 특별한 문제를 해결하기 위해 call_func가 직접 호출 된 것처럼 보일 필요가있다. 좀 더 구체적으로 call_func는 시스템 콜입니다. Foo가이 시스템 호출의 제 버전입니다. is_true의 경우, 나는이 일을해야하고,이 시스템 콜을 호출 한 다음 리턴을 리턴해야한다. 하지만! is_true 어떻게 든 호출 스택 자체를 변경하고 싶습니다 - 그래서 현재 수준에서 foo 대신 call_func가있었습니다. 심지어 가능할까요? is_true의GCC 돌아 optimiztion

구현 :

struct task_struct * cur_task = current; 
if(check_dir(cur_task)) { 
... 
} 

check_dir 우리가 시스템 콜을 호출 한 디렉토리에 무언가를 수행하려는 경우 기능을 확인하는 것입니다.

+2

- 당신은 할 수 있습니다 Dispatcher의 일종을 구현하지만이 테스트를 수행하는 방법과 그 테스트의 기반에 대해 자세히 설명해야합니다. –

+0

구현을 추가했습니다. 아니면 더 자세한 설명이 필요합니까? –

+1

@PaulR이 언급 한 것처럼 [CPU dispatcher] (https://stackoverflow.com/questions/23676426/disable-avx2-functions-on-non-haswell-processors/23677889#23677889)와 같은 것은 무엇입니까? 처음으로 함수 포인터를'foo'로 설정 한 후'call_func'를 가리 킵니다. 필요하다면 나중에 함수 포인터를 다시'foo'를 가리 키도록 변경할 수 있습니다. –

답변

3

이이 tail-call 최적화라고합니다 (그것은 어떤 C 표준에 명시 하지입니다 대조적으로, 계획 및 Ocaml- 그 꼬리 호출 최적화를 지정 -e.g. 일부 언어는 일이 필요합니다). 일부 경우에 최근 GCC 컴파일러는 optimization을 수행 할 수 있습니다.

하지만 정말 call_func 당신이 그것에 의존하는 경우

에 전달 된 실제 인수 특히, 세부 사항에 따라 달라집니다, 코드를 언급하고 컴파일러가 그 일을한다 gcc -fverbose-asm -O2 -S 확인하시기 바랍니다.

이 최적화는 필요하지 않으며 컴파일러, 컴파일 플래그, 프로세서 및 ABI에만 해당 될 수 있습니다.

(그래서 - 64에서 작동 할 수 있지만 32 비트 IA32 또는 ARM은, 당신은 정말 확인해야합니다!) 그것은 is_true` 정의하는 방법을`/ 구현에 따라 달라집니다

+0

사실 여러 시스템 호출에 대해이를 수행하고 있으므로 인수는 특정 시스템 호출에 따라 다릅니다. 그리고 시스템의 안정성은 그것에 달려 있습니다. 이런 식으로 최적화 할 수 있다면, 모듈을 언로드 할 수있을 것이며, 그렇게 할 수 없다면 -하지 않을 것입니다. –