Post

๐Ÿข chap11. ์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ ์ปค๋„

โญ 11.1 ์‹œ์Šคํ…œ ํ˜ธ์ถœ

์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค~์ปค๋„ ํ”„๋กœ์„ธ์Šค: ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋‚ด๋ถ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์ด์ „์— ์—†์—ˆ๋˜ ๊ธฐ๋Šฅ์„ ์ปค๋„์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ž‘์„ฑํ•ด์•ผ ํ•จ

์ปค๋„ ๊ณต๊ฐ„์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ์ฐจ์ด์  ์•Œ์•„๋ณด๊ธฐ, ๋‘˜์€ ๋งค์šฐ ๋‹ค๋ฆ„

โœ… 11.1.1 ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ž์„ธํžˆ ๋ณด๊ธฐ

์…ธ ๋งโ†’์ปค๋„ ๋ง: ๋ถ„๋ฆฌ ๋ฐœ์ƒ

์‚ฌ์šฉ์ž ๊ณต๊ฐ„: ์‚ฌ์šฉ์ž ์‘์šฉํ”„๋กœ๊ทธ๋žจ, ์…€ ๋ง

์ปค๋„ ๊ณต๊ฐ„: ์ปค๋„ ๋ง, ํ•˜๋“œ์›จ์–ด ๋ง

์‚ฌ์šฉ์ž ๊ณต๊ฐ„์ด ์ปค๋„ ๊ณต๊ฐ„์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œโ†’์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ ‘๊ทผ

  • ์•Œ์•„์•ผ ํ•  ์‚ฌํ•ญ
    • ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ดํ›„์— ๋”ฐ๋ผ์˜ค๋Š” ๋ชจ๋“  ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปค๋„์€ ๋‹จ ํ•˜๋‚˜.
    • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ๋ธ”๋กœํ‚น์ผ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์˜ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•จ. ๋…ผ๋ธ”๋กœํ‚น์ผ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์•„์ฃผ ๋นจ๋ฆฌ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ, ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•ด์•ผ ํ•จ.
    • ์ž…์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ธ์ˆ˜๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„โ€™์—์„œโ€™ ํ˜น์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„โ€™์œผ๋กœโ€™ ๋ณต์ œ๋จ. ์‹ค์ œ๊ฐ’์ด ๋ณต์ œ๋˜๋ฏ€๋กœ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์ž‘์€ ๋ณ€์ˆ˜ ๋ฐ ํฌ์ธํ„ฐ๋ฅผ ์ž…๋ ฅ ์ธ์ˆ˜๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•จ.
    • ์ปค๋„์€ ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์™„์ „ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์ด ์ด๋Ÿฌ ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ํ•„์š”. ์ด๋•Œ ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์˜ ์†Œ์œ ์ž๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด fread๋Š” ํ•„์ˆ˜ ๊ถŒํ•œ์ด ์—†๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ ์‹คํŒจ.
    • ์‚ฌ์šฉ์ž ๋ฐ ์ปค๋„ ๊ณต๊ฐ„์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋„ ๋น„์Šทํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ. ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๋Š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ. ํŠน์ • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ „์†กํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๋ฐœ์ƒ.

โœ… 11.1.2 ํ‘œ์ค€ C ๊ฑด๋„ˆ๋›ฐ๊ธฐ: ์ง์ ‘ ์‹œ์Šคํ…œ ํ˜ธ์ถœํ•˜๊ธฐ

  • ์ฝ”๋“œ ๋ฐ•์Šค 11-1 [์˜ˆ์ œ 11-1] ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ง์ ‘ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋˜ ๋‹ค๋ฅธ Hello World ์˜ˆ์ œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
      // File name: ExtremeC_examples_chapter11_1.c
      // Description: Hello world with direct system call
        
      // POSIX๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
      #define _GNU_SOURCE
        
      #include <unistd.h>
        
      // ์ด๊ฒƒ POSIX์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      #include <sys/syscall.h>
        
      int main(int argc, char** argv) {
        char message[20] = "Hello World!\n";
        // ์“ฐ๊ธฐ๋ฅผ ํ•˜๋Š” 'write' ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
        // ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.
        syscall(__NR_write, 1, message, 13);
        return 0;
      }
    
  • ์…€ ๋ฐ•์Šค 11-1 [์˜ˆ์ œ 11-1]์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ

    1
    2
    3
    4
    
      gcc ExtremeC_examples_chapter11_1.c -o ex11_1.out
      ./ex11_1.out
        
      //Hello World!
    

