Есть ли способ прочитать ядро, помещенное в head = 1 с int 13h? - PullRequest
3 голосов
/ 11 июня 2019

Мой загрузчик должен перейти в Kernell, когда я нажимаю Enter, но он не реагирует. Загрузчик находится в первом секторе первой дорожки, заголовок - 0, но адрес ядра: сектор 3, дорожка -0, заголовок 1.

Я даже поставил ядро ​​на 5-й сектор первой дорожки. У меня уже есть функции чтения с дискеты и записи, попытался прочитать из главы 1, где находится мое ядро, и он читает правильно. Но когда я вставляю в загрузчик соответствующий заголовок, сектор и дорожку, в чтении int 13h / ah=02h он ничего не делает.

BootLoader

readingProcess:
        xor AX, AX     
    mov DS, AX      
    mov BX, 0060h   
    cli           
    mov ss,bx      
    mov sp,ax    
    sti           
    cld

    mov AH, 02h   
    mov AL, 25          
    mov CH, 0           
    mov CL, 3           
    mov DL, 0           
    mov DH, 1               

    mov BX, 0060h
    mov ES, BX
    xor BX, BX

    int 13h

    ;go to kernel
    jmp 0060h:0000h
ret

Итак, пока я действительно не понимаю, как это работает, потому что, когда я пытаюсь записать на дискету, в заголовок 1, она должна быть почти в середине моего файла .img, но она появляется у меня в начале файла. Я думаю, что должна быть формула, которая помогла бы мне выбрать правильный путь и сектор.

1 Ответ

3 голосов
/ 13 июня 2019

После просмотра вашего кода выясняется, что проблема заключается в использовании правильной формулы для получения значений дорожки (цилиндра), головки и сектора для заданного смещения в файле образа диска. Вы хотите использовать правильные значения для Int 13h / ah = 2 (чтение с диска).

Из моего предыдущего ответа я дал формулу:

CHS tuples can be mapped to LBA address with the following formula:

LBA = (C × HPC + H) × SPT + (S - 1)

where C, H and S are the cylinder number, the head number, and the sector number

LBA is the logical block address
HPC is the maximum number of heads per cylinder (reported by 
    disk drive, typically 16 for 28-bit LBA)
SPT is the maximum number of sectors per track (reported by
    disk drive, typically 63 for 28-bit LBA)
LBA addresses can be mapped to CHS tuples with the following formula 
    ("mod" is the modulo operation, i.e. the remainder, and "÷" is 
    integer division, i.e. the quotient of the division where any 
    fractional part is discarded):

    C = LBA ÷ (HPC × SPT)
    H = (LBA ÷ SPT) mod HPC
    S = (LBA mod SPT) + 1

Дополнительную информацию об адресации дисков можно найти в этой википедии статья .

Для дискеты объемом 1,44 МБ всего 2880 секторов, HPC (головки на цилиндр) - 2, а SPT (секторов на дорожку - 18), а каждый сектор - 512 байт. Что вам нужно, так это LBA. LBA - это просто смещение, где вы записываете ядро ​​(в байтах), деленное на 512. В вашей программе Appender вы размещаете копию ядра со смещением 738304. LBA = 738304/512 = 1442.

Вам просто нужно преобразовать LBA 1442 в CHS и вставить эти цифры в код.

 Formula:
    C = LBA ÷ (HPC × SPT)
    H = (LBA ÷ SPT) mod HPC
    S = (LBA mod SPT) + 1

 We know:
    LBA = 1442
    HPC = 2
    SPT = 18        

Делая подстановку мы получаем:

C = 1442 ÷ (2 × 18)
H = (1442 ÷ 18) mod 2
S = (1442 mod 18) + 1

÷ означает целочисленное деление и выбрасывание остатка (дроби). mod означает деление и сохранение остатка, и выбросить всю часть.

C = 1442 ÷ (2 × 18) = 40.0555556 = 40
H = (1442 ÷ 18) mod 2 = 80 mod 2 = 0 (80 mod 2 = 40 remainder 0)
S = (1442 mod 18) + 1 = (2) + 1 = 3 (1442 mod 18 = 80 remainder 2)

Теперь для LBA 1442 мы знаем, что Cylinder (Track) = 40, Head = 0, Sector = 3. Ваш код будет использовать эти значения при вызове BIOS Int 13h / AH = 2. Вы бы поместили 40 в DH , 0 в CH и 3 в CL .

Вы также, похоже, поместили копию ядра со смещением 2048 в образ диска. Смещение 2048 - это LBA, равное 4 (2048/512). Используя приведенную выше формулу и значения, вы получите Cylinder (Track) = 0, Head = 0, Sector = 5. Вы бы поместили 0 в DH, 0 в CH и 5 в CL .

Специальное примечание: Только номера секторов начинаются с 1. Цилиндры (гусеницы) и головки начинаются с 0.


Если вам дан Цилиндр (Трек), Голова и Сектор, и вам необходимо знать, какой LBA соответствует диску, формула будет:

LBA = (C × HPC + H) × SPT + (S − 1) 

Если у вас CHS (40, 0, 3) с геометрией диска 1,44 МБ (HPC = 2 и SPT = 18), LBA = (40 * 2 + 0) * 18 + (3-1) = 1442. 1442 * 512 = 738304 будет дисковым смещением этого сектора.

Если у вас CHS (0, 0, 5) с геометрией диска 1,44 МБ (HPC = 2 и SPT = 18), LBA = (0 * 2 + 0) * 18 + (5-1) = 4. 4 * 512 = 2048 будет смещение диска этого сектора.

Эти 2 вычисления являются противоположностью результатов, вычисленных в первом разделе этого ответа.

...