Хорошо, я понимаю, что все мы, программисты на C / C ++, когда-то встречали нашего безвременного врага, дьявольского сигнала SIGSEGV, Ошибка сегментации. Теперь я понял (с акцентом на прошедшее время), что это какая-то форма отказоустойчивой / проверяющей системы в некоторой части машинного кода, выдаваемой волшебным компилятором GCC (или g ++), или чем-то еще.
Но! Сегодня я крутился с каким-то ассемблером x86 со старым добрым NASM в виртуализированной системе Arch Linux, и, к моему большому удивлению и огорчению, в очередной раз был сорван в моих усилиях по программированию гнусным SegFault.
Вот код, который породил страшный сигнал:
mov eax, 0x7
mov [0xB8000], eax
Теперь я понимаю, что ядро Linux загружает вашу собранную программу в оболочку и выполняет ее оттуда, но я думал, что эта инструкция MOV взаимодействует 1: 1 с процессором, как на Земле ядро может обнаружить, что я пытаюсь чтобы получить доступ к части памяти, в которой он не хочет, и остановить инструкцию?
Я не претендую на то, что понимаю, что именно происходит, когда ваша программа загружается в оболочку, какие у вас есть права в ней, или даже что такое оболочка или как она работает, но я был уверен, что ASM дал вам полный контроль над процессором. Как это волшебное Ядро мешает моим прямым командам процессору, и почему я все еще вынужден проходить через эту цепочку команд операционной системы при написании, по сути, чистого машинного кода? : О