โœ… 11.1.3 syscall ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€

  • ์ฝ”๋“œ ๋ฐ•์Šค 11-2 glibc์— ์žˆ๋Š” syscall ํ•จ์ˆ˜์˜ ์ •์˜

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
      /* Copyright (C) 2001-2018 Free Software Foundation, Inc.
         This file is part of the GNU C Library.
        
         The GNU C Library is free software; you can redistribute it and/or
         modify it under the terms of the GNU Lesser General Public
         License as published by the Free Software Foundation; either
         version 2.1 of the License, or (at your option) any later version.
        
         The GNU C Library is distributed in the hope that it will be useful,
         but WITHOUT ANY WARRANTY; without even the implied warranty of
         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
         Lesser General Public License for more details.
        
         You should have received a copy of the GNU Lesser General Public
         License along with the GNU C Library; if not, see
         <http://www.gnu.org/licenses/>.  */
        
      #include <sysdep.h>
        
      /* ์•„๋ž˜์˜ -4095 ๊ฐ’์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š”
         sysdeps/unix/sysv/linux/x86-64/sysdep.h ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”(consult). */
        
      /* ์‚ฌ์šฉ๋ฒ•: long syscall (syscall_number, arg1, arg2, arg3, arg4, arg5, arg6)
         ๋ช‡๋ช‡ ์ธ์ˆ˜๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. syscall_number๋Š” rax๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. */
        
      	.text
      ENTRY (syscall)
      	movq %rdi, %rax		/* Syscall number -> rax. */
      	movq %rsi, %rdi		/* arg1 - arg5 ์˜ฎ๊ธฐ๊ธฐ*/
      	movq %rdx, %rsi
      	movq %rcx, %rdx
      	movq %r8, %r10
      	movq %r9, %r8
      	movq 8(%rsp),%r9	/* arg6 ์€ ์Šคํƒ์— ์žˆ์Šต๋‹ˆ๋‹ค.  */
      	syscall			/* ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•˜์„ธ์š”.  */
      	cmpq $-4095, %rax	/* %rax์— ๋Œ€ํ•œ ์˜ค๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜์„ธ์š”.  */
      	jae SYSCALL_ERROR_LABEL	/* ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด ์˜ค๋ฅ˜ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ ํ”„ํ•˜์„ธ์š”.  */
      	ret			/* ํ˜ธ์ถœ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.  */
        
      PSEUDO_END (syscall)
    

โœ… 11.1.4 ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ์ปค๋„ ๊ฐœ๋ฐœ

    • ๋‹จ ํ•˜๋‚˜์˜ ์ปค๋„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์‹คํ–‰
      • ์ปค๋„์—์„œ ์ฝ”๋“œ๊ฐ€ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ๋จธ์‹ ์„ ์žฌ์‹œ์ž‘ํ•ด์„œ ์ปค๋„์„ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ
      • ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ๊ฐ€ ์‰ฝ์ง€๋งŒ, ์ปค๋„ ํ”„๋กœ์„ธ์Šค์˜ ๊ฒฝ์šฐ ๋จธ์‹  ์žฌ๋ถ€ํŒ…์„ ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ธฐ๋Š” ์–ด๋ ค์›€
      • ์ปค๋„ ํ”„๋กœ์„ธ์Šค์˜ ๊ฐœ๋ฐœ ๋น„์šฉ์ด ๋งค์šฐ ๋งŽ์ด ๋“ฆ.
      • ์ปค๋„์— ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋ฉด ์ปค๋„ ์ถฉ๋Œ ๋คํ”„ Kemel crash dump ๊ฐ€ ์ƒ์„ฑ, ๋ฌธ์ œ ์›์ธ ์ง„๋‹จ์— ์‚ฌ์šฉ.
    • ์ปค๋„ ๋ง์—๋Š” glibc ๊ฐ™์€ C ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†์Œ.
      • ์ปค๋„ ๋ง์€ SUSL POSIX ํ‘œ์ค€์ด ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์€ ์˜์—ญ
      • stdio.hL string. h์™€ ๊ฐ™์€ Itbc ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จ ๋ถˆ๊ฐ€.
      • ์ด๋Ÿฐ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ์ง€์ •๋œ ํ•จ์ˆ˜ ๋ชจ์Œ์ด ์กด์žฌ
      • ์ด๋“ค ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปค๋„ ํ—ค๋”์— ์žˆ์œผ๋ฉฐ, ์ด ์˜์—ญ์€ ํ‘œ์ค€ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ ์œ ๋‹‰์Šค ๋ฒ„์ „๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ.
    • ์ปค๋„์—์„œ ํŒŒ์ผ์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, Iibc ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†์Œ.
      • ๊ฐ ์œ ๋‹‰์Šค ์ปค๋„์€ ์ปค๋„ ๋ง ๋‚ด๋ถ€์— ๊ณ ์œ ์˜ ์ ‘๊ทผ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ.
      • ์ด๋Š” IIDc์—์„œ ๋…ธ์ถœํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ๊ณผ ๋™์ผ.
    • ์ปค๋„ ๋ง์—์„œ๋Š” ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์™„์ „ํžˆ ์ ‘๊ทผ ๊ฐ€๋Šฅ.
      • ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋ฉฐ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ๋งค์šฐ ์ค‘์š”.
    • ์ปค๋„์—๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์—†์Œ.
      • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์‚ฌ์šฉ์ž ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ปค๋„ ๋ง๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ฃผ์š” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜
      • ์ผ๋‹จ ์ปค๋„์— ๋“ค์–ด๊ฐ€๋ฉด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ.
    • ์ปค๋„ ํ”„๋กœ์„ธ์Šค๋Š” ์ปค๋„ ์ด๋ฏธ์ง€๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋ณต์ œํ•ด ์ƒ์„ฑํ•˜๊ณ , ์ด๋Š” ๋ถ€ํŠธ ๋กœ๋”๊ฐ€ ์ˆ˜ํ–‰.
      • ๋งจ ์ฒ˜์Œ๋ถ€ํ„ฐ trom scratch ์ปค๋„ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์‹œ์Šคํ…œ์„ ์žฌ๋ถ€ํŒ…ํ•ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ ๋ถˆ๊ฐ€.
    • ์ปค๋„ ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” ์ปค๋„์—์„œ๋Š” ์ปค๋„์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐ ๊ฐ€๋Šฅ.
      • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ๋Š” ๋ถˆ๊ฐ€.
  • ๋ฆฌ๋ˆ…์Šค์—์„œ Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ž‘์„ฑํ•˜๊ธฐ

