EE, IOP e SIF
Esta seção está em beta. Veja a nota na folha de referência.
O EE e o IOP não compartilham memória. A lógica do jogo roda no EE, e quase todos os periféricos só são alcançáveis a partir do IOP. Esta página documenta o enlace entre eles.
Módulos IOP
Um módulo IOP (.irx) é um programa separado com seu próprio ponto de entrada (_start), carregado na memória do IOP pelo kernel do IOP. Ele não é linkado no seu executável EE. Um target iop/iop_lib do ps2.yaml compila um destes. O seu executável EE e seus módulos IOP são binários separados que cooperam em tempo de execução. Consequências:
embed_irxexiste. Ele embute um.irxauxiliar em um targetee, de modo queps2build buildproduz um único.elfe você não distribui vários arquivos.- muitos pacotes vêm em pares. Uma metade é uma biblioteca do lado EE que dá ao código do jogo uma função comum para chamar. A outra metade é o driver IOP com o qual essa função conversa por SIF.
pad+padman,mc+mcman/mcserv,netman(lado IOP) emparelhado comps2ip(lado EE) seguem esse padrão.
SIF
O SIF (Sub-system InterFace) é o enlace de hardware entre os dois processadores. É um canal estreito, sem memória compartilhada. Os pacotes sifman/sifcmd deste SDK são a camada de software de RPC construída sobre ele: sifman cuida da mecânica de baixo nível de init e transferência por DMA, e sifcmd coloca por cima um protocolo de requisição/resposta para que o código EE chame funções no estilo sceSifCallRpc() que bloqueiam até o módulo IOP do outro lado responder.
Dois dos dez canais de DMA são dedicados a este enlace (DMA_CHANNEL_fromSIF0/DMA_CHANNEL_toSIF1 - veja DMA), mais um terceiro menos comum (DMA_CHANNEL_SIF2).
Chamadas RPC e carregamento
Uma chamada RPC envia uma mensagem ao IOP e de volta e custa mais que uma chamada de função local. Um módulo IOP precisa ser carregado (SifLoadModule ou SifExecModuleBuffer, ou embed_irx, que o embute no binário EE) antes que qualquer coisa possa chamá-lo. Linkar não basta.
patches (sbv)
O pacote patches (diretório-fonte sbv, veja a folha de referência) existe porque alguns recursos do IOP dos quais o SDK depende, como carregar um módulo a partir de um buffer em memória em vez de um arquivo, não existem no kernel do IOP da BIOS retail original. A maioria dos programas chama sbv_patch_enable_lmb() antes de qualquer outro trabalho com o IOP. Ela corrige o kernel do IOP em execução para suportar LoadModuleBuffer.