Ядро Linux в комментариях



Sys_time


sys_time представляет собой простой системный вызов, иллюстрирующий несколько важных концепций. Он реализует системный вызов time, который возвращает количество секунд, прошедших от полночи по универсальному времени 1 января 1970 г. Это число хранится в поле глобальной переменной xtime (см. строку ; она объявлена как volatile, поскольку модифицируется из прерывания, как будет показано в ) и доступ к нему организуется через макрос CURRENT_TIME (см. строку ).

Функция слепо следует своему простому объявлению. Вначале текущее время сохраняется в локальной переменной i.

Если получаемый указатель tloc не равен NULL, значение возврата будет также копироваться в место, определяемое этим указателем. Здесь присутствует одна тонкость — взамен обращения к макросу CURRENT_TIME переменная i просто копируется в пользовательское пространство. На то имеются две причины:

  • Определение макроса CURRENT_TIME в будущем может измениться, и эти новые версии могут оказаться более медленными, тогда как доступ к i был, есть и будет самым быстрым из возможных.
  • Подобный подход гарантирует получение непротиворечивых результатов: если так случится, что между строками и время изменится, sys_time скопирует одно значение, а вернет другое.
  • Небольшое удивление вызывает то, что эта часть кода не написана с использованием && вместо двух операторов if. Стандартная причина появления в ядре необычно выглядящего кода связана с повышением быстродействия, однако поскольку gcc генерирует одинаковый код для случаев && и двух if, в данной ситуации она не применима, если только упомянутый вид кода не связан со спецификой ранних версий gcc, в которых этот код разрабатывался.

    Если sys_time не может получить доступ в передаваемое местоположение (чаще всего это связано с некорректным значением tloc), в i заносится -EFAULT и в строке производится возврат кода ошибки.

    Возврат значения переменной i, которая содержит либо текущее время, либо -EFAULT.




    Содержание  Назад  Вперед