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

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

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Никак не могу найти пример запуска приложений из ядра linux !!!
    Мне надо запустить /bin/sh из ядра, так чтоб можно было писать туда команды и считывать ответы)
    как это сделать? please пример кода.
     
  2. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    usermodehelper_exec() из контекста обладающего терминалом
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    stmia
    А можно маленький пример кода??
    пожалуйста..
     
  4. stmia

    stmia New Member

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

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    stmia
    ОГРОМНОЕ спасибо за ответ.
    Покачто буду дальше сам разбираться)
     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    stmia
    Блин, я так и не понял как открыть терминал из ядра.
    Ни то как открыть /bin/sh ни то, как считывать данные из файла.
    ( модуль создаёт поток через kernel_thread ) и в этом потоке, я пытаюсь считать через vfs_read содержимое определённого файла.
    Причём файл открывается нормально на чтение, inode правильно установлен. Но данные не читаются в буффер.
    VFS_READ возвращает -14
    А если данные читать не в функции запущенной vfs_thread, то всё считается нормально.

    Не понимаю как это поправить...


    + хочу понять, если открыть через filp_open /bin/sh ... то консоль запустится? и ей можно будет давать команды через vfs_write и считывать вывод через vfs_read ..???
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    featurelles
    Ядро этой недооси тут никто не знает. Поставить винь и не париться ;)
     
  8. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Clerk
    Не будем о холиваре..и о том, пригодились ли вам ваши знания api windows...
     
  9. stmia

    stmia New Member

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

    если вы напишете что вы хотите получить и приведете пример своего кода я могу помочь
    вам с архитектурой. Мой телепатический скилл изрядно упал в последнюю неделю ;)
     
  10. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    >>>
    хочу понять, если открыть через filp_open /bin/sh ... то консоль запустится? и ей можно будет давать команды через vfs_write и считывать вывод через vfs_read ..???
    >>>

    не поняла вопроса. filp_open не запускает никаких процессов, он просто возвращает некую struct file* или NULL.
    каждый процесс обладает stdin, stdout и stderr, так что если вы будете писать vfs_write в его stdin и читать
    vfs_read его stdout/stderr то в принципе теоретических проблем с этим я не вижу
     
  11. featurelles

    featurelles New Member

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



    пример кода



    Код (Text):
    1. int start_func(struct config_struct *config_struct_ptr);
    2.  
    3. int start_func(struct config_struct *config_struct_ptr)
    4. {
    5.  /* в этой функции , у меня создаётся сокет и привязывается к определённому порту */
    6.  
    7. /* мне нужно чтоб при коннекте к моему "серверу" открывалась консоль )... и чтоб в неё можно было писать команды полученные через соединение, также надо, чтоб из этой консоли считывались данные  */
    8.  
    9. // Собственно, я не знаю, как открыть или /bin/sh или чтото другое из модуля, чтоб получить управление)
    10.  
    11.  
    12.  
    13. }
    14.  
    15.  
    16.  
    17. /*  начало модуля */
    18. init(  )
    19. {
    20.    struct config_struct *config_struct_ptr; // структура содержит всякие параметры для использования внутри функции start_func
    21.   config_struct_ptr = kmalloc( sizeof(struct config_struct), GFP_ATOMIC);
    22.  
    23.    /* создаём поток  */
    24.    kernel_thread( start_func , config_struct_ptr, CLONE_FS | CLONE_FILES );
    25.  
    26.  kfree(config_struct_ptr);
    27. return 0;
    28. }
     
  12. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    ну знаете, вы очень забавный человек если считаете что по приведеному огрызку можно в чем-то помочь :)
    кроме того зачем тащить back-door в ядро если его чудно можно разместить в user-space ?
     
  13. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Разместить, то можно..
    .Но мне нужно в плане образования)

    (кстати, этого огрызка кода достаточно, так как в start_func нужно разместить код, который мне не известен (тоесть открытие консоли) , меня щас интересует только это. Ну и конечно как записывать данные в консоль и считывать вывод. )
     
  14. stmia

    stmia New Member

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

    Вы хотите чтобы вам помогли разобраться в проблеме/проблемах которые возникают в Вашем коде или все написали с нуля ?
     
  15. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Мне нужно только, чтоб показали как открыть консоль, записывать и считывать из неё данные. Вот и всё.
    Тоесть.
    Чтоб открыть консоль , применяем "эту функцию с такими аргументами", затем чтоб в неё записать команду применяем "эту функцию с такими аргументами", чтоб считать вывод консоли, применим "эту функцию"..
    Вот и всё
     
  16. stmia

    stmia New Member

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

    запустить процесс можно так:
    Код (Text):
    1. static void run_userspace_process()
    2. {
    3.       const char *envp[] = {"HOME=/", "PATH=/bin:/sbin:/usr/bin:/any/shit/you/want/to/see/here", NULL};
    4.       const char *argv[] = { "/bin/process/name", "first arg", "second arg", "third arg", NULL };
    5.  
    6.       return call_usermodehelper("/bin/process/name", argv, envp, 1);
    7. }
    после того как процесс запущен, вы делаете sys_close() для его файловых дескрипторов 0, 1, 2.
    после делаете fd_install() cвоих struct file* (сокет или что это у вас там). в результате процесс начинает
    читать из сокета и писать туда же
     
  17. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Под терминалом и консолью я подразумевал, "что-то" куда можно писать команды наподобии "ls -l" ... cat /dev/urandom > /dev/mem и тд )

    Я видимо опять туплю).. и начинаю дальше вопросы задавать, так как ничего не понимаю.
    1) call_usermodehelper("/bin/process/name", argv, envp, 1);
    возвращает тип int , точнее число. Что это число значит? дескриптор запущенного процесса?

    2) зачем делать sys_close() для его файловых дескрипторов 0, 1, 2.

    ну и третье) sorry за подобные вопросы)
     
  18. stmia

    stmia New Member

    Публикаций:
    0
    Регистрация:
    29 июн 2009
    Сообщения:
    35
    тогда этот "терминал" будет на вашей стороне - telnet или чем вы цепляетесь :)

    1) нет, это код возврата процесса либо код ошибки если до создания процесса дело не дошло.
    2) затем чтобы не было утечек. fd_install() установит новые дескрипторы в слоты - но не уменшит
    счетчики ссылок у старых
    3) it`s ok.

    кстати использовать call_usermodehelper совсем не обязательно (он может быть и недоступен)
    надо просто
    1. создать процесс (например через kernel_thread или sys_fork) либо пробудиться в контексте процесса
    2. в контексте этого процесса очистить sigmask/sigpending mask
    3. закрыть 0,1,2 унаследованные от предка
    4. выставить свои 0, 1, 2
    5. выполнить kernel_execve()
    6. если на шаге 5 обломались - выполнить do_exit().
     
  19. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    stmia
    Сейчас попробую без call_usermodehelper ..
    Ох чувствую через пол часа опять появится куча вопросов...
     
  20. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    У меня ничего не вышло!
    Пожалуйста! приведите пример кода, записи и чтения в процесс, запущенный так
    static void run_userspace_process()
    {
    const char *envp[] = {"HOME=/", "PATH=/bin:/sbin:/usr/bin:/any/shit/you/want/to/see/here", NULL};
    const char *argv[] = { "/bin/process/name", "first arg", "second arg", "third arg", NULL };

    return call_usermodehelper("/bin/process/name", argv, envp, 1);
    }