โœ… 11.1.3 syscall ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€

  • ์…€ ๋ฐ•์Šค 11-3 [์˜ˆ์ œ 11-2]์— ํ•„์š”ํ•œ ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๊ธฐ

    1
    2
    3
    
      sudo apt-get update
      sudo apt-get install -y build-essential autoconf libncurses5-dev libssl-dev bison flex libelf-dev git
      ...
    
  • ์…€ ๋ฐ•์Šค 11-4 ๋ฆฌ๋ˆ…์Šค ์ปค๋„์„ ๋ณต์ œํ•˜๊ณ  ๋ฒ„์ „์ด 5.3์ธ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ

    1
    2
    3
    
      git clone https://github.com/torvalds/linux
      cd linux
      git checkout v5.3
    

    vi (printk) ์ปค๋„์—์„œ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅํ•˜๋Š” ๋„๊ตฌ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      " ============================================================================
      " Netrw Directory Listing                                        (netrw v171)
      "   /home/ubuntu/linux/kernel/printk
      "   Sorted by      name
      "   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:special
      " ==============================================================================
      ../                                                                                                   ./
      braille.h
      console_cmdline.h
      internal.h
      braille.c
      printk.c
      printk_safe.c
      Makefile
    
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-3 ์ƒˆ๋กœ์šด Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์„ ์–ธ(include/linux/syscalls.h)
  • ์…€ ๋ฐ•์Šค 11-6 hello_world ๊ฒฝ๋กœ ๋งŒ๋“ค๊ธฐ

    1
    2
    
      mkdir hello_world
      cd hello_world
    
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-4 Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ •์˜
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-5 ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ…Œ์ด๋ธ”์— ๋”ํ•˜๊ธฐ

    1
    
      999 64 hello_world __x64_sys_hello_world
    
  • ์…€ ๋ฐ•์Šค 11-7 ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋œ Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ

    1
    2
    
      cat arch/x86/entry/syscalls/syscall_64.tbl
      ...
    
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-6 Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ Makefile ํŒŒ์ผ ๋‚ด์šฉ

    1
    
      obj-y := sys_hello_world.o
    
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-7 ๋ฃจํŠธ์˜ Makefile ํŒŒ์ผ์—์„œ ์ˆ˜์ •ํ•  ๋ชฉํ‘œ ํ–‰

    1
    
      core-y += kernel/certs/mm/fs/ipc/security/crypto/block/
    
  • ์ฝ”๋“œ ๋ฐ•์Šค 11-8 ์ˆ˜์ •ํ•œ ๋’ค์˜ ๋ชฉํ‘œ ํ–‰

    1
    
      core-y += kernel/certs/mm/fs/hello_world/ipc/security/crypto/block/
    
  • ์ปค๋„ ๋นŒ๋“œํ•˜๊ธฐ

    • ์…€ ๋ฐ•์Šค 11-8 ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปค๋„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ปค๋„ ์„ค์ • ๋งŒ๋“ค๊ธฐ

      1
      2
      
        make localmodconfig
        ...
      
    • ์…€ ๋ฐ•์Šค 11-9 ์ปค๋„ ๋นŒ๋“œ์˜ ์ถœ๋ ฅ: Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ–‰์— ์ฃผ๋ชฉํ•˜๊ธฐ

      1
      
        make -j4
      
    • ์…€ ๋ฐ•์Šค 11-10 ์ƒˆ ์ปค๋„ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์„ค์น˜ํ•˜๊ธฐ

      1
      
        sudo make modules_install install
      
    • ์…€ ๋ฐ•์Šค 11-11 ํ˜„์žฌ ์„ค์น˜๋œ ์ปค๋„์˜ ๋ฒ„์ „ ๊ฒ€์‚ฌํ•˜๊ธฐ

      1
      
        uname -r
      
    • ์…€ ๋ฐ•์Šค 11-12 ์‹œ์Šคํ…œ ์žฌ์‹œ์ž‘ํ•˜๊ธฐ

      1
      
        sudo reboot
      
    • ์…€ ๋ฐ•์Šค 11-13 ์žฌ์‹œ์ž‘ ์ดํ›„ ์ปค๋„ ๋ฒ„์ „ ๊ฒ€์‚ฌํ•˜๊ธฐ

      1
      
        uname -r
      
    • ์ฝ”๋“œ ๋ฐ•์Šค 11-9 [์˜ˆ์ œ 11-2] ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      
        // File name: ExtremeC_examples_chapter11_2.c
        // Description: Invoke the hello world system call
            
        // POSIX๊ฐ€ ์•„๋‹Œ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
        #define _GNU_SOURCE
            
        #include <stdio.h>
        #include <unistd.h>
            
        // ์ด๊ฒƒ์€ POSIX์— ์†ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
        #include <sys/syscall.h>
            
        int main(int argc, char** argv) {
          char str[20] = "Kam";
          char message[64] = "";
            
          // hello world ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋ถ€๋ฅด๊ธฐ
          int ret_val = syscall(999, str, 4, message, 64);
          if (ret_val < 0) {
            printf("[ERR] Ret val: %d\n", ret_val);
            return 1;
          }
          printf("Message: %s\n", message);
          return 0;
        }
      
    • ์…€ ๋ฐ•์Šค 11-14 [์˜ˆ์ œ 11-2]๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

      1
      2
      3
      4
      
        gcc ExtremeC_examples_chapter11_2.c -o ex11_2.out
        ./ex11_2.out
            
        //Message: Hello Kam!
      
    • ์…€ ๋ฐ•์Šค 11-15 Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๋”ฐ๋ผ ์ƒ์„ฑ๋œ ๋กœ๊ทธ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด dmesg ์‚ฌ์šฉํ•˜๊ธฐ

      1
      2
      
        dmesg
        ...
      
    • ์…€ ๋ฐ•์Šค 11-16 [์˜ˆ์ œ 11-2]์—์„œ ๋ถˆ๋Ÿฌ์˜จ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ฐ์‹œํ•˜๊ธฐ(๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ)

      1
      
        strace ./ex11_2.out
      
    • ์ฝ”๋“œ ๋ฐ•์Šค 11-10 Hello World ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ๊ธด ๋ฉง์ง€ ์ „๋‹ฌํ•˜๊ธฐ(64๋ฐ”์ดํŠธ ์ด์ƒ)
    • ์…€ ๋ฐ•์Šค 11-17 ์ˆ˜์ •ํ•œ ๋’ค [์˜ˆ์ œ 11-2]๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ

      1
      2
      
        gcc ExtremeC_examples_chapter11_2.c -o ex11_2.out
        ./ex11_2.out
      
    • ์…€ ๋ฐ•์Šค 11-18 ์ˆ˜์ •ํ•œ ๋’ค [์˜ˆ์ œ 11-2]์—์„œ ๋ถˆ๋Ÿฌ์˜จ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ฐ์‹œํ•˜๊ธฐ

      1
      
        strace ./ex11_2.out
      

