LINUX.ORG.RU

Сообщения Aresss

 

Cоздание нового процесса ядром

Запускаю прогу через strace , вижу что делается вызов execve , в модуле ядра ставлю перехватчик на do_execve и на do_fork (на ядрах 2,6 - 3.х процессы создаются с помощью этих функций). А пробую модуль запускать на 4.х ядрах, то при создании нового процесса, данные функции не задействуются вообще! Пробовал ставить перехватчик на «_do_fork» , то данную функцию использует всего несколько процессов (например bash)
А если запустить в терминале мою программу «main» , то она запустится но ни одна из вышеописанных функций не будет задействована!
Помогите! С помощью каких ещё функций, ядро создаёт новые процессы?

 

Aresss
()

Изменение укаазателя mm, задачи.

Kод весь не привожу, его слишком много чтоб просматривать, да и он полностью отлажен и оттестирован.(опишу позже как тестировал)
Вопрос, да и сама проблема связана с вызовом функции do_mmap_pgoff
А конкретнее её вызов для процесса пользовательского пространства, из потока ядра. Проблема заключается в том, что эта функция работает с значением current->mm (в исходниках функции, да и в остальных вызываемых ей функциях, работа производится с current).
И вот что имеем:
Поток ядра, вызывает функцию do_mmap_pgoff для процесса temperature_indicator.
У потока ядра есть указатель на struct task_struct датчика температуры: struct task_struct *temperature_indicator_ptr; // указатель инициалезируется при запуске программы
Осуществляется проверка статуса процесса «temperature_indicator» закончил ли работу? активен ли? Если активен, то получаем блокировку для его
down_write(&temperature_indicator_ptr->mm->mmap_sem);
Далее делаю так, чтоб можно было вызвать функцию сurrent->mm = temperature_indicator_ptr->mm
(Понимаю что так не стоит делать, но как тогда быть?) Меня очень смущает такой способ, вызова функции
И пробуем выделить дополнительное пространство для процесса! (одну страницу памяти)
do_mmap_pgoff(NULL, addr, 1, PROT_READ, MAP_PRIVATE, 0);
addr - это конечный адрес кучи процесса.
Данное действие заканчивается успешно, ура! Память выделена, с ней можно работать.

(далее восстанавливаю указатель в сurrent->mm и снимаю блокировку с mmap_sem)
Да тут кроется проблема, которая проявляется при тестах.
Система зависает (рано или поздно). именно изза вызова do_mmap_pgoff ! Если этот вызов не делать то программа работает стабильно.(крутил сутками! тестирование)
тесты заключаются в бесконечном запуске программы, и её закрытии (несколько баш скриптов запускаю, один бесконечно прогу запускает, другой делает постоянно с разной периодичностью killall «temperature indicator info»)

Получается плавающая ошибка, которая «примерно известно» при каких условиях проявляется, но именно что примерно.
Есть какиенить идеи? что может быть? (напоминаю, только при вызове do_mmap_pgoff зависание периодическое происходит)
Может какието блокировки нужно ставить? на процесс? память? Подскажите!

 

Aresss
()

Память процесса

Как отобразить память пользовательского процесса в ядре? чтоб можно было его читать?
Пробую получить список страниц памяти процесса, через get_user_pages , запрошено 7000 страниц, а функция возвращает (10..или 5... но значение больше нуля).Т.е нет реального отображения.
Как сделать, чтоб (память, тело, файл или что там ещё может быть) процесса, была отображена в памяти.
И ещё вопрос, число реально отображённых страниц памяти процесса меньше запрошенной, изза того что «действует» отложенное выделение страниц памяти? (или я чтото не понимаю)

 

Aresss
()

Помогите расшифровать oops

Замучался с тестами (которые весьма продолжительны по времени) потому прошу помощи.
Пишу модуль ядра, он запускает новый поток обработки данных при запуске программы MyProgram
Примеры кода не буду показывать. (он максимльно упрощен)
Обычно, модуль работает без сбоев. Но если произвести тест работы с помощью баш скрипта, который постоянно создаёт условие , чтоб модуль создавал новый поток ядра, то система звисает. При разном количестве созданных потоков модулем(и завершённых). Может зависнуть при 100 созданных потоках, и может при 100,000...
На первый взгляд. (да и на 50-й) код чист. В создаваемые потоки передаётся указатель на новую выделенную память (для каждого потока). При работе с данными использую один семафор.
Эт всё написал, чтоб была общая картина... Так вот. Снова провел тесты, и в dmesg вывалился oops до зависания системы
Вот он. Помогите в нём разобраться. В каком направлении искать ошибку??


