Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

11105
637
415734


[crash-utility] 기본 커맨드 테이블 선언부 Linux Kernel Contribution

크래시 유티릴티를 통해 다양한 기능을 추가하고 싶다. 그런데 기본적인 명령어는 그 동안 추가됐는지 궁금하다.

해당 내용은 linux_command_table 전역 변수에서 확인할 수 있다.

struct command_table_entry linux_command_table[] = {
    {"*",       cmd_pointer, help_pointer, 0},
    {"alias",   cmd_alias,   help_alias,   0},
        {"ascii",   cmd_ascii,   help_ascii,   0},
        {"bpf",     cmd_bpf,     help_bpf,     0},
        {"bt",      cmd_bt,      help_bt,      REFRESH_TASK_TABLE},
    {"btop",    cmd_btop,    help_btop,    0},
    {"dev",     cmd_dev,     help_dev,     0},
...
    {"irq",     cmd_irq,     help_irq,     0},
    {"kmem",    cmd_kmem,    help_kmem,    0},
    {"list",    cmd_list,    help__list,   REFRESH_TASK_TABLE},
    {"log",     cmd_log,     help_log,     MINIMAL},
    {"mach",    cmd_mach,    help_mach,    0},

각 커맨드의 이력을 확인하자.

^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  71) struct command_table_entry linux_command_table[] = {
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  72)  {"*",       cmd_pointer, help_pointer, 0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  73)  {"alias",   cmd_alias,   help_alias,   0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  74)         {"ascii",   cmd_ascii,   help_ascii,   0},
dacfbe8a (Dave Anderson 2018-04-19 15:53:40 -0400  75)         {"bpf",     cmd_bpf,     help_bpf,     0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  76)         {"bt",      cmd_bt,      help_bt,      REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  77)  {"btop",    cmd_btop,    help_btop,    0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  78)  {"dev",     cmd_dev,     help_dev,     0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  79)  {"dis",     cmd_dis,     help_dis,     MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  80)  {"eval",    cmd_eval,    help_eval,    MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  81)  {"exit",    cmd_quit,    help_exit,    MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  82)  {"extend",  cmd_extend,  help_extend,  MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  83)  {"files",   cmd_files,   help_files,   REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  84)  {"foreach", cmd_foreach, help_foreach, REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  85)  {"fuser",   cmd_fuser,   help_fuser,   REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  86)  {"gdb",     cmd_gdb,     help_gdb,     REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  87)         {"help",    cmd_help,    help_help,    MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  88)  {"ipcs",    cmd_ipcs,    help_ipcs,    REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  89)  {"irq",     cmd_irq,     help_irq,     0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  90)  {"kmem",    cmd_kmem,    help_kmem,    0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  91)  {"list",    cmd_list,    help__list,   REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  92)  {"log",     cmd_log,     help_log,     MINIMAL},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  93)  {"mach",    cmd_mach,    help_mach,    0},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  94)  {"map",     cmd_map,     help_map,     HIDDEN_COMMAND},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  95)  {"mod",     cmd_mod,     help_mod,     0},
601bcced (Dave Anderson 2020-04-15 09:08:10 -0400  96)  {"mount",   cmd_mount,   help_mount,   REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  97)  {"net",     cmd_net,    help_net,      REFRESH_TASK_TABLE},
^03e3937 (Dave Anderson 2014-01-28 16:46:11 -0500  98)  {"p",       cmd_p,       help_p,       0},

어라? 커맨드가 거의 추가되지 않았네? 최근에 추가된 아래 커밋을 보자.

601bcced (Dave Anderson 2020-04-15 09:08:10 -0400  96)  {"mount",   cmd_mount,   help_mount,   REFRESH_TASK_TABLE},

commit 601bccedc3300b16f7ff074ba651876af106ffdc
Author: Dave Anderson  
Date:   Wed Apr 15 09:08:10 2020 -0400

    Fix for the "mount -n [pid|task]" option when running on a live
    system.  Without the patch, if the [pid|task] has been created since
    the last internal task table refresh, the command fails with the
    error message "mount: invalid task or pid value: <value>".
    (w@laoqinren.net)

diff --git a/global_data.c b/global_data.c
index cbacc42..a316d1c 100644
--- a/global_data.c
+++ b/global_data.c
@@ -93,7 +93,7 @@ struct command_table_entry linux_command_table[] = {
        {"mach",    cmd_mach,    help_mach,    0},
        {"map",     cmd_map,     help_map,     HIDDEN_COMMAND},
        {"mod",     cmd_mod,     help_mod,     0},
-       {"mount",   cmd_mount,   help_mount,   0},
+       {"mount",   cmd_mount,   help_mount,   REFRESH_TASK_TABLE},
        {"net",     cmd_net,    help_net,      REFRESH_TASK_TABLE},
        {"p",       cmd_p,       help_p,       0},
        {"ps",      cmd_ps,      help_ps,      REFRESH_TASK_TABLE},

우선 기존에 존재하는 커맨드에서 옵션을 추가하는 방향으로 진행해야 겠다.

commit dacfbe8ab124976c62ebe0431c8cf22456945e53
Author: Dave Anderson 
Date:   Thu Apr 19 15:53:40 2018 -0400

    Introduction of a new "bpf" command that displays information about
    loaded eBFP (extended Berkeley Packet Filter) programs and maps.
    Because of its upstream fluidity, the capabilities of this command
    will be an ongoing task.  In its initial form, the command displays
    the addresses, basic information, and key data structures of eBPF
    programs and maps.  It also translates the bytecode, and disassembles
    the jited code, of loaded eBPF programs.

diff --git a/global_data.c b/global_data.c
index 998aaae..cbacc42 100644
--- a/global_data.c
+++ b/global_data.c
@@ -1,8 +1,8 @@
 /* global_data.c - core analysis suite
  *
  * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -72,6 +72,7 @@ struct command_table_entry linux_command_table[] = {
        {"*",       cmd_pointer, help_pointer, 0},
        {"alias",   cmd_alias,   help_alias,   0},
         {"ascii",   cmd_ascii,   help_ascii,   0},
+        {"bpf",     cmd_bpf,     help_bpf,     0},
         {"bt",      cmd_bt,      help_bt,      REFRESH_TASK_TABLE},
        {"btop",    cmd_btop,    help_btop,    0},
        {"dev",     cmd_dev,     help_dev,     0},

+cmd_bpf(void)
+{
+       int c, radix;
+       ulong flags, id;
+       char *structarg;
+
+       flags = id = radix = 0;
+       structarg = NULL;
+
+       while ((c = getopt(argcnt, args, "tTjsxdm:p:")) != EOF) {
+               switch(c)
+               {
+               case 'j':
+                       flags |= JITED;
+                       break;
+               case 'T':
+                       flags |= (XLATED|OPCODES);
+                       break;
+               case 't':
+                       flags |= XLATED;
+                       break;
+               case 'm':
+                       if (flags & PROG_ID)
+                               error(FATAL, "-m and -p options are mutually exclusive\n");
+                       id = stol(optarg, FAULT_ON_ERROR, NULL);
+                       flags |= MAP_ID;
+                       break;


덧글

  • Paran Lee 2022/08/10 16:52 # 삭제 답글

    안녕하세요, 좋은 분석자료 항상 감사합니다!
    David Anderson 커미터를 따라가니 아래와 같은 자료가 있네요.

    White Paper: Crash Utility
    by David Anderson

    - https://crash-utility.github.io/crash_whitepaper.html
댓글 입력 영역