โญ 11.2 ์œ ๋‹‰์Šค ์ปค๋„

โ–ถ๏ธ ์œ ๋‹‰์Šค ์ปค๋„

โ†’ ์œ ๋‹‰์Šค ์ปค๋„์˜ ์„ค๊ณ„์—๋Š” ๋‘ ๊ฐ€์ง€์˜ ์•„ํ‚คํƒ์ฒ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„๊ณผ ๋งˆ์ดํฌ๋กœ์ปค๋„์ž…๋‹ˆ๋‹ค.

โ†’ ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„๊ณผ ๋งˆ์ดํฌ๋กœ์ปค๋„์€ ๋ชจ๋‘ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปค๋„์€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ์— ์žˆ์–ด ํŠน์ •ํ•œ ๋ฐฉ์‹์ด ์žˆ๋Š”๋ฐ ์ด๋กœ ์ธํ•ด ๋…ผ์Ÿ์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ–ˆ์Šต๋‹ˆ๋‹ค.(ํƒ€๋„จ๋ฐ”์›€-ํ† ๋ฅด๋ฐœ)

โ–ถ๏ธ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„ ๋Œ€ ๋งˆ์ดํฌ๋กœ์ปค๋„

โ†’ ๋‘๊ฐ€์ง€์˜ ์•„ํ‚คํ…์ฒ˜์˜ ์žฅ๋‹จ์ ์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ย ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„๋งˆ์ดํฌ๋กœ ์ปค๋„
ํ”„๋กœ์„ธ์Šค์ปค๋„์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ํฌํ•จํ•˜๋Š” ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ์„ฑ(๊ตฌ์‹ ๋ฐฉ๋ฒ•)์ปค๋„์ด ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์กด์žฌ
์œ„์น˜์ปค๋„ ๊ณต๊ฐ„์— ์œ„์น˜์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์œ„์น˜
์†๋„๋ชจ๋“  ์ปค๋„ ์„œ๋น„์Šค๊ฐ€ ์ปค๋„ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฆ„.์‚ฌ์šฉ์ž ๊ณต๊ฐ„๊ณผ ์ปค๋„ ๊ณต๊ฐ„ ์‚ฌ์ด์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ(์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ ๋ฌธ๋งฅ ๊ตํ™˜ ๅคš) ๋ชจ๋†€๋ฆฌ์‹ ๋ณด๋‹ค ๋Š๋ฆผ
์ปค๋„ ์ถฉ๋Œ๋ชจ๋“  ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋Š” ์ปค๋„์— ๋กœ๋“œ. - ๋‚ด๋ถ€ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋‚˜ ์œ ๋‹›์— ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด ์ปค๋„ ์ถฉ๋Œ ๋ฐœ์ƒ ๆœ‰๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์œ ๋‹›๋“ค์ด ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์‹คํ–‰ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋„ ์ถฉ๋Œ ็„ก
์†์ƒ์ž‘์€ ์•…์„ฑ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ์‹œ์Šคํ…œ ์ „์ฒด๋ฅผ ์ถฉ๋ถ„ํžˆ ์†์ƒ ๊ฐ€๋Šฅ๋งŽ์€ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ์žˆ์œผ๋ฉฐ ์ตœ์†Œํ•œ์˜ ํ•„์ˆ˜ ๊ธฐ๋Šฅ๋งŒ์ด ์ปค๋„ ๊ณต๊ฐ„์— ์ง‘์ค‘๋˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋ฐœ์ƒ X
ํŽธ๋ฆฌ์„ฑ์ปค๋„์†Œ์Šค๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•œ๋‹ค๋ฉด ๋‹ค์‹œ ์ปดํŒŒ์ผ์„ ํ•˜๊ณ  ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ๋‹ค์‹œ ์žฌ๋ถ€ํŒ… ํ•ด์•ผ ํ•จ.์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์žฌ๋ถ€ํŒ…ํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ ๊ธฐ๋Šฅ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ.

