Я пытаюсь понять, как работает linux syscall sched_setaffinity(). Это продолжение моего вопроса здесь.
У меня это руководство, в котором объясняется, как использовать syscall и имеет довольно аккуратный (рабочий!) пример.
Итак, я загрузил Linux 2.6.27.19 источники ядра.
Я сделал "grep" для строк, содержащих этот syscall, и получил 91 результат. Не обещаю.
В конечном счете, я пытаюсь понять, как ядро может установить указатель инструкции для определенного ядра (или процессора.)
Я знаю, как работают одноядерные однопоточные программы. Можно было бы выпустить инструкцию jmp foo, и это в основном устанавливает IP-адрес в адрес памяти метки "foo". Но когда у вас есть несколько ядер, нужно сказать: "Принесите следующую команду в адрес памяти foo и установите указатель инструкции для ядра номер 2, чтобы начать там выполнение".
Где в коде сборки мы указываем, какое ядро выполняет эту операцию?
Вернуться к коду ядра: что здесь важно? Файл 'kernel/sched.c' имеет функцию sched_setaffinity(), но возвращает тип long, который не соответствует его странице руководства. Итак, что здесь важно? На каком из этих модулей отображаются инструкции по сборке? Какой модуль читает "task_struct", глядя на член "cpus_allowed", а затем переводим его в инструкцию? (Я также просмотрел источник glibc, но я думаю, что он просто делает вызов кода ядра для выполнения этой задачи.)