Почему ядро не полностью загружается?
Пытаюсь загрузить ядро, но оно не полностью загружается(?) затрудняюсь ответить что именно с ним происходит, ошибки не выдает, но не так работает, на команды не отвечает просто выводит, при нажатии энтора что ввела. Такое поведение появилось после того как ядро увеличилось в размере.
dumpbin когда ядро работало:
SECTION HEADER #1
.text name
3FE1 virtual size
1000 virtual address (00011000 to 00014FE0)
4000 size of raw data
400 file pointer to raw data (00000400 to 000043FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
SECTION HEADER #2
.data name
1046 virtual size
5000 virtual address (00015000 to 00016045)
200 size of raw data
4400 file pointer to raw data (00004400 to 000045FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
Read Write
SECTION HEADER #3
.data/IG name
1E90 virtual size
7000 virtual address (00017000 to 00018E8F)
2000 size of raw data
4600 file pointer to raw data (00004600 to 000065FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
dumpbin, после того как добавила в ядро функцию, которая считает тики, после нее увеличилось само ядро и перестало корректно работать :
SECTION HEADER #1
.text name
4031 virtual size
1000 virtual address (00011000 to 00015030)
4200 size of raw data
400 file pointer to raw data (00000400 to 000045FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
60000020 flags
Code
Execute Read
SECTION HEADER #2
.data name
1046 virtual size
6000 virtual address (00016000 to 00017045)
200 size of raw data
4600 file pointer to raw data (00004600 to 000047FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
C0000040 flags
Initialized Data
Read Write
SECTION HEADER #3
.data/IG name
1E90 virtual size
8000 virtual address (00018000 to 00019E8F)
2000 size of raw data
4800 file pointer to raw data (00004800 to 000067FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
загрузка ядра
use16
org 0x7C00
start:
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, start
mov ax, cs
mov ds, ax
mov ss, ax
mov sp, start
mov ax, 0x1100
mov es, ax
mov bx, 0x0000
mov dl, 1
mov dh, 0
mov ch, 0
mov cl, 3
mov al, 33
mov ah, 0x02
int 0x13
mov ax, 0x1600
mov es, ax
mov bx, 0x0000
mov dl, 1
mov dh, 0
mov ch, 0
mov cl, 36
mov al, 1
mov ah, 0x02
int 0x13
mov ah, 0
mov al, 2
int 0x10
mov ax, 0x1800
mov es, ax
mov bx, 0x0000
mov dl, 1
mov dh, 0
mov ch, 0
mov cl, 37
mov al, 16
mov ah, 0x02
int 0x13
lgdt [gdt_info]
in al, 0x92
or al, 2
out 0x92, al
mov eax, cr0
or al, 1
mov cr0, eax
jmp 0x8:protected_mode
gdt:
db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
;base=0, size=4Gb, P=1, DPL=0, S=1(user),
;Type=1(code), Access=00A, G=1, B=32bit
db 0xff, 0xff, 0x00, 0x00, 0x00, 0x9A, 0xCF, 0x00
;base=0, size=4Gb, P=1, DPL=0, S=1(user),
;Type=0(data), Access=0W0, G=1, B=32bit
db 0xff, 0xff, 0x00, 0x00, 0x00, 0x92, 0xCF, 0x00
gdt_info:
dw gdt_info - gdt
dw gdt, 0
use32
protected_mode:
mov ax, 0x10
mov es, ax
mov ds, ax
mov ss, ax
call 0x11000
times (512 - ($ - start) - 2) db 0
db 0x55, 0xAA
функция которая считывает тики
__declspec(naked) void timer()
{
__asm pusha;
// Обработка поступивших данных
ticks++;
// Отправка контроллеру 8259 нотификации о том, что прерывание
/*обработано.Если не отправлять нотификацию, то контроллер не будет посылать
новых сигналов о прерываниях до тех пор, пока ему не сообщать что
прерывание обработано.*/
outb(PIC1_PORT, 0x20);
__asm {
popa
iretd
}
}
void init_ticks(){
intr_reg_handler(8, GDT_CS, 0x80 | IDT_TYPE_INTR, timer); // Регистрация обработчика прерывания (segm_sel=0x8, P=1, DPL=0, Type=Intr)
outb(PIC1_PORT + 1, 0xFF ^ 0x01);
}
Транслятор: FASM, ассемблер: Intel, компилятор: ms c
Источник: Stack Overflow на русском