초보자는 어떤 커널 지식을 통해 이점을 얻을 수 있나요? [폐쇄]

초보자는 어떤 커널 지식을 통해 이점을 얻을 수 있나요? [폐쇄]

C 프로그래밍 언어를 알아야 하고 운영 체제가 어떻게 작동하는지 더 깊이 이해해야 하지만, 프로그래밍 언어, 쉘 스크립팅 및 명령줄에 대한 기본적인 이해가 있는 사람이라면 이 정도 가치가 있을까요? 커널에 대한 지식이 있나요? 능력이 부족한 사람도 혜택을 받을 수 있나요?

답변1

Linux 사용자로서 저는 스스로에게 이런 질문을 해왔습니다.

가장 먼저 떠오르는 것은 strace(매뉴얼 페이지).

커널의 다양한 부분을 이해하면 strace의 출력을 해석하고 일반 로그에서 코드를 추가로 디버그하는 방법에 대한 통찰력을 얻을 수 있습니다.

예를 들어, 다음은 문장을 포함하는 strace cat text.txt의 출력입니다 .text.txtmy name is test

execve("/usr/bin/cat", ["cat", "test.txt"], [/* 76 vars */]) = 0
brk(0)                                  = 0x1e4f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecd4000
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=138212, ...}) = 0
mmap(NULL, 138212, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b8ecb2000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2118128, ...}) = 0
mmap(NULL, 3932672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f1b8e6f5000
mprotect(0x7f1b8e8ab000, 2097152, PROT_NONE) = 0
mmap(0x7f1b8eaab000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7f1b8eaab000
mmap(0x7f1b8eab1000, 16896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f1b8eab1000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecb1000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1b8ecaf000
arch_prctl(ARCH_SET_FS, 0x7f1b8ecaf740) = 0
mprotect(0x7f1b8eaab000, 16384, PROT_READ) = 0
mprotect(0x60b000, 4096, PROT_READ)     = 0
mprotect(0x7f1b8ecd5000, 4096, PROT_READ) = 0
munmap(0x7f1b8ecb2000, 138212)          = 0
brk(0)                                  = 0x1e4f000
brk(0x1e70000)                          = 0x1e70000
brk(0)                                  = 0x1e70000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106070960, ...}) = 0
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1b881cc000
close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("test.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=16, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "my name is test\n", 65536)     = 16
write(1, "my name is test\n", 16my name is test
)       = 16
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

모두시스템 호출위에서 볼 수 있으므로 커널에 대한 지식이 있으면 코드를 디버깅할 때 더 많은 단서를 얻을 수 있습니다.

답변2

이것어떤 경우에는 커널 유형, 아키텍처, 모듈 및 호환성에 대해 아는 것이 도움이 될 수 있습니다.

관련 정보