[ 2124.267682] INFO: rcu_sched detected stalls on CPUs/tasks: { 2} (detected by 0, t=15002 jiffies, g=132799, c=132798, q=0)
[ 2124.267694] sending NMI to all CPUs:
[ 2090.892412] NMI backtrace for cpu 2
[ 2090.892412] CPU: 2 PID: 1100 Comm: MyProgram Tainted: G           OX 3.13.0-45-generic #74-Ubuntu
[ 2090.892412] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[ 2090.892412] task: ffff880078af6000 ti: ffff880049564000 task.ti: ffff880049564000
[ 2090.892412] RIP: 0010:[<ffffffff8104f5a5>]  [<ffffffff8104f5a5>] native_halt+0x5/0x10
[ 2090.892412] RSP: 0018:ffff8800495659f0  EFLAGS: 00000046
[ 2090.892412] RAX: 0000000000000008 RBX: ffff88007fd0cfc0 RCX: 0000000000000001
[ 2090.892412] RDX: 0000000000000000 RSI: 0000000000000006 RDI: ffff88007ffe7080
[ 2090.892412] RBP: ffff8800495659f0 R08: 0000000000000002 R09: 00007feb26a947b8
[ 2090.892412] R10: 00007feb26a947b8 R11: 0000000000000246 R12: 0000000000000002
[ 2090.892412] R13: 0000000000000000 R14: 0000097e7f0012c9 R15: 0000000000000096
[ 2090.892412] FS:  00007feb281fa780(0000) GS:ffff88007fd00000(0000) knlGS:0000000000000000
[ 2090.892412] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2090.892412] CR2: 0000000000d7df38 CR3: 00000000372e5000 CR4: 00000000000006e0
[ 2090.892412] Stack:
[ 2090.892412]  ffff880049565a30 ffffffff8104ec25 0000000678af6000 ffff8800302b9100
[ 2090.892412]  ffff880049565ce0 ffff8800302b9100 0000000000000000 ffff880049565ca0
[ 2090.892412]  ffff880049565a88 ffffffff8104e381 0000000000000246 00007feb26a947b8
[ 2090.892412] Call Trace:
[ 2090.892412]  [<ffffffff8104ec25>] kvm_lock_spinning+0x125/0x1b0
[ 2090.892412]  [<ffffffff8104e381>] __raw_callee_save_kvm_lock_spinning+0x11/0x20
[ 2090.892412]  [<ffffffff81728f73>] ? _raw_spin_lock_irqsave+0x53/0x60
[ 2090.892412]  [<ffffffff810aab2a>] add_wait_queue+0x1a/0x50
[ 2090.892412]  [<ffffffff811d182f>] __pollwait+0x7f/0xf0
[ 2090.892412]  [<ffffffff816bb159>] unix_poll+0x29/0xc0
[ 2090.892412]  [<ffffffff8160bf4c>] sock_poll+0x4c/0x100
[ 2090.892412]  [<ffffffff811d2dae>] do_sys_poll+0x2fe/0x540
[ 2090.892412]  [<ffffffff81615111>] ? __kmalloc_reserve.isra.26+0x31/0x90
[ 2090.892412]  [<ffffffff81615a6e>] ? __alloc_skb+0x4e/0x2b0
[ 2090.892412]  [<ffffffff81615ab2>] ? __alloc_skb+0x92/0x2b0
[ 2090.892412]  [<ffffffff81619e93>] ? memcpy_fromiovecend+0x83/0xb0
[ 2090.892412]  [<ffffffff8161a70f>] ? skb_copy_datagram_from_iovec+0x5f/0x290
[ 2090.892412]  [<ffffffff811d17b0>] ? poll_initwait+0x50/0x50
[ 2090.892412]  [<ffffffff811d1a70>] ? poll_select_copy_remaining+0x130/0x130
[ 2090.892412]  [<ffffffff816bbb16>] ? unix_stream_sendmsg+0x3c6/0x400
[ 2090.892412]  [<ffffffff8160b4de>] ? sock_aio_write+0xfe/0x130
[ 2090.892412]  [<ffffffff8172cf54>] ? __do_page_fault+0x204/0x560
[ 2090.892412]  [<ffffffff811ff821>] ? fsnotify+0x241/0x320
[ 2090.892412]  [<ffffffff811bdc8c>] ? vfs_write+0x15c/0x1f0
[ 2090.892412]  [<ffffffff811d30c5>] SyS_poll+0x65/0x100
[ 2090.892412]  [<ffffffff8173196d>] system_call_fastpath+0x1a/0x1f
[ 2090.892412] Code: 84 00 00 00 00 00 55 48 89 e5 fb 5d c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 5d c3 0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 <5d> c3 66 0f 1f 84 00 00 00 00 00 55 49 89 ca 49 89 d1 8b 07 48 
[ 2124.198965] NMI backtrace for cpu 1
[ 2124.198965] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G           OX 3.13.0-45-generic #74-Ubuntu
[ 2124.198965] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[ 2124.198965] task: ffff88007c041800 ti: ffff88007c04a000 task.ti: ffff88007c04a000
[ 2124.198965] RIP: 0010:[<ffffffff8104f596>]  [<ffffffff8104f596>] native_safe_halt+0x6/0x10
[ 2124.198965] RSP: 0018:ffff88007c04bea8  EFLAGS: 00000286
[ 2124.198965] RAX: 00000000ffffffed RBX: ffff88007c04bf38 RCX: 0100000000000000
[ 2124.198965] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000046
[ 2124.198965] RBP: ffff88007c04bea8 R08: 0000000000000000 R09: 0000000000000000
[ 2124.198965] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001
[ 2124.198965] R13: ffffffff81d142c0 R14: 0000000000000000 R15: ffff88007c04bfd8
[ 2124.198965] FS:  0000000000000000(0000) GS:ffff88007fc80000(0000) knlGS:0000000000000000
[ 2124.198965] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[ 2124.198965] CR2: 00007fd59ec69f10 CR3: 0000000060832000 CR4: 00000000000006e0
[ 2124.198965] Stack:
[ 2124.198965]  ffff88007c04bec8 ffffffff8101caaf ffff88007c04bf38 ffff88007c04bfd8
[ 2124.198965]  ffff88007c04bed8 ffffffff8101d376 ffff88007c04bf28 ffffffff810bef35
[ 2124.198965]  ffff88007c04bfd8 ffff88007c04bfd8 906b43aef1445783 ffff88007c04bf38
[ 2124.198965] Call Trace:
[ 2124.198965]  [<ffffffff8101caaf>] default_idle+0x1f/0xc0
[ 2124.198965]  [<ffffffff8101d376>] arch_cpu_idle+0x26/0x30
[ 2124.198965]  [<ffffffff810bef35>] cpu_startup_entry+0xc5/0x290
[ 2124.198965]  [<ffffffff810413fd>] start_secondary+0x21d/0x2d0
[ 2124.198965] Code: 00 00 00 00 00 55 48 89 e5 fa 5d c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb 5d c3 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 fb f4 <5d> c3 0f 1f 84 00 00 00 00 00 55 48 89 e5 f4 5d c3 66 0f 1f 84 
[ 2124.268911] NMI backtrace for cpu 0
[ 2124.268916] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G           OX 3.13.0-45-generic #74-Ubuntu
[ 2124.268918] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
[ 2124.268920] task: ffffffff81c15480 ti: ffffffff81c00000 task.ti: ffffffff81c00000
[ 2124.268922] RIP: 0010:[<ffffffff810498af>]  [<ffffffff810498af>] flat_send_IPI_all+0x8f/0xa0
[ 2124.268928] RSP: 0018:ffff88007fc03dd8  EFLAGS: 00000006
[ 2124.268929] RAX: 0000000000000000 RBX: 0000000000000046 RCX: 0000000007000000
[ 2124.268931] RDX: 0000000000000c00 RSI: ffffffff81c26e80 RDI: 0000000000000300
[ 2124.268933] RBP: ffff88007fc03df0 R08: 0000000000000082 R09: 000000000000064c
[ 2124.268934] R10: 0000000000000000 R11: ffff88007fc03b2e R12: 0000000000000800
[ 2124.268936] R13: 0000000000000007 R14: ffffffff81c4e180 R15: 0000000000000000
[ 2124.268941] FS:  0000000000000000(0000) GS:ffff88007fc00000(0000) knlGS:0000000000000000
[ 2124.268943] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[ 2124.268944] CR2: 00007f195c1562d0 CR3: 000000006d6d8000 CR4: 00000000000006f0
[ 2124.268948] Stack:
[ 2124.268950]  0000000000002710 ffffffff81c4e180 ffffffff81d142e0 ffff88007fc03e08
[ 2124.268953]  ffffffff81045120 ffff88007fc0d840 ffff88007fc03e60 ffffffff810cafb1
[ 2124.268956]  ffffffff81c4e180 ffffffff00000002 0000000000000000 0000000000000001
[ 2124.268959] Call Trace:
[ 2124.268961]  <IRQ> 
[ 2124.268963]  [<ffffffff81045120>] arch_trigger_all_cpu_backtrace+0x70/0xb0
[ 2124.268969]  [<ffffffff810cafb1>] rcu_check_callbacks+0x631/0x650
[ 2124.268973]  [<ffffffff81076377>] update_process_times+0x47/0x70
[ 2124.268977]  [<ffffffff810d6175>] tick_sched_handle.isra.17+0x25/0x60
[ 2124.268979]  [<ffffffff810d61f1>] tick_sched_timer+0x41/0x60
[ 2124.268983]  [<ffffffff8108e787>] __run_hrtimer+0x77/0x1d0
[ 2124.268985]  [<ffffffff810d61b0>] ? tick_sched_handle.isra.17+0x60/0x60
[ 2124.268988]  [<ffffffff8108ef4f>] hrtimer_interrupt+0xef/0x230
[ 2124.268992]  [<ffffffff81043537>] local_apic_timer_interrupt+0x37/0x60
[ 2124.268996]  [<ffffffff81733d4f>] smp_apic_timer_interrupt+0x3f/0x60
[ 2124.268998]  [<ffffffff817326dd>] apic_timer_interrupt+0x6d/0x80
[ 2124.269000]  <EOI> 
[ 2124.269001]  [<ffffffff8104f596>] ? native_safe_halt+0x6/0x10
[ 2124.269007]  [<ffffffff8101caaf>] default_idle+0x1f/0xc0
[ 2124.269010]  [<ffffffff8101d376>] arch_cpu_idle+0x26/0x30
[ 2124.269013]  [<ffffffff810bef35>] cpu_startup_entry+0xc5/0x290
[ 2124.269016]  [<ffffffff8170f377>] rest_init+0x77/0x80
[ 2124.269021]  [<ffffffff81d35f70>] start_kernel+0x438/0x443
[ 2124.269023]  [<ffffffff81d35941>] ? repair_env_string+0x5c/0x5c
[ 2124.269026]  [<ffffffff81d35120>] ? early_idt_handlers+0x120/0x120
[ 2124.269028]  [<ffffffff81d355ee>] x86_64_start_reservations+0x2a/0x2c
[ 2124.269031]  [<ffffffff81d35733>] x86_64_start_kernel+0x143/0x152
[ 2124.269032] Code: 48 8b 35 7d a7 cc 00 44 8b 66 3c ff 96 50 01 00 00 44 89 e9 c1 e1 18 89 0c 25 10 73 5f ff 44 89 e2 80 ce 04 89 14 25 00 73 5f ff <48> 89 df 57 9d 66 66 90 66 90 5b 41 5c 41 5d 5d c3 66 66 66 66 

 

