LINUX.ORG.RU

Перехват переключения контекста

 , ,


0

1

Необходимо написать модуль ядра, который будет перехватывать переключения контекста и писать в файл pid процесса, на который переключаемся. Никогда раньше не сталкивался с программированием модулей - не знаю как устроить перехват.

Текст задания: Написать модуль ядра, отслеживающий переключение контекста для списка выбранных процессов и, при переключении контекста, записывающий информацию об этом в лог-файл.



Последнее исправление: fortran_al (всего исправлений: 1)
Ответ на: комментарий от r2d2

Можно ткнуть носом в то место, которое мне нужно? Перехватить системный вызов я бы смог - но в том куске ядра я их не нашел.

fortran_al
() автор топика

это невозможно..

погромисты такие погромисты, в ядре нельзя просто взять и захерачить что в голову взбрело. это не «еще одна программа»

ckotinko ☆☆☆
()
Ответ на: комментарий от post-factum

По легенде - ответ программисту на ответ - почему в этот раз его программа выполняется дольше, чем в другой. А по факту - навязанная тема курсовой работы.

fortran_al
() автор топика
Ответ на: комментарий от fortran_al

Та ссылка — мой хук на фразу «Никогда раньше не сталкивался с программированием модулей».

r2d2
()
Ответ на: комментарий от fortran_al

почему в этот раз его программа выполняется дольше, чем в другой

SystemTap, kprobes, ...

А по факту - навязанная тема курсовой работы

Пиз.. отечественному образованию и машиностроению.

r2d2
()
Ответ на: комментарий от fortran_al

ftrace, как я понял, отслеживает только системные вызовы.

Ты понял неправильно (или путаешь линуксовый ftrace с ptrace, systrace или еще каким-то *trace). ftrace отслеживает почти всё, что угодно. Планировщик оно отслеживает точно.

tailgunner ★★★★★
()
Ответ на: комментарий от AptGet

По задумке не один, но некий фиксированный список процессов. SystemTap заюзать нельзя, нужно написать свой модуль. Но именно он ближе всего, что я видел, к тому, что мне надо. По ссылке - process/schedtimes.stp - Track Time Processes Spend in Various States Using Tracepoints. Но я сильно боюсь завязнуть в разбирании кода такого большого проекта.

fortran_al
() автор топика

А если сделать это в виде планировщика?
Ну и в файл реально писать как можно реже, это понятно.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Можно чуть-чуть разжевать на тему планировщика? По задумке это будет писаться куда-нибудь в /proc/ (оно же, вроде как, все в оперативной памяти)

fortran_al
() автор топика
Ответ на: комментарий от fortran_al

Дык если в /proc, то оно вообще не так реализуется, как с обычными файлами… В плане того, например, что информация будет реально записываться в файл только перед открытием.

Я всех премудростей не знаю, поправьте, если не так.

post-factum ★★★★★
()
Ответ на: комментарий от post-factum

Проблема - не в том как и куда писать. Проблема в том, как технически перехватить переключение контекста (к примеру, функции switch_to() из kernel/sched.c).

fortran_al
() автор топика
Ответ на: комментарий от fortran_al

// черт! а я тока что перечитал исходный пост, увидел «текст задания», подумал, что я его сраза не заметил и удалил свое сообщение %)

metawishmaster ★★★★★
()

Написать модуль ядра, отслеживающий переключение контекста для списка выбранных процессов и, при переключении контекста, записывающий информацию об этом в лог-файл.

т.е., наверняка планиркется заносить номера процессов в какой-то /proc-файл, и мониторить перекчючения контекста только тех процессов?

metawishmaster ★★★★★
()
Ответ на: комментарий от r2d2

Херню посоветовал, в самом-то деле. Не разбираешься - не лезь.

ttnl ★★★★★
()
Ответ на: комментарий от post-factum

Если /proc то оно ведь никуда не пишется (в смысле на носитель). Просто э
экспортируются пару вызовов вроде open/read/write/close и пользователь работает как с обычным файлом. А он себе в буфере пиды будет держать и по read'у отдавать пользователю.

urxvt ★★★★★
()
Ответ на: комментарий от fortran_al

Можно чуть-чуть разжевать на тему планировщика?

Просто пишешь свой планировщик (ну скорей форкаешь существующий) и уж в нем то точно можно уловить момент когда новый процесс выбирается на выполнение.

urxvt ★★★★★
()

Тупо вставь printk в функцию schedule. Лог файл - файл сислога...

ttnl ★★★★★
()
Ответ на: комментарий от urxvt

