mirror of
https://github.com/0xAX/linux-insides.git
synced 2025-03-12 12:36:16 +00:00
Добавлено местоположение исходного кода Coreboot
This commit is contained in:
parent
3e1456fc91
commit
1f2c47982d
@ -73,7 +73,7 @@ CS base 0xffff0000
|
||||
'0xfffffff0'
|
||||
```
|
||||
|
||||
Мы получили `0xfffffff0`, т.е. 16 байт ниже 4 Гб. По этому адресу располагается так называемый [вектор прерываний](http://en.wikipedia.org/wiki/Reset_vector). Это область памяти, в которой CPU ожидает найти первую инструкцию для выполнения после сброса. Она содержит инструкцию [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`), которая обычно указывает на точку входа в BIOS. Например, если мы взглянем на исходный код [coreboot](http://www.coreboot.org/), то увидим следующее:
|
||||
Мы получили `0xfffffff0`, т.е. 16 байт ниже 4 Гб. По этому адресу располагается так называемый [вектор прерываний](http://en.wikipedia.org/wiki/Reset_vector). Это область памяти, в которой CPU ожидает найти первую инструкцию для выполнения после сброса. Она содержит инструкцию [jump](http://en.wikipedia.org/wiki/JMP_%28x86_instruction%29) (`jmp`), которая обычно указывает на точку входа в BIOS. Например, если мы взглянем на исходный код [coreboot](http://www.coreboot.org/) (`src/cpu/x86/16bit/reset16.inc`), то увидим следующее:
|
||||
|
||||
```assembly
|
||||
.section ".reset"
|
||||
@ -87,7 +87,7 @@ reset_vector:
|
||||
|
||||
Здесь мы можем видеть [опкод инструкции jmp](http://ref.x86asm.net/coder32.html#xE9) - `0xe9`, и его адрес назначения `_start - ( . + 2)`.
|
||||
|
||||
Мы также можем видеть, что секция `reset` занимает `16` байт и начинается с `0xfffffff0`:
|
||||
Мы также можем видеть, что секция `reset` занимает `16` байт и начинается с `0xfffffff0` (`src/cpu/x86/16bit/reset16.lds`):
|
||||
|
||||
```
|
||||
SECTIONS {
|
||||
@ -424,7 +424,7 @@ _start:
|
||||
Данное поле является битовой маской.
|
||||
|
||||
Бит 7 (запись): CAN_USE_HEAP
|
||||
Бит, установленный в 1, указывает на корректность heap_end_ptr.
|
||||
Бит, установленный в 1, указывает на корректность heap_end_ptr.
|
||||
Если поле очищено, то некоторый функционал кода настройки будет отключен.
|
||||
```
|
||||
Если бит `CAN_USE_HEAP` установлен, мы помещаем `heap_end_ptr` в `dx` (который указывает на `_end`) и добавляем к нему `STACK_SIZE` (минимальный размер стека, `512` байт). После этого, если `dx` без переноса (будет без переноса, поскольку `dx = _end + 512`), переходим на метку `2` (как в предыдущем случае) и создаём корректный стек.
|
||||
|
Loading…
Reference in New Issue
Block a user