Запретить добавление значения 0000-00-00 в столбцы типа DATE во всех операциях обновления / вставки в уже созданном приложении PHP

Я думал, что вы не можете выполнять операции с плавающей запятой в ядре Linux

blockquote>

Вы не можете безопасно: отказ в использовании kernel_fpu_begin() / kernel_fpu_end() не работает средние команды FPU будут ошибочными (не на x86 по крайней мере).

Вместо этого он будет автоматически искажать состояние FPU пользовательского пространства. Это плохо; не выполняйте этого.

Компилятор не знает, что означает kernel_fpu_begin(), поэтому он не может проверить / предупредить код, который компилируется в инструкции FPU за пределами областей начала FPU.

Может существовать режим отладки, когда ядро ​​отключает инструкции SSE, x87 и MMX вне областей kernel_fpu_begin / end, но это будет медленнее и не будет выполнено по умолчанию.

Возможно, однако: установка CR0::TS = 1 приводит к сбою инструкций x87, поэтому возможен ленивый переключение контекста FPU, а для SSE и AVX есть другие биты.


Есть Многие способы для кода ошибки ядра приводят к серьезным проблемам. Это всего лишь один из многих. В C вы почти всегда знаете, когда используете плавающую точку (если только опечатка не приводит к константе 1. или что-то в контексте, который действительно компилируется).


Почему FP архитектурное состояние, отличное от целого?

Linux должен сохранять / восстанавливать целочисленное состояние в любое время, когда он входит / выходит из ядра. Весь код должен использовать целые регистры (за исключением гигантского прямоугольного блока вычисления FPU, который заканчивается на jmp вместо ret (ret изменяет rsp).)

Но код ядра вообще избегает FPU, поэтому Linux оставляет состояние FPU несохраненным при записи из системного вызова, сохраняя только до фактического переключения контекста на другой процесс user-space или на kernel_fpu_begin. В противном случае, как правило, возвращаются к одному и тому же процессу пространства пользователя на одном ядре, поэтому состояние FPU не нужно восстанавливать, потому что ядро ​​его не трогало. (И вот где коррупция произойдёт, если задача ядра действительно изменит состояние FPU. Я думаю, это происходит в обоих направлениях: пользовательское пространство может также испортить ваше состояние FPU ).

Целочисленное состояние довольно мало, только 16x 64-разрядные регистры + RFLAGS и сегментные регистры. Состояние FPU более чем в два раза больше даже без AVX: 8x 80-бит x87 регистров и 16x XMM или YMM или 32x ZMM-регистров (+ MXCSR и x87 status + контрольные слова). Также регистры MPX bnd0-4 объединены с «FPU». На данный момент «состояние FPU» означает все нецелые регистры. На моем Skylake dmesg говорит x86/fpu: Enabled xstate features 0x1f, context size is 960 bytes, using 'compacted' format.

См. Понимание использования FPU в ядре linux ; современная Linux не делает ленивых контекстных переключателей FPU по умолчанию для контекстных переключателей (только для переходов ядра / пользователя). (Но в этой статье объясняется, что такое Lazy.)

Большинство процессов используют SSE для копирования / обнуления небольших блоков памяти в коде, сгенерированном компилятором, и большинство реализаций библиотеки / memcpy / memset используют SSE / SSE2. Кроме того, оптимизированное сохранение / восстановление с поддержкой аппаратного обеспечения теперь - вещь ( xsaveopt / xrstor), поэтому «надежное» сохранение / восстановление FPU может фактически сделать меньше работы, если некоторые / все регистры FP на самом деле не работают были использованы. например сохраняйте только низкие 128b регистров YMM, если они были обнулены с vzeroupper, поэтому CPU знает, что они чисты. (И отметьте этот факт только одним битом в формате сохранения.)

С «нетерпеливым» переключением контекста инструкции FPU остаются включенными все время, поэтому плохой код ядра может повредить их в любое время.

0
задан Kiran Muralee 17 January 2019 в 09:45
поделиться