kernel내 시스템콜 추가시 entry.S의 문제

keedi의 이미지

안녕하세요.

지금 kernel내 printk를 수행하여 메시지를 뿌려주는 시스템 콜을 구현하는
간단한 시스템 프로그래밍을 하고 있는데 문제에 봉착했습니다.

현재 2.4.26커널 소스를 다운받아서 작업중입니다.
/usr/src/linux-2.4.26/
위의 위치에 소스를 일단 풀었습니다.

교학사 - 리눅스 매니아를 위한 커널 프로그래밍 교재를 참고하고, kldp의
여러 문서를 참고하며 작업중인데 우선 위의 소스를 푼 디렉토리 기준으로

1. include/asm_i386/unistd.h에

#define __NR_free_hugepages 251
#define __NR_exit_group 252

/* keedi's option - start */
#define __NR_keedi_syscall 253
/* keedi's option - end */

이렇게 주석과 함께 define문을 추가했습니다.

2. 다음으로 arch/i386/kernel/entry.S 에

.long SYMBOL_NAME(sys_keedi_syscall) 을 추가하려고 하는데.

드디어 저의 지식으로 커버할 수 없는 부분에 봉착해버렸습니다!
바로 entry.S파일에 .long SYMBOL_NAME(sys_ni_syscall) 이라는 부분이
빼곡히 들어가 있는 것입니다. 심지어 위의 제가 unistd.h에 추가할때 있는

#define __NR_free_hugepages 251
#define __NR_exit_group 252

부분들 조차도

.long SYMBOL_NAME(sys_ni_syscall) /* sys_free_hugepages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_exit_group */

이렇게 처리 되어 있는것입니다. 물론 제가 넣고 싶은 253번째에도
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...

이렇게 쭈욱 차있는 것입니다.

실제로 258번즈음에
.long SYMBOL_NAME(sys_ni_syscall) /* sys_set_tid_address */
로 마지막에 있어서 마지막 부분인 이 다음에 어쩔수 없이

/* keedi's option - start */
.long SYMBOL_NAME(sys_keedi_syscall) /* keedi's system call */
/* keedi's option - end */

라고 추가 했습니다. - 좀 찜찜하긴 하지만... 다른 분들은 다 저런 부분이
없으신것 같더라구요... 저것들이 무엇을 위한것인지도 잘 모르겠고 왜
unistd.h와 entry.S와 내용이 다른지(위와 같이 sys_ni_syscall 부분요.)도
도통 모르겠고...

어쨌든! 저부분을 저렇게 완료를 한뒤에 kernel 하부에 직접 구현해주는
시스템 콜을 구현했습니다. makefile에도 추가를 해줬으며 다시
make bzImage 를 한뒤에 lilo를 실행해주고 다시 재부팅을 했습니다.

시스템 콜을 실행하는 사용자 어플리케이션을 만든뒤 컴파일을 했더니
__NR_keedi_syscall 부분이 undeclared되었다고 에러가 났습니다.
이곳 게시판의 질답을 참고하여 컴파일시 -I /usr/src/linux-2.4.26/include/
부분을 추가했더니 컴파일은 무사히 되었습니다.

그런데 실행을 했더니 printk("Hello World!\n"); 부분이 있음에도 불구하고
콘솔과 dmesg 또는 /var/log/messages에 전혀 Hello World! 부분이
출력되지 않습니다.

아무래도 entry.S 부분에서의 문제 때문에 무언가가 잘 풀리지 않는 것
같습니다. 아니면 고수님들이 보시기에 다른 부분의 문제가 있다면 좀 지도
부탁드립니다.

더불어 위의 entry.S의
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...
부분과 같이 sys_ni_syscall이 대체 무엇인지...
그리고 저것들이 unistd.h에 시스템콜 디파인부분이 252번 까지 있음에도
불구하고 왜 entry.S에는 추가해야할 253번 부분부터 쭈욱 sys_ni_syscall
이라는 것으로 가득 차 있는 것인지 이럴때 추가하려면 어떻게 해야하는
것인지...

