๐ข 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์ฝ๋์์ ํน์ ์์คํ ํธ์ถ์ ์ง์ ๋ถ๋ฅด๋ ๋ฐฉ์
- ๊ธฐ์กด์ ์ ๋์ค ๊ณ์ด ์ปค๋(๋ฆฌ๋ ์ค)์ ์ ์์คํ ํธ์ถ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๊ณผ ์ปค๋์ ๋ค์ ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ
- ๋ชจ๋๋ฆฌ์ ์ปค๋ ๋ด๋ถ์์ ์ปค๋ ๋ชจ๋์ ์๋ ๋ฐฉ์๊ณผ ๋ฆฌ๋ ์ค์ ์ ์ปค๋ ๋ชจ๋์ ์์ฑํ๋ ๋ฐฉ๋ฒ