読者です 読者をやめる 読者になる 読者になる

minixってF4とかShift+F3キーを押すと色んな情報を出せるので、自作の情報表示用関数を開いてるキーに割り当てるメモ。

minix

ファンクションキーを使って情報表示させているのはisサーバでソースはservice/is。
関数を追加したい場合はisディレクトリにあるdmp.c、proto.hを変更する。
dmp.cの中で変更するのはNHOOKの数と、hook_entry構造体を初期化している箇所。

#define NHOOKS 15

struct hook_entry {
        int key;
        void (*function)(void);
        char *name;
} hooks[NHOOKS] = {
        { F1,   proctab_dmp, "Kernel process table" },
        { F2,   memmap_dmp, "Process memory maps" },
        { F3,   image_dmp, "System image" },
        { F4,   privileges_dmp, "Process privileges" },
        { F5,   monparams_dmp, "Boot monitor parameters" },
        { F6,   irqtab_dmp, "IRQ hooks and policies" },
        { F7,   kmessages_dmp, "Kernel messages" },
        { F10,  kenv_dmp, "Kernel parameters" },
        { F11,  timing_dmp, "Timing details (if enabled)" },
        { F12,  sched_dmp, "Scheduling queues" },
        { SF1,  mproc_dmp, "Process manager process table" },
        { SF2,  sigaction_dmp, "Signals" },
        { SF3,  fproc_dmp, "Filesystem process table" },
        { SF4,  dtab_dmp, "Device/Driver mapping" },
        { SF5,  mapping_dmp, "Print key mappings" },
};

例えば、hello()をF8キーに割り当てるならこんな感じで。

#define NHOOKS 16

struct hook_entry {
        int key;
        void (*function)(void);
        char *name;
} hooks[NHOOKS] = {
        { F1,   proctab_dmp, "Kernel process table" },
        { F2,   memmap_dmp, "Process memory maps" },
        { F3,   image_dmp, "System image" },
        { F4,   privileges_dmp, "Process privileges" },
        { F5,   monparams_dmp, "Boot monitor parameters" },
        { F6,   irqtab_dmp, "IRQ hooks and policies" },
        { F7,   kmessages_dmp, "Kernel messages" },
        { F8,   hello, "Test function" },
        { F10,  kenv_dmp, "Kernel parameters" },
        { F11,  timing_dmp, "Timing details (if enabled)" },
        { F12,  sched_dmp, "Scheduling queues" },
        { SF1,  mproc_dmp, "Process manager process table" },
        { SF2,  sigaction_dmp, "Signals" },
        { SF3,  fproc_dmp, "Filesystem process table" },
        { SF4,  dtab_dmp, "Device/Driver mapping" },
        { SF5,  mapping_dmp, "Print key mappings" },
};

proto.hではhello()の定義をする

/* dmp_kernel.c */
_PROTOTYPE( void proctab_dmp, (void)                                    );
_PROTOTYPE( void memmap_dmp, (void)                                     );
_PROTOTYPE( void privileges_dmp, (void)                                 );
_PROTOTYPE( void sendmask_dmp, (void)                                   );
_PROTOTYPE( void image_dmp, (void)                                      );
_PROTOTYPE( void irqtab_dmp, (void)                                     );
_PROTOTYPE( void kmessages_dmp, (void)                                  );
_PROTOTYPE( void sched_dmp, (void)                                      );
_PROTOTYPE( void monparams_dmp, (void)                                  );
_PROTOTYPE( void kenv_dmp, (void)                                       );
_PROTOTYPE( void timing_dmp, (void)                                     );
_PROTOTYPE( void hello, (void)                                     );

関数をどのファイルで実装するかは目的によるので、今回はお手軽にdmp_kernel.cに追加する。

/*===========================================================================*
 *                              hello                                        *
 *===========================================================================*/
PUBLIC void hello(void)
{
        printf("test\n");
}

これで、make worldとかしてビルドして再起動すればF8キー押下で"test"って画面に表示されるようになる。