Aresss
()

Память пользовательского пространства

Замучался уже, методом перебора действовать.
Модуль работает с памятью процесса пользовательского уровня. Получает указатели в этой памяти, и тд.
Есть беда, когда пользовательский процесс завершается, то модуль не знает об этом и продолжает работать с mm которой уже нету. Происходит порча памяти, и зависание. Пробовал в mm счётчики (mm_count, mm_users)использования увеличивать. Не спасает. при завершении процесса, очищается память mm , а в task_struct указатель mm cтановится равен null
Как исправить проблему? как уберечь mm от очистки до завершения работы модуля с данной памятью?

 

Aresss
()

Блокировки

У меня работают несколько потоков, которые взаимодействуют с двумя двунаправленными списками, создают и удаляют элементы списка. Также изменяют данные в элементах списков.(элементы этих двух списков ссылаются на элементы друг друга)
Меня интересует как правильно защитить эти данные?
Можно ли удерживать несколько спин блокировок одним процессом?
Знаю что нельзя захватывать семафор при захваченой спин блокировке, а возможно ли обратное? захват спин блокировки, при захваченном семафоре?

 

Aresss
()

file-max limit 150000 reached

В модуле ядра делаю такой тест

int max = 200000 ;
for(i=0; i < max; i++)
  {
      struct file *file_struct = NULL;
      file_struct = filp_open('/home/Aress/my_file', O_RDONLY, 0);
      filp_close(file_struct, NULL);
  };

