Home > itblogs > Первая инструкция.

Первая инструкция.

April 7th, 2010

Маленькое открытие. После RESET# x86 процессоры начинают выполнение команд в реальном режиме (AKA real mode). CS и IP при этом устанавливаются в 0xf000 и 0xfff0 соответственно. Значит первая инструкция должна находится в пределах первого мегабайта, по адресу 0x000ffff0. Правильно? Не правильно. На самом деле, первая инструкция живет по адресу 0xfffffff0, так как база селектора CS после сброса устанавливается в 0xffff0000.

Intel® 64 and IA-32 Architectures Software Developer’s Manual
Volume 3A: System Programming Guide, Part 1
8.1.4 First Instruction Executed
:

The first instruction that is fetched and executed following a hardware reset is located at physical address FFFFFFF0H. This address is 16 bytes below the processor’s uppermost physical address. The EPROM containing the software-initialization code must be located at this address.

The address FFFFFFF0H is beyond the 1-MByte addressable range of the processor while in real-address mode. The processor is initialized to this starting address as follows. The CS register has two parts: the visible segment selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit segment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (that is, FFFF0000 + FFF0H = FFFFFFF0H).

  1. April 16th, 2010 at 12:55 | #1

    Это самая самая самая ужасная часть всего кернел-кодинга, я так и не смог освоить как вообще с этим работать и забросил =\

    Ну и без интел мана врядли кто-то полезит кодить загрузчик :)

  2. April 17th, 2010 at 00:10 | #2

    @scrat
    А при чём тут загрузчик и вообще кернел? Этот инит гораздо раньше загрузчика ОС происходит. Такое актуально знать только биосописателям.

    Кстати, на недо64 x86 уже такой прогрессивной вещи не сделали. Так что старт по прежнему в конце четвёртого гига, хотя особой логики в этом нет. Ну кроме разве что той, что доступ за четвёртый гиг в реальном режиме вообще архитектурой не предусмотрен :)

  3. April 17th, 2010 at 09:12 | #3

    Slavik Gnatenko :
    @scrat
    Такое актуально знать только биосописателям.

    Хех. Все мы биосописатели, если на железке биоса нет. :-)

  4. April 19th, 2010 at 04:58 | #4

    Ну вот будет мелкоконтроллер на x86 – станет актуально. :)
    Хотя какое же это извращение – МК на x86 :D

  5. deathsoft
    April 30th, 2010 at 06:21 | #5

    Ну, то тчо тут описано, это же вроде как очевидные вещи, 286й процессор начинал исполнять код из последних 64к от 16Мб, а 386 и выше из последних 64к от 4Гб (это же классика).

  6. Jonh Smith VII
    June 3rd, 2010 at 08:00 | #6

    На не-х86 микроконтроллерах старт происходит сильно менее похабно. Кстати в реальном писюке старт еще сложнее. Хотя-бы потому что RAM и ROM прицеплены нынче к чипсету и до того как все это заработает, чипсет по идее надо бы проинициализировать. Что как-бы некоторая проблема пока проц не стартанул еще.

Comments are closed.