Рекомендую купить/скачать книгу Роберта Лава. Там такие дела достаточно детально рассмотрены.

urxvt ★★★★★
()

Да - и преподаватель - дебил

ttnl ★★★★★
()
Ответ на: комментарий от urxvt

Мне казалось, или планировщик вшит в ядро? Как мне его без перекомпилирования ядра изменить, в виде модуля?

fortran_al
() автор топика
Ответ на: комментарий от fortran_al

Проблема - не в том как и куда писать. Проблема в том, как технически перехватить переключение контекста (к примеру, функции switch_to() из kernel/sched.c).

раз ты уже нашел, где происходит переключение, просто добавь туда вызов своей функции, которая быстро будет сохранять pid процесса в какой-нибудь буфер и возвращаться, а потом какой-нибудь другой кусок кода в модуле будет читать этот буфер

Harald ★★★★★
()
Ответ на: комментарий от fortran_al

Мне казалось, или планировщик вшит в ядро? Как мне его без перекомпилирования ядра изменить, в виде модуля?

не получится, перекомпилировать придется. А в чем, собственно, проблема перекомпилировать?

Harald ★★★★★
()
Ответ на: комментарий от Harald

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

fortran_al
() автор топика
Ответ на: комментарий от fortran_al

ну тогда только так, после загрузки модуля найти в ядре место вызова функции переключения и перезаписать машинный код, аки хитрая вирусня :) при этом как-то нужно все заблокировать на момент перезаписи. Работать будет только с каким-то конкретным скомпилированным ядром

Harald ★★★★★
()
Ответ на: комментарий от fortran_al

Проблема в ТЗ.

Проблема в аналитиках тогда уже

ttnl ★★★★★
()
Ответ на: комментарий от fortran_al

А насколько реально подменить вызов функции ядра вызовом функции модуля в рантайме?

вполне реально. Только, вроде как заранее неизвестно, по какому адресу будет модуль загружен, придется самому определять. Или выделить кусок памяти, скопировать туда свою функцию, и потом затереть адресом этого куска адрес функции switch_to вызов

call _switch_to() => call 0xABCDE

как-то так

Harald ★★★★★
()
Ответ на: комментарий от Harald

Спасибо, большое! Вполне реальный вариант, но он выглядит все-таки «грязным». Хотя, конечно, он будет работать и, если ничего лучше не придумаю - придется делать его. В связи с этим, хотелось бы услышать другие варианты. К примеру, что-то похожее есть в SystemTap, но у меня нет идей, где и как это искать.

fortran_al
() автор топика
Ответ на: комментарий от metawishmaster

может препод не так выразил мысль, а хотел мониторить task->state?

Похоже, преподаватель хотел, чтобы они написали что=-то сами. То, что задача решена давно и несколькмим способами, его не волновало.

tailgunner ★★★★★
()
Ответ на: комментарий от fortran_al

А насколько реально подменить вызов функции ядра вызовом функции модуля в рантайме?

Это kprobes.

tailgunner ★★★★★
()
Ответ на: комментарий от fortran_al

скорее всего предложу неправильный способ, но я бы попробовал

cur_state = task->state;
wait_event_interruptible(wq, task->state != state)
если под «это» имелось ввиду task->state

это было только для одного пида, а для кучки можно заюзать аналогичные штуки, но в отдельных потоках.

metawishmaster ★★★★★
()
Ответ на: комментарий от fortran_al

Если я не ошибаюсь то планировщик может быть оформлен в виде модуля. Хотя я не уверен.

urxvt ★★★★★
()
Ответ на: комментарий от fortran_al

Посмотри на kprobes, он умеет подменять функции

AptGet ★★★
()

А если планировщик не можно сделать модулем то что если тогда «повесится» на прерывание таймера и по этому тику смотреть текущий процесс и соответственно решать было ли переключение?

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

а процессоров может быть несколько, соотв. и текущих процессов тоже :)

Harald ★★★★★
()
Ответ на: комментарий от urxvt

что если тогда «повесится» на прерывание таймера и по этому тику смотреть текущий процесс и соответственно решать было ли переключение?

:) то есть принудительно заставит систему почаще переключать контексты ?

MKuznetsov ★★★★★
()
Ответ на: комментарий от urxvt

хотя мысль про таймеры здравая - при переключении контекста от/к задаче ядро обновляет статистику задачи и её таймеры, причём это независит от выбранного планировщика; то есть где-то туда можно прицепиться и собрать pid`ы в кольцевой буфер.

MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.