mirror of
https://github.com/0xAX/linux-insides.git
synced 2025-07-05 16:52:33 +00:00
Исправление порядка вызова вызова set_bios_mode()
This commit is contained in:
parent
3b6e0b0386
commit
12800e2c8a
@ -357,6 +357,24 @@ if (cpu_level < req_level) {
|
|||||||
|
|
||||||
`check_cpu` проверяет флаги CPU, наличие [long mode](http://en.wikipedia.org/wiki/Long_mode) в случае x86_64 (64-битного) CPU, проверяет поставщика процессора и делает специальные подготовки для некоторых производителей, такие как отключение SSE+SSE2 для AMD в случае их отсутствия и т.д.
|
`check_cpu` проверяет флаги CPU, наличие [long mode](http://en.wikipedia.org/wiki/Long_mode) в случае x86_64 (64-битного) CPU, проверяет поставщика процессора и делает специальные подготовки для некоторых производителей, такие как отключение SSE+SSE2 для AMD в случае их отсутствия и т.д.
|
||||||
|
|
||||||
|
На следующем этапе вы видим вызов функции `set_bios_mode`. Эта функция реализована только для режима `x86_64`:
|
||||||
|
|
||||||
|
```C
|
||||||
|
static void set_bios_mode(void)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
struct biosregs ireg;
|
||||||
|
|
||||||
|
initregs(&ireg);
|
||||||
|
ireg.ax = 0xec00;
|
||||||
|
ireg.bx = 2;
|
||||||
|
intcall(0x15, &ireg, NULL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Функция `set_bios_mode` выполняет прерывание `0x15`, чтобы сообщить BIOS, что будет использоваться [long mode](https://en.wikipedia.org/wiki/Long_mode) (если `bx == 2`).
|
||||||
|
|
||||||
Обнаружение памяти
|
Обнаружение памяти
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -403,24 +421,6 @@ if (cpu_level < req_level) {
|
|||||||
[ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
|
[ 0.000000] BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
|
||||||
```
|
```
|
||||||
|
|
||||||
Затем вы видим вызов функции `set_bios_mode`. Эта функция реализована только для режима `x86_64`:
|
|
||||||
|
|
||||||
```C
|
|
||||||
static void set_bios_mode(void)
|
|
||||||
{
|
|
||||||
#ifdef CONFIG_X86_64
|
|
||||||
struct biosregs ireg;
|
|
||||||
|
|
||||||
initregs(&ireg);
|
|
||||||
ireg.ax = 0xec00;
|
|
||||||
ireg.bx = 2;
|
|
||||||
intcall(0x15, &ireg, NULL);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Функция `set_bios_mode` выполняет прерывание `0x15`, чтобы сообщить BIOS, что будет использоваться [long mode](https://en.wikipedia.org/wiki/Long_mode) (если `bx == 2`).
|
|
||||||
|
|
||||||
Инициализация клавиатуры
|
Инициализация клавиатуры
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user