โ–ถ๏ธ ๋ฆฌ๋ˆ…์Šค

โ†’ ๋ฆฌ๋ˆ…์Šค๋Š” ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„์ด๋ฉฐ ๋ชจ๋“  ์ปค๋„ ๊ธฐ๋Šฅ์ด ์ปค๋„ ๋‚ด๋ถ€์— ์žˆ์Šต๋‹ˆ๋‹ค.

โ†’ ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„์ด๋ฏ€๋กœ ์ปค๋„์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ ๋„ ์ปค๋„์— ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

โ†’ ๋‹ค์Œ ํŒŒํŠธ์—์„œ ์ปค๋„ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•ด ์ปค๋„์„ ๋™์ ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ปค๋„์— ์ƒˆ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

โ–ถ๏ธ ์ปค๋„ ๋ชจ๋“ˆ

โ†’ ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„์—๋Š” ์‹คํ–‰ ์ค‘์ธ ์ปค๋„์— ์ƒˆ ๊ธฐ๋Šฅ์„ ํ•ซํ”Œ๋Ÿฌ๊ทธ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด๋•Œ ํ”Œ๋Ÿฌ๊ทธ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์œ ๋‹›์„ ์ปค๋„ ๋ชจ๋“ˆ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งˆ์ดํฌ๋กœ์ปค๋„์˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋Š” IPC ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ์„œ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ปค๋„ ๋ชจ๋“ˆ์€ ์ปค๋„ ๋ชฉ์  ํŒŒ์ผ๋กœ ์ด๋ฏธ ์ปดํŒŒ์ผ ๋˜์–ด์„œ ์ปค๋„ ์ด๋ฏธ์ง€์— ์ •์ ์œผ๋กœ ๋นŒ๋“œ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์ปค๋„์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋™์ ์œผ๋กœ ๋กœ๋“œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    1
    
      โ˜‘๏ธ ์ปค๋„ ๋ชฉ์  ํŒŒ์ผ์€ C๊ฐœ๋ฐœ์—์„œ ์ผ๋ฐ˜ ๋ชฉ์  ํŒŒ์ผ๊ณผ ์Œ๋‘ฅ์ด ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
    

