Изучение ACPI на примере разработки драйвера кнопки Power для ОС FreeBSD

Wait 5 sec.

Так получилось, что я уговорил одного своего коллегу установить на его рабочий ноутбук «HP Laptop 15s» операционную систему FreeBSD 15.0. Он уже был немного знаком с ОС FreeBSD в серверном варианте, но с этой ОС на десктопе ранее никогда не сталкивался, поэтому мы решили устроить на работе небольшой «сэйшен по установке Фрюхи» и выполнить установку под моим пристальным контролем. В целом, не учитывая экспериментов с разбивкой диска, совмещением и сожительством с ОС Windows, установки менеджера загрузки rEFInd и борьбы с глюками USB накопителей, установка ОС FreeBSD на отдельный раздел диска прошла удачно. Беспроводная WiFi карта и встроенная AMD графика заработали «из коробки». В систему был установлен X11 сервер Xorg, а к нему графическая оболочка Xfce4 и много прочего разного ПО для удобства выполнения повседневных задач.Преисполненные чувством выполненного большого дела, мы решили разбегаться по домам, коллега нажал на ноутбуке кнопку выключения питания и обнаружил, что система никак не реагирует на это нажатие, хотя команда shutdown выполняется корректно - с выключением питания. Я тут же вспомнил, что в ОС FreeBSD поведение системы при нажатии на кнопку «Power» задается системной переменной hw.acpi.power_button_state, но установка её значения в S5 («shutdown and power off») ни к чему не привела. Тогда я включил режим «многословности» для операционной системы и стал наблюдать сообщения от ядра ОС на консоли, одновременно многократно нажимая кнопку «Power». На удивление, ни одного сообщения от ACPI я не обнаружил, и это был очень нехороший знак — кнопка либо физически сломана, либо что-то конкретно «сломано» в ACPI в ядре ОС FreeBSD. Мы загрузились в Windows, убедились в том, что там с кнопкой «Power» всё в порядке, а значит остается одно — дебажить ядро Фрюхи и выяснять причину. Ведь не могу же я оставить коллегу «один на один» с нерабочей системой на его ноутбуке.Далее я поведаю историю со счастливым концом о том, как в течении двух недель я, тайком от семьи, по ночам, разбирался с устройством «Advanced Configuration and Power Interface» (ACPI), дебажил ядро операционной системы FreeBSD и писал свой небольшой драйвер для кнопки «Power». Читать далее