При работе модуля, открываем и закрываем файл 200000 раз.
Во время работы, в лог dmesg попадает сообщение file-max limit 150000 reached
Такое ощущение, как-будто файл открывается, и не закрывается.
В чём проблема?

 

Aresss
()

Скрыть названия функций от strings

Доброе утро!
Делаю приложение в котором пользователь проходит аутентификацию.(Очень простую). И у меня есть в программе объявление массива , скажем char keys[1024]; с статическими значениями. Также есть функция check_key(char *user_key). После компиляции программы, через gcc произвожу команду strings , и она выводит все строки в программе, включая название массива keys , и функции check_key.
Как сделать так, чтоб эти данные не отображались данной командой(или какой другой)?

 

Aresss
()

Обработка исключений в ядре

Мне нужно в модуле обработать исключение вызванное приложением прикладного уровня, при доступе к памяти (обработать ситуацию, деления на ноль, либо доступ к не разрешённым адресам).
В модуле ядра, выделяю память под struct exception_table_entry и пробую зарегестрировать свой обработчик исключительной ситуации.(в модуле указал, адрес своего обработчика и количество этих обработчиков)
Для этого указываю insn - виртуальный адрес, памяти которая вызывает сбой.
insn = 0xffff88000c4560c0
(соответствует 00007ffa855050c0 - в юзерспайсе, приложении ) а также
fixup - функцию обработчик ( int my_fixup( void ) )
fixup = my_fixup
Далее копирую 0xffffffffffffff по адресу 0xffff88000c4560c0
Обращаюсь к адресу 00007ffa855050c0 из приложения прикладного уровня и, ничего не происходит. Прикладная программа продолжает работу, в ядре никаких Oops , хотя если не делать установку перехватчика, то при обращении к адресу 00007ffa855050c0 из пользовательского пространства, в лог системы попадает данное сообщение

