Как ядро ​​Linux узнает, какой процесс сделал системный вызов? [closed]

Я только что закончил настраивать масштаб ~ 150% в Cinnamon, надеюсь, это поможет и вам, потому что GNOME похож на Cinnamon.

Я начал с команд xrandr из этой статьи HiDPI ArchWiki :

xrandr --output HDMI1 --scale 1.2x1.2 # try 1.3 also
xrandr --output HDMI1 --panning 2304x1296 # this is for 1920x1080 at 1.2

Затем я хотел сделать его постоянным, попробовал xorg.conf , но он работает не хочу ловить Отслеживать разделы конфигурации, что бы я ни пробовал. Я спросил на форумах ArchLinux и получил совет принять его и выбросить xorg.conf .В любом случае, я думаю, что моя конфигурация верна, и вы можете попробовать использовать ее, изменив Идентификатор монитора . Самая интересная часть - это матрица преобразования. Xorg не имеет возможности масштабирования, но я выяснил, что xrandr --scale - это сокращение для - xrandr --transform , которое соответствует TransformationMatrix .

Вот мой xorg.conf :

Section "Monitor"
    Identifier "TEST" # try changing this!
    Option "Panning" "2304x1296"
    Option "TransformationMatrix" "1.2 0 0 0 1.2 0 0 0 1"
EndSection

Section "Device"
    Identifier  "Intel Graphics" # change these lines according to your graphics card
    Driver  "intel"
    Option  "AccelMethod"   "sna"
    Option  "TearFree"  "true"
    Option  "Monitor-HDMI1" "TEST" # try changing this!
EndSection

У меня это не работает, поэтому я продолжил копать. В моей системе есть lightdm , который запускается первым, и ему нужны команды xrandr для поиска HiDPIish. Затем он запускает сеанс cinnamon-session , который отменяет настройки отображения, и мне нужно снова запустить xrandr . Lightdm настраивается с помощью etc / lightdm / lightdm.conf и по умолчанию запускает что-то, указанное в опции session-wrapper . Вам нужно создать сценарий с желаемыми настройками xrandr и поместить его где-нибудь, чтобы он запускался оболочкой сеанса . Кстати, опции сценарий-настройки-сеанса и сценарий-настройки-дисплея у меня не работали.

Затем в Cinnamon (или GNOME в вашем случае) лучшее, что я мог сделать, - это использовать функцию автозапуска и добавить скрипт xrandr с нулевым таймаутом.

3
11.05.2017, 23:31
2 ответа

Системный вызов ядра выполняется в контексте вызывающего процесса, только с другим уровнем привилегий и с другой инфраструктурой поддержки. Ядро Linux имеет переменную для каждого процессора, которая отслеживает текущий процесс, current_task ; он использует это всякий раз, когда ему нужно знать, что такое текущий процесс. На данном ЦП текущая задача меняется только тогда, когда решает планировщик, а переключение контекста заботится о сохранении всей необходимой информации, чтобы ядро ​​могло отслеживать, что и где происходит.

В LWN есть несколько полезных статей о системных вызовах: Анатомия системного вызова, часть 1 и , часть 2 . Они объясняют, как определяются системные вызовы и как они выполняются, хотя, возможно, недостаточно подробно, чтобы на самом деле ответить на ваш вопрос, поскольку они не охватывают подробно переход из пространства пользователя в пространство ядра; но это «просто» любая поддержка переходов на основе ловушек, доступная на ЦП.

7
27.01.2020, 21:11

Ваш вопрос предполагает, что приложение знает и управляет своим собственным PID и должно передать его ядру, чтобы последнее знало, как выполнять свою работу. Это распространенное заблуждение. То, как эта информация течет, на самом деле наоборот. Процессу не нужно знать или хранить свой идентификатор процесса, таблицы файловых дескрипторов и тому подобное. Если он хочет получить информацию о них, он должен получить ее из ядра с помощью системных вызовов, таких как getpid, ioctl и им подобных.

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

Вы должны увидеть большую часть кода ядра в виде большой библиотеки, связанной с каждым запущенным процессом в системе. Когда процесс (фактически поток) выполняет системный вызов, он просто погружается в эту специальную библиотеку и получает сверхспособности на небольшой период времени. Но это все тот же поток, поэтому у ядра есть вся информация, необходимая для идентификации и управления запущенным потоком, такая как его владелец, группа, pid, таблицы файловых дескрипторов и т. д., потому что это именно ядро ​​(здесь планировщик) который назначает потоки доступным (v) ЦП.

2
27.01.2020, 21:11

Теги

Похожие вопросы