시스템콜 호출시, 문자열 출력 문제

scs9802의 이미지

A(3개의 인자를받음....) 함수를 호출했을때 발생하는
SysCall 부분에 printk를 찍으려고 합니다.
제가 찾는 SysCall은
SYSCALL_DEFINE3(A, ~~~~~) // A함수가 3개의 인자를 받을경우 syscall 호출
이 부분입니다.
이 함수에 printk 를 찍고 A함수를 호출하는 메인 파일.c 을 컴파일 하여 작동시켰습니다
그리고 dmesg 를 사용했는데 커널내 메시지에 printk 의 내용이 나오지 않습니다.
제가 잘못된 SysCall 부분을 찾은 줄 알았는데
함수 호출 시 성공값이 제대로 나와서 더욱더 갈피를 못찾겠습니다.

익명 사용자의 이미지

왜 이렇게 비밀이 많아요?

1. A가 대체 어떤 syscall인지 (원래 있던 것인지, 아니면 새로 추가한 syscall인지)
2. 커널 코드에 손을 댔다면 어디에 어떻게 댔는지 (간단한 diff 형식으로?)
3. "메인 파일.c"는 정확히 어떤 코드인지

등등. 자세한 정보를 준다고 좋은 답변이 달린다는 보장은 없긴 해도, 뭐 밑지는 것도 없지 않겠습니까?

아주 분량이 많고 복잡하거나, 혹은 민감한 개인 정보일 것 같지도 않은데 말이죠.

AustinKim의 이미지

1. printk를 추가한 코드가 컴파일되는지 확인

다음은 SYSCALL_DEFINE3 매크로를 사용한 시스템 콜 핸들러 함수인데요.
먼저 printk를 추가한 코드가 제대로 컴파일되는지 확인할 필요가 있어요.

https://elixir.bootlin.com/linux/v4.19.30/source/fs/read_write.c
SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, whence)
{
+ #error "SYSCALL_DEFINE3-lseek"
return ksys_lseek(fd, offset, whence);
}

#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE3(lseek, unsigned int, fd, compat_off_t, offset, unsigned int, whence)
{
+ #error "COMPAT_SYSCALL_DEFINE3"
return ksys_lseek(fd, offset, whence);
}
#endif

위와 같이 #error 매크로 코드를 추가해서 컴파일을 했는데 컴파일 에러가 발생하지 않으면,
해당 코드가 아예 컴파일 되지 않는 겁니다.

2. ftrace

만약 printk를 추가한 코드가 제대로 동작을 해도 dmesg로 커널 로그가 제대로 출력되지 않을 수 있어요.
왜냐면 printk를 실행하는 함수가 너무 자주 호출되면 콘솔 드라이버가 로그를 제대로 표현하지 못합니다.
보통 시스템 콜 핸들러는 매우 자주 호출됩니다.

따라서 printk보다 ftrace를 활용하면 좋을 것 같네요.
printk 대신 trace_printk 함수를 쓰면 됩니다.

ftrace를 사용하는 방법은 아래 링크에 있는 내용을 참고하면 됩니다.

https://kldp.org/node/161282
https://brunch.co.kr/@alden/24

(개인블로그)
http://rousalome.egloos.com

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.