Выключение ПК.

Devices programming
  • Serge wrote:art_zh
    А если надо кеши сбросить и винты запарковать ? У меня материнка отключается когда винт уже явно останавливается.
    Ну зачем же ты так необъективно?
    Ведь если мы говорим об ОС, а это вроде так на этом форуме, то завершение дисковых операций предварительно и до выключения, равно, как и завершение процессов (имеется ввиду корректно + важных + системных) на совести разрабов этой ОСи!
    Никакой ACPI или еще что то на блюдечке и готовое не решает эту и другие подобные идеологические, концептуальные вещи, я бы сказал культурности и корректности работы ОСи.
    Второе. Парковать диски, как дословное понимание сути механических процессов в винте, решены производителями давно, уже лет 10 наверное как. Это понятие для обывателя можно отнести в категорию архаизмов.
  • CleverMouse wrote:Последние две фразы art_zh инициировали бурную флудильню
    CleverMouse wrote:Ключевое слово - "некоторых". Я так понимаю, что подмена с выключения на рестарт была вызвана именно желанием представить свою позицию в более выгодном свете, чтобы избавиться от упоминания, что это работает только на одиночных чипсетах.
    Оскорбительные выражения убраны! Mario
    Я могу понять любую ситуацию в принципе, но надо же работать над своими недостатками, а не выпячивать них наружу, имено это среднестатистическая норма в основной массе людей.
    Ну хорошо, допустим родила (выделила) ты эту тему именно так, озаглавила, причем это, как думаешь именно ты, ну так веди ее, тогда пожалуйста, раз она всплывает не раз и два. Освети перечень вопросов тобою видимых, иерархию, приоритет решений, или возможные направления решения... Неконструктивно ведь получается, нехорошо.
    То, что выкинула в сторону и все? Типа вот они тут такие, на них тут и смотрите, какие они несостоятельные. Так что ли?
  • VaStaNi
    Просьба не употреблять нецензурных выражений в оскорбительном контексте. Это не приказ - это просьба!
  • VaStaNi
    Не надо так.
    Давайте относиться друг к другу спокойно и уважительно, иначе к чему мы тут придем?

    Со своей строны CleverMouse совершенно права: если цель - универсальность, то средство одно: ACPI.

    И в проницательности ей не откажешь: я действительно слукавил, приведя пример с перезагрузкой в теме про выключение.
    Код выключения недокументирован, его пришлось выцарапывать из реального железа, поэтому без гарантий.
  • Конкретно по сабжу, применительно к охрененному количеству машин с INTELовским чипсетом!
    Благо разумники из INTEL в принципе уважают слово стандарт,
    то применительно к их чипсетам (если уж кому то очень надо без всяких уродств аля RM DOS APM... INT 0x15... ) прекрасно работает следующий код:

    Code: Select all

            xor     cx, cx
            dec     cx         ; = 0xFFFF
            mov     dx, 0x404
            in      ax, dx
            cmp     ax, cx     ;примитивно понюхаем есть ли сей порт вообще в наличии?
             jne    @a         ;если AX <> 0xFFFF - значит существует, будем выключать
            mov     dx, 0x4004
            in      ax, dx
            cmp     ax, cx     ;тогда, может этот есть (т.е. 0x4004)?
             je     @q
    @a:
            mov     ah, 111100b
            out     dx, ax     ; собственно тут рубильник выключается фактически, не успеете моргнуть! Завершаемся заранее!
    @q:
    как в PCI, например узнать, что именно INTEL что такое ID=8086 писать не буду, сами знаете...
    Это самый "дубовый" вариант, его можно сделать умнее сток на... ну 20 пусть. Но это не килобайты и по статистике моего тестинга (а машин на лет 8 последних я попробовал немало) пока этих двух портов хватало ДЛЯ ВСЕХ INTELовских чипсетов, что попадались.
    Желательно сообщить Ваши результаты и при отрицательном выложить данные вашего южника.
    Успехов!
  • VaStaNi
    Мобильным винтам парковка очень даже нужна. Они конечно сами паркуются, но немного времени для этого им необходимо. Другие устройства тоже неплохо отключить штатно. Хорошо когда есть драйверы, которые умеют переводить все устройства из D0 в D3. А если их нет помогает ACPI. Потому что самый неправильный способ выключить компьютер это выдернуть штепсель.
  • С точки зрения механики - выдирание штепселя ничего не испортит - да, электроника не любит включения и выключения, но головки давно уже сами паркуются. Они во время работы удерживаются сервоприводами, а как только питание пропадает, то за счет механики головка паркуется в свой паз. Вот только имеется существенный минус в виде недописанных (и соответственно пропавших) данных.
  • Кроме недописанных данных это приводило (и не раз) у меня к слетанию ext4 на жестком. Еще я боюсь, что есть связь между этим казусом ипоявлением bad-блоков на устройстве.
  • Так Ext4 содержит кучу служебных данных в оперативке и синхронизация у нее не так часто происходит, так что ничего удивительного.
    А бэд-блоки появляются чаще из-за того что во время работы жесткий диск подвергался либо вибрации, либо его вообще перемещали, если это переносной, ну, и в вертикальном положении он не жилец еще.
  • Serge
    при необходимости D-состояния всех контроллеров моста переключаются в тех же PM-регистрах. Это конечно сложнее, чем просто "вырубить рубильник"; надо делать минимальный драйвер PM и унифицировать его для всех целевых мостов. Но факт: альтернативный "не-ACPI" вектор развития все равно имеется.

    Хотя лучше конечно заранее слить кэш на диск из его родного драйвера и не заморачиваться с PM. Это - более прямая "вторая" альтернатива.
  • art_zh
    Разумеется есть альтернатива, но для этого надо иметь родные драйверы. А таких у нас несколько штук в разной стадии недоделанности. И три драйверописателя на всё.
  • art_zh wrote:1) Еще раз: "универсальный" код вообще на этих чипсетах не работает. Поправьте меня у кого RS880/SB800 или Гудзон. А приведенный прямой код - хотя бы на трех досках проверен.

    2) В истинности какого из моих утверждений Вы сомневаетесь?
    В истинности утверждения 1). На проблемы с выключением жаловался только yogev_ezra, но там проблемы с выключением даже из-под Linux и понятна причина - ACPI нет, а APM не работает из-за того, что в Колибри кривой возврат в реальный режим. Если бы сообщение о нерабочести прозвучало заблаговременно в какой-нибудь теме, кто-нибудь из специалистов - возможно, я - скорее всего, заинтересовался бы - например, попросил/а бы для начала подробнее описать симптомы и приложить дамп таблиц ACPI. А так, когда единственный репортер явно необъективен и никто больше не жалуется, я оставляю за собой право просто не верить в репорт.

    Универсальность простого кода выключения через порты для конкретного чипсета - это заблуждение. Есть, к примеру, такой чипсет i440FX, он примечателен тем, что его очень любят эмулировать эмуляторы - например, Bochs, qemu, VirtualBox дружно работают именно с ним. Но код выключения использует разные константы. В Bochs/qemu итоговый код выключения, в предположении, что BIOS не изменила базовый адрес, такой:

    Code: Select all

    mov dx,0B004h
    mov ax,2000h
    out dx,ax
    
    В VirtualBox, в том же предположении, - такой:

    Code: Select all

    mov dx,4004h
    mov ax,3400h
    out dx,ax
    
    Каким образом различать эти случаи без таблиц ACPI? Порт достать ещё можно, он хранится в PCI-устройстве 8086:7113 в конфигурационном пространстве по смещению 40h - между прочим, это многих интеловских чипсетов касается, так что BIOS спокойно может назначить что-нибудь своё - а вот значение есть только внутри DSDT. Проверка PCI-идентификаторов, скажем, северного моста не подойдёт, они одинаковы.

    Между прочим, и код из viewtopic.php?p=38002#p38002, и код из viewtopic.php?p=38269#p38269 - это и есть код ACPI, прямо по спецификации: взять регистр PM1a_CNT_BLK - практически всегда регистры ACPI объединяются в один блок, поскольку этот регистр в FADT перечислен третьим, то и в блоке он идёт третьим, то есть по смещению +4 - и записать туда значение, в котором установлен 13-й бит - он называется SLP_EN - а биты 10-12, называемые SLP_TYPx, кодируют тип сна. Конкретное кодирование может быть совершенно любым - к примеру, в Bochs/qemu 0 означает выключение, а VirtualBox считает, что раз выключение в ACPI называется S5, то и кодировать его можно числом 5.

    В частности, поэтому очень странно, что "не работает" универсальный код - если там нет чисто кодерской ошибки, то он на данной машине просто-напросто сводится ровно к неуниверсальному.
    Сделаем мир лучше!
  • diamond
    Если бы твоя ACPI-выключалка работала на Гудзонах, я бы вообще туда не лез. Однако пришлось,- именно потому что
    CleverMouse wrote:- это и есть код ACPI, прямо по спецификации: взять регистр PM1a_CNT_BLK - практически всегда регистры ACPI объединяются в один блок, поскольку этот регистр в FADT перечислен третьим, то и в блоке он идёт третьим, то есть по смещению +4
    Начиная с SB800 это "практически" не работает. АМД решила изобрести новый велосипед и теперь маппит все ресурсы южного моста на MMIO с дефолтным базовым адресом FED80000h, причем PMIO-регистры в этом блоке маппятся со смещением +300h. IO-доступ к этим ресурсам оставлен, но недодокументирован: оговаривается только мл.байт адреса (04), который должен лежать в PM_Reg по смещению 62h.
    Старший байт (08) лежит сразу за ним, но это нигде не указано. Именно поэтому я и не даю никаких гарантий, выключая через порт номер 0х0804. Универсальная АМД-выключалка будет работать через MMIO.
  • art_zh
    А что там в таблицах ACPI написано ?
  • Who is online

    Users browsing this forum: No registered users and 2 guests