โ†’ ์ปค๋„ ๋ชจ๋“ˆ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•(3๊ฐ€์ง€)

  • /dev ๊ฒฝ๋กœ์— ์žˆ๋Š” ์žฅ์น˜ ํŒŒ์ผ
    • ์ปค๋„ ๋ชจ๋“ˆ์€ ์ฃผ๋กœ ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์žฅ์น˜๋Š” /dev ๊ฒฝ๋กœ์— ์žˆ๋Š” ์žฅ์น˜ ํŒŒ์ผ๋กœ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์žฅ์น˜ ํŒŒ์ผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด ๋ชจ๋“ˆ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • procfs ์˜ ์ง„์ž…์ 
    • /procfs์˜ ์ง„์ž…์ ์€ ํŠน์ • ์ปค๋„ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ์ฝ๊ฑฐ๋‚˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌ ๋˜๋Š” ๋ช…๋ น์„ ํ†ต์ œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • sysfs ์ง„์ž…์ 
    • procfs์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ปค๋„ ๊ด€๋ จ ์œ ๋‹›์„ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฆฌ๋ˆ…์Šค์˜ ๋˜ ๋‹ค๋ฅธ ํŒŒ์ผ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

โ˜‘๏ธ๋ฆฌ๋ˆ…์Šค์— ์ปค๋„ ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๊ธฐ

1
2
 โ—์ปค๋„ ๋ชจ๋“ˆ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ procfs์—์„œ ์ง„์ž…์ ์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ด์šฉํ•ด
	 ์ธ์‚ฌ ๋ฌธ์ž์—ด์„ ๋ฐ›๋Š” ์ƒˆ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•ด๋ณด์ž!  
  • ์˜ˆ์ œ 11_3์— ๋Œ€ํ•œ ๋ฃจํŠธ ๊ฒฝ๋กœ ๋งŒ๋“ค๊ธฐ
