리눅스 커널과 시스템 콜에 관한 질문이요..^^;
안녕하세요.
게시글을 클릭해 주셔서 감사합니다^^
다름이 아니옵구요.
리눅스 커널의 시스템콜을 직접 작성해서,..
사용하려 합니다.
시스템 콜을 작성해서, 리눅스 커널 소스에 포함시켜 컴파일
할려구 하는데요.
시스템콜을 작성하는 방법과 이를 적용시키는 방법에 대해
기술된 많은 문서들을 참조해서 대충이나마 알게 되었는데,.
실력이 너무 미흡한 관계로,..
사실, 제대로 이해할 수 없어서,..
이 곳에 질문을 올립니다.
// ------>
// 단지 테스팅을 위해서, 유저 어플리케이션(gcc 컴파일러를 기준 한)제작에 사용하던 유용한 함수하나를 시스템콜로 등록하려 합니다.
// (이하부터는 그 함수이름을 exam() 함수라고 할게요^^)
//-> 첫번째 질문
exam()함수는 내부에서, gcc가 제공하는 라이브러리 함수들을 이용하고 있거든요.
구체적으로, 스트링처리함수들(string.h)과, malloc() 함수(stdlib.h) 따위를 이용하고 있습니다.
근데, 커널 소스를 보니,.. '/include/asm-i386' 디렉토리 하에 string.h 파일이 존재하더군요. 실제로 커널 소스에 포함된,
string.h 에는,.. 표준 C 라이브러리의 string.h 에 선언된 함수들의 대부분이 존재하더군요.
따라서, 제가 시스템 콜로 등록하려는 exam()함수를 커널 소스
로 옮길 때,.. exam() 함수 내에 사용된,.. 스트링처리함수들은,.. asm-i386/string.h 파일에 있는,.. 스트링처리 함수들을,.. 호출해서 정상적으로 처리될 수 있을까요?
asm-i386/string.h에 있는 동명의 함수들이,. 기능까지도 같은
건지 모르겠어요ㅠㅠ
(커널 소스의 string.h 내 함수들은,.. 어셈블리어로 정의되어 있더군요.)
그리구, malloc()함수와 같은 경우에는,..
커널 소스에 포함되어 있지 않잖아요?
유저 어플리케이션 차원에서 정의된 malloc()는 내부적으로 메모리 관련 시스템 콜인
sbrk()였던가,.. brk()였던가,.. 를 호출해서,.. 그 기능을 완성한다던데...
그럼 exam()함수를 커널 소스내에 시스템콜로 포함시킬 때,..
exam()함수 내에서 사용된 malloc()는,.. 제가 직접 정의해 줘야하나요?
(커널 소스에 존재하는 sys_brk() 따위의 메모리 관련 시스템콜 함수를 이용하여,.. )
대부분, 유저 어플리케이션에 사용된 라이브러리 함수들은,..
시스템 콜을 이용하지 않거나, 시스템 콜을 이용해서,.. 동작을 하잖아요,..
그래서, 유저 어플리케이션에 사용된 라이브러리 함수들은,..
시스템 콜과 동일한 차원(시스템 콜을 이용하지 않았을 경우)의 함수이거나,..
시스템 콜보다 고차원(시스템 콜을 이용했을 경우)의 함수잖아요??
그렇다면, 시스템 콜을 이용하는 (유저 어플리케이션의)라이브러리 함수들을,..
커널 소스 차원에서 사용하기를 원할때는,.. (라이브러리 함수의 정의부가 공개되어 있지 않는 한)
커널 소스 내에 존재하는 자원들(커널 소스내에 정의된 일반적인 함수들, 시스템콜 함수들)을 이용해서 직접 구현(정의)해서
이용하는 방법 밖에는 없는건가요?
[quote]그렇다면, 시스템 콜을 이용하는 (유저 어플리케이션의)라이브
예.
답은 간단했지만...
모든 바이너리는 바이너리에서 사용하고 있는 심벌들을 어떤 방식으로든 다 포함하고 있어야 합니다. printf, malloc같은 심벌들은 사용자가 직접 다루지 않기 때문에 어느 정도 바이너리가 작동하는 원리에 익숙해지지 않으면 libc라는 것이 필요하다는 사실을 모르고 지나가 버리는 경우도 무척 많습니다. 곧 "원래부터 존재하고 있던" 것이라고 생각하는 printf나 malloc같은 함수들이 사실은 "언어 그 자체"와는 전혀 관련이 없다는 사실을 처음에는 받아들이기가 무척 어려운 경우가 많습니다. 이 사실은 소프트웨어적인 기반이 전혀 없이 작업을 하게 되는 임베디드 시스템의 진입 장벽과도 같다고 (저는) 생각하고 있습니다.
커널은 그 자체로 모든 것이 완결되어 있어야 하는 바이너리입니다. 따라서 libc에서 자주 사용하는 함수들은 대부분 (이름이 다르지만) 다 구현되어 있다고 생각하셔도 무방합니다. 바꾸어 말하자면 유저레벨에서 사용했던 함수를 그대로 커널 수준에서 사용할 수 있는 경우는 간단한 계산 함수가 아닌 이상은 드물다고 할 수 있겠지요.
댓글 달기