답변 부탁드립니다.

너무 간단한 실습 조차도 맘대로 되지 않아 정말 소울패닉 상태랍니다. ㅠㅠ

김도형 드림

keedi의 이미지

.long SYMBOL_NAME(sys_ni_syscall) /* sys_free_hugepages */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_exit_group */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_lookup_dcookie */
.long SYMBOL_NAME(sys_ni_syscall) /* sys_epoll_create */
...

부분에서 253번째 부분인 sys_look_up_dcookie부분을 그냥 무시해버리고
sys_ni_syscall을 제가 만든 sys_keedi_syscall로 바꾸어 버리니까
일단 시스템 콜 구현은 되더군요.

막막해서 에잇 될대로 되라는 심정으로 저렇게 해버렸는데 아무 문제가
없는 것인지요. 뒤의 주석을 보니 무언가 어떤 시스템 콜에서 필요로
하는 것 같기도 한데... 왜저런 상황이 있는 것인지 저것이 무엇을 의미하는지는
아직도 아리송 하네요...

----
use perl;

Keedi Kim

sodomau의 이미지

다른건 모르겠는데
sys_ni_syscall은...
구현되지 않은 시스템콜인데요.
not implemented system call이라서
ni_syscall 인듯

커널 소스를 보시면
/kernel/sys.c

asmlinkage long sys_ni_syscall(void)
{
        return -ENOSYS;
}
keedi의 이미지

sodomau wrote:
다른건 모르겠는데
sys_ni_syscall은...
구현되지 않은 시스템콜인데요.

그랬군요!! 감사합니다. 그렇담 괜히 걱정을 했던 것일까요?
무언가가 한참동안 찜찜했는데 일단 한 걱정 덜었습니다.

그런데 교재나 문서에는 시스템 콜 구현이 256개인가? 이렇게 개수의
제한이 있던데 예약이 되어있거나 또는 구현을 위해 남겨둔 것이 이보다
훨씬 많을 수 있는 것은 커널내부의 무엇인가가 바뀌었기 때문인지요?
그렇다면 이제는 시스템콜이 몇개까지나 구현 가능한것인지 커널 내부 동작의
무엇이 바뀌었는지 궁금합니다.

----
use perl;

Keedi Kim

pastime의 이미지

리눅스의 각 시스템 콜에는 고유한 번호가 부여되어 있는데
그 번호는 한번 결정된 후에는 변경이 되질 않습니다.
(만약 변경한다면 이미 컴파일된 응용 프로그램이 정상적으로 동작하지 않을 것 입니다.)

그래서 나중에 그 시스템 콜이 없어진다 하더라도
그 번호를 다시 쓸수가 없게 되는데
이 경우 기존의 시스템 콜 번호를 유지하기 위해서
더미 함수를 하나 연결시켜 두게 되는 것입니다.

이 때 사용하는 것이 sys_ni_syscall 로서
단순히 -ENOSYS 에러를 리턴하도록 구현되어 있습니다.

그리고 커널 버전 2.4.20 까지는
시스템 콜 갯수가 256 으로 정해져 있다가
2.4.21 에서 270 으로 늘어난 후에
2.6 대에서는 제한이 사라졌습니다.
(2.5 대는 확인해 보질 않아서 모르겠습니다.. 8) )

uniare1의 이미지

아마도...
저희학교 학생분같군요..^^

시험 잘 보세요^^

에궁...

70페이지가 넘는 분량을 언제 요약해서 쓰낭..ㅡ.ㅡ;;;

charsyam의 이미지

음, ni_syscall 이라도 혹시나 호환성을 위해서 뒤쪽에 추가하는 것이
좋아보일듯 합니다. 다른 부분은 일단, 이후에 뭔가 그 부분에 추가될 수
있다는 뜻이니 그럼 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

keedi의 이미지

고맙습니다.
자세한 답변들 덕분에 어렴풋이나마 감이 오네요.

오늘은 5월 5일 어린이날!
다들좋은 하루 되세요~ :=)

----
use perl;

Keedi Kim

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.