1
2
$ mkdir ex11_3
$ cd ex11_3
  • Hello World ์ปค๋„ ๋ชจ๋“ˆ(ex11_3/hwkm.c)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    
      // File name: hwkm.c
      // Description: Hello World Kernel Module
        
      #include <linux/module.h>
      #include <linux/kernel.h>
      #include <linux/init.h>
      #include <linux/proc_fs.h>
        
      // The structure pointing to the proc file
      struct proc_dir_entry *proc_file;
        
      // The read callback function
      ssize_t proc_file_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) {
        int copied = 0;  // ์ผ๊ธฐ๊ธฐ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ํŒŒ์ผ์„ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
        if (*ppos > 0) {
          return 0;
        }
        copied = sprintf(ubuf, "Hello World From Kernel Module!\n");
        *ppos = copied;
        return copied;
      }
        
      static const struct file_operations proc_file_fops = {
       .owner = THIS_MODULE,
       .read  = proc_file_read
      };
        
      // The module initialization callback
      static int __init hwkm_init(void) {
        proc_file = proc_create("hwkm", 0, NULL, &proc_file_fops);  // /proc ๊ฒฝ๋กœ์—์„œ hwmkํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
        if (!proc_file) {
          return -ENOMEM;
        }
        printk("Hello World module is loaded.\n");
        return 0;
      }
        
      // The module exit callback
      static void __exit hkwm_exit(void) {
        proc_remove(proc_file);   // /proc ๊ฒฝ๋กœ์—์„œ hwmkํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. 
        printk("Goodbye World!\n");
      }
        
      // Defining module callbacks ->๋ชจ๋“ˆ์ด ๋กœ๋“œ, ์–ธ๋กœ๋“œ๋  ๋–„ ๊ฐ๊ฐ ํ˜ธ์ถœ
      module_init(hwkm_init);  //์ดˆ๊ธฐํ™” ์ฝœ๋ฐฑ์€ ๊ฐ€์žฅ ๋จผ์ € ์‹ค
      module_exit(hkwm_exit);
    

    hwmk.cํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์ปค๋„ ๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค.

    โ†’ ์ด ๋‹จ๊ณ„์—์„œ ์ปค๋„ ๋ชจ๋“ˆ ๋‚ด๋ถ€์— ์“ฐ์ธ ์ฝ”๋“œ๋Š” ์ปค๋„ ์•ˆ์˜ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์— ์™„์ „ํžˆ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์— ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์ •๋ณด๋ฅผ ์ƒˆ์–ด ๋‚˜๊ฐ€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์•ˆ์ „ํ•œ ์ปค๋„ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์ปค๋„ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ Makefile

    1
    2
    3
    4
    5
    6
    7
    
      obj-m += hwkm.o
        
      all:
      	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
        
      clean:
      	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

    โ†’ ์ปค๋„ ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•˜๋Š”๋ฐ ํ•„์ˆ˜์ ์ธ ํ•„๋“œ ๋„๊ตฌ๋ฅผ ํŠธ๋ฆฌ์–ด๊ฐ€๋Š” Makefile์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • make๋ช…๋ น์–ด ์‹คํ–‰ํ•˜๊ธฐ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    $make
    make -C /lib/modules/54.318.0+/build M=/home/kamran/extreme_c/
    ch11/codes/ex11_3 modules
    make[1]: Entering directory '/home/kamran/linux'
    CC [M] /home/kamran/extreme_c/ch11/codes/ex11_3/hwkm.o
    Building modules, stage 2.
    MODPOST 1 modules
    WARNING: modpost: missing MODULE_LICENSE() in /home/kamran/
    extreme_c/ch11/codes/ex11_3/hwkm.o
    see include/linux/module.h for more information
    CC /home/kamran/extreme_c/ch11/codes/ex11_3/hwkm.mod.o
    LD [M] /home/kamran/extreme_c/ch11/codes/ex11_3/hwkm.ko
    make[1]: Leaving directory '/home/kamran/linux'
    $
    
    

โ†’ ์ด๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ .koํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Š” ์ถœ๋ ฅ ํŒŒ์ผ์ด ์ปค๋„ ๋ชฉ์  ํŒŒ์ผ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ์ปค๋„ ๋ชฉ์  ํŒŒ์ผ์€ ์ปค๋„์— ๋™์ ์œผ๋กœ ๋กœ๋“œ์™ธ์–ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

โ˜€๏ธ์ปค๋„ ๋ชจ๋“ˆ์„ ๋นŒ๋“œํ•œ ๋’ค์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ!

1
2
3
4
5
6
7
8
9
10
11
$ ls -l

total 556
-rw-rw-r-- 1 kamran kamran 154 Oct 19 00:36 Makefile
-rw-rw-r-- 1 kamran kamran 0 Oct 19 08:15 Module.symvers
-rw-rw-r-- 1 kamran kamran 1104 Oct 19 08:05 hwkm.c
-rw-rw-r-- 1 kamran kamran 272280 Oct 19 08:15 hwkm.ko
-rw-rw-r-- 1 kamran kamran 596 Oct 19 08:15 hwkm.mod.c
-rw-rw-r-- 1 kamran kamran 104488 Oct 19 08:15 hwkm.mod.o
-rw-rw-r-- 1 kamran kamran 169272 Oct 19 08:15 hwkm.o
-rw-rw-r-- 1 kamran kamran 54 Oct 19 08:15 modules.order

โ€ผ๏ธ์ปค๋„ ๋ชจ๋“ˆ์˜ ๋กœ๋“œ์™€ ์–ธ๋กœ๋“œ