segfault at ffffffffffffffff ip 00007ffa842c0fb6 sp 00007fffe616f028 error 5 in libc-2.19.so

Я никак не могу получить управление на свой my_fixup , чтоб при обращении по адресу 00007ffa855050c0 из приложения прикладного уровня, управление передалось на функцию моего модуля my_fixup
Как реализовать подобное правильно?

 

Aresss
()

Выделение логических адресов процессу

Запущен процесс a.out В котором происходит бесконечный цикл с вызовом sleep(99); . Наблюдаю пространство выделенной ему памяти через pmap -x . Выделен диапазон логических адресов для всех сегментов программы (bss data code stack).
И собственно цель такая, в модуле ядра увеличить диапазон логических адресов для процесса a.out. Как выделить 2 - 3 страницы памяти в любом сегменте программы и получить присвоенный логический адрес начала нового выделенного диапазона адресов?
Пробовал вызывать do_mmap_pgoff да всё время получаю ошибку функции. (Может с аргументами у меня проблема.)

 

Aresss
()

Соответствия адресов, в ядре и в процессе

Есть указатель void *kern_addr = ffff88007783c000; в пространстве ядра. Указывающий на память процесса прикладного уровня. Гдето в этой памяти лежат данные, записанные в «кучу» прикладного процесса.(пусть будет просто текст «hello world»). Через простой поиск данных, нахожу эту самую строку, и с помощью memcpy заменяю её на «aaaaaaaaa» , далее указываю что страница была изменена - SetPageDirty(page).
Смотрю на «изменённые» данные в процессе прикладной программы. Они не изменялись. Как было «hello world» так и осталось.
Почему не изменились данные в программе прикладного уровня?

 

Aresss
()

Модификация памяти процесса в ядре

Есть рабочий процесс test_proc.Мне нужно прочесть данные этого процесса содержащиеся в памяти(в куче) , да и производить различные операции с этими данными(читать/писать).
Как это сделать?
Получили указатель на
struct mm_struct
start_brk - начало сегмента кучи
end_brk - конец кучи
Как правильно работать с этими данными?
Как посмотреть данные, содержащиеся в памяти процесса?

 

Aresss
()

RSS подписка на новые темы