Как запустить приложение из ядра?

Тема в разделе "WASM.UNIX", создана пользователем featurelles, 21 мар 2010.

  1. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    мне нужна тачка для отладки
     
  2. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    stmia
    Я тебе личное сообщение отослал)
     
  3. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    и покажите свой код с которым у вас ничего не получилось, иначе я не смогу указать вам на ошибки
     
  4. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    вот пример кода который запускает скрипт по нажатию левого альт.
    код полурабочий но общую идею вы должны уловить

    Код (Text):
    1. #include <linux/kernel.h>
    2. #include <linux/module.h>
    3. #include <linux/tty.h>
    4. #include <linux/mm.h>
    5. #include <linux/kbd_kern.h>
    6. #include <linux/kbd_diacr.h>
    7. #include <linux/input.h>
    8.  
    9. #define START_SCRIPT 0x1
    10. #define STOP_SCRIPT  0x2
    11.  
    12. static int cmd = 0;
    13. static DECLARE_MUTEX(run_sem);
    14. static char *argv[] = {"test_script", NULL};
    15. static char *envp[] = {"TERM=linux", NULL};
    16.  
    17. static int script_runner(void *unused) {
    18.    for (;;) {
    19.        down(&run_sem);
    20.        switch (cmd) {
    21.           case START_SCRIPT:
    22.             (void)call_usermodehelper("/test/test_script",
    23.     argv, envp, 1);
    24.           case STOP_SCRIPT:
    25.           break;
    26.         }
    27.    }
    28.   return 0;
    29. }
    30.  
    31. static void test_event(struct input_handle *h, unsigned int e_type,
    32. unsigned int e_code, int value) {
    33.   if (e_type == EV_KEY)
    34.    if (e_code == KEY_LEFTALT) {
    35.      cmd = START_SCRIPT;
    36.      up(&run_sem);
    37.    }
    38. }
    39.  
    40. static
    41. struct input_handle *test_connect(
    42.  struct input_handler *h, struct input_dev *d,
    43. struct input_device_id *id) {
    44.  struct input_handle *res = NULL;
    45.  int i = 0;
    46.  for (i = KEY_RESERVED; i < BTN_MISC; i++)
    47.   if (test_bit(i, dev->keybit))
    48.     break;
    49.   if (i == BTN_MISC && !test_bit(EV_SNDm, dev->ebit))
    50.     return NULL;
    51.  res = kmalloc(sizeof(*res), GFP_KERNEL);
    52.  memset(res, 0, sizeof(*res));
    53.  res->dev = dev;
    54.  res->handler = h;
    55.  res->name = "k_test";
    56.  input_open_device(res);
    57.  return res;
    58. }
    59.  
    60. static void test_disconnect(struct input_handler *h) {
    61.    input_close_device(h);
    62.    kfree(h);
    63. }
    64.  
    65. static struct input_device_id test_table[] = {
    66. {
    67.   .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
    68.   .evbit = { BIT(EV_KEY) },
    69. },
    70. {
    71.   .flags = INPUT_DEVICE_ID_MATCH_EVBIT,
    72.   .evbit = { BIT(EV_KEY) },
    73. },
    74. {},
    75. };
    76.  
    77. static struct input_handler test_handler = {
    78.  .event = test_event,
    79.  .connect = test_connect,
    80.  .disconnect = test_disconnect,
    81.  .name = "k_test",
    82.  .id_table = test_table,
    83. };
    84.  
    85. int init_module() {
    86.   input_register_handler(&test_handler);
    87.   (void)kernel_thread(script_runner, NULL, 0);
    88.   return 0;
    89. }
    90.  
    91. void cleanup_module()
    92. {
    93.    input_unregister_module(&test_handler);
    94. }
     
  5. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    написать процессу в stdin:

    int write_to_stdin(const struct task_struct *proc, const char *buf, int size)
    {
    mm_segment_t oldfs;
    int ret = size;
    oldfs = get_fs();
    set_fs(KERNEL_DS);
    ret = vfs_write(proc->files->fd_array[0], buf, size);
    set_fs(oldfs);
    return ret;
    }

    почитать stdout - аналогично