โ–ถ๏ธ ์ปค๋„ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•˜๊ธฐ

1
$ sudo inmode hwkm.ko

โ–ถ๏ธ์ตœ์‹  ์ปค๋„ ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

1
2
3
4
$ dmesg
...
...
[ 7411.519575] Hello World module is loaded.

โ–ถ๏ธํŒŒ์ผ ์ฝ๊ธฐ

1
2
3
4
5
$ cat /proc/hwkm
Hello World From Kernel Module!
$ cat /proc/hwkm
Hello World From Kernel Module!
$
  • ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ 
    • ์ปค๋„ ๋ชจ๋“ˆ์ด ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์œผ๋กœ ๋ณต์‚ฌํ–ˆ๊ณ  cat ํ”„๋กœ๊ทธ๋žจ์ด ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ด๋ฅผ ์ถœ๋ ฅํ•˜์˜€๊ธฐ์— ํŒŒ์ผ์„ ๋‘ ๋ฒˆ ์ฝ์–ด ๊ฐ™์€ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ–ถ๏ธ ์ปค๋„ ๋ชจ๋“ˆ์„ ์–ธ๋กœ๋“œํ•˜๊ธฐ

1
$ sudo rnmod hwkm

โ–ถ๏ธ ์–ธ๋กœ๋“œ ๋˜์—ˆ๋Š”์ง€ ์ตœ์‹  ์ปค๋„ ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

1
2
3
4
5
$ dmesg
...
...
[ 7411.519575] Hello World module is loaded.
[ 7648.950639] Goodbye World!

โ–ถ๏ธ ๊ฒฐ๋ก 

1๏ธโƒฃ ์ปค๋„ ๋ชจ๋“ˆ์€ ๋จธ์‹ ์„ ์žฌ๋ถ€ํŒ…ํ•  ํ•„์š” ์—†์ด ๋กœ๋“œ์™€ ์–ธ๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โ†’ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ดํ›„์— ์ปค๋„ ๋‚ด์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ปค๋„ ๋ชจ๋“ˆ์ด ๊ฐ„ํŽธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ปค๋„ ๋ชจ๋“ˆ์€ ๋กœ๋“œ๋˜๊ณ  ๋‚˜๋ฉด ์ปค๋„์— ์†ํ•˜๊ณ , ์ปค๋„ ๋‚ด์˜ ๋ชจ๋“  ์œ ๋‹›๊ณผ ๊ทธ ๊ตฌ์กฐ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ปค๋„ ๋ชจ๋“ˆ์ด๋ผ๋ฉด ์ปค๋„ ๋ชจ๋“ˆ์˜ ์†Œ์Šค ์ฝ”๋“œ๋งŒ ์ปดํŒŒ์ผ์„ ํ•˜๊ฒŒ ๋˜์–ด ์งง์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์ฝ”๋“œ๊ฐ€ ์ปค๋„ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋ ค ํ•  ๋•Œ, ์ฝ”๋“œ์˜ ์œ„์น˜๊ฐ€ ์ปค๋„ ๋ชจ๋“ˆ์— ์žˆ๋“ , ์‹œ์Šคํ…œ ํ˜ธ์ถœ ์ดํ›„์— ์žˆ๋“  ์ƒ๊ด€์—†์ด ๋ฐ˜๋“œ์‹œ ์žฌ๋ถ€ํŒ…์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โญ 11.3 ๋งˆ๋ฌด๋ฆฌ

  • ์‹œ์Šคํ…œ ํ˜ธ์ถœ๊ณผ, ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ํŠน์ • ๊ธฐ๋Šฅ์„ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ์‹
  • ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋‹ค์Œ์— ์ผ์–ด๋‚˜๋Š” ์ผ
  • C์ฝ”๋“œ์—์„œ ํŠน์ • ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ง์ ‘ ๋ถ€๋ฅด๋Š” ๋ฐฉ์‹
  • ๊ธฐ์กด์˜ ์œ ๋‹‰์Šค ๊ณ„์—ด ์ปค๋„(๋ฆฌ๋ˆ…์Šค)์— ์ƒˆ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ปค๋„์„ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ชจ๋†€๋ฆฌ์‹ ์ปค๋„ ๋‚ด๋ถ€์—์„œ ์ปค๋„ ๋ชจ๋“ˆ์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋ฆฌ๋ˆ…์Šค์— ์ƒˆ ์ปค๋„ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•
This post is licensed under CC BY 4.0 by the author.