уфф, смотри что я вижу в логе эмулятора во время ролика:
Код:
PKT_CD_READ 112460 len 1 mode 28 PIO
PKT_CD_READ 112468 len 2 mode 28 PIO
LDTLB vpn 00000000 ppn 0c908000 mask 00000fff (Master)
PKT_CD_READ 112470 len 2 mode 28 PIO
LDTLB vpn 00001000 ppn 0c909000 mask 00000fff (Master)
PKT_CD_READ 112472 len 2 mode 28 PIO
LDTLB vpn 00002000 ppn 0c90a000 mask 00000fff (Master)
PKT_CD_READ 112474 len 2 mode 28 PIO
LDTLB vpn 00003000 ppn 0c90b000 mask 00000fff (Master)
PKT_CD_READ 112476 len 2 mode 28 PIO
LDTLB vpn 00004000 ppn 0c908000 mask 00000fff (Master)
PKT_CD_READ 112478 len 2 mode 28 PIO
LDTLB vpn 00005000 ppn 0c909000 mask 00000fff (Master)
PKT_CD_READ 112480 len 2 mode 28 PIO
LDTLB vpn 00006000 ppn 0c90a000 mask 00000fff (Master)
PKT_CD_READ 112482 len 2 mode 28 PIO
LDTLB vpn 00007000 ppn 0c90b000 mask 00000fff (Master)
PKT_CD_READ 112484 len 2 mode 28 PIO
LDTLB vpn 00008000 ppn 0c908000 mask 00000fff (Master)
и так далее, и тому подобное.
если всё еще не понятно - в логе видно, что файл читается по 2 сектора в буфер (вернее один из 4х буферов 0c908000 0c909000 0c90b000 0c90b000), и затем мапится в логические адреса начиная с нуля (т.е. там где обычно биос).
на программном уровне это работает как классический mmap:
- включается трансляция адресов
- ставится защита на чтение адресов, в области начиная с нуля
далее код читает данные файла, как будто они находятся в памяти, начиная с нулевого адреса.
если нужная страничка еще не замаплена - стреляет исключение TLB Miss, обработчик которого:
- рассчитывает какая пара секторов файла нам нужна
- читает их в ОЗУ, в один из 4х буферов
- мапит этот буфер в логическое адресное пространство (что видно как "LDTLB ..." в логе выше)
- возвращаемся из обработчика исключения в код игры
я хз как и что там сделано в KOS, но эта игра работает вот таким образом