Ну хорошо, дабы подвести черту. Рассказываю как юзать кернел-мод в 3.ХХ хомках. По крайней мере как я это понял читая ps2dev.org
Фактически, на нужно сделать 2 проги.
1) Kernel mode PRX - обычная библиотека, она будет вызываться из нашей главной программы.
2) EBOOT.PBP - по сути простой PRX лоадер, загружающийся в USER-режиме.
Также, как это сделано на ps2dev разбираем на прмере Nand-дампера.
Делаем библиотеку.
main.c
#include <pspsdk.h>
#include <pspkernel.h>
#include <pspnand_driver.h>
#include <string.h>
PSP_MODULE_INFO("NandDumper", 0x1006, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
int nandLocked = 0;
void LockNand()
{
if (!nandLocked)
sceNandLock(0);
nandLocked = 1;
}
void UnlockNand()
{
if (nandLocked)
sceNandUnlock();
nandLocked = 0;
}
int ReadBlock(u32 page, u8 *buffer)
{
u32 i, j;
u32 k1;
k1 = pspSdkSetK1(0);
LockNand();
if (sceNandIsBadBlock(page))
{
memset(buffer, 0xFF, 528);
UnlockNand();
pspSdkSetK1(k1);
return -1;
}
for (i = 0; i < 32; i++)
{
for (j = 0; j < 4; j++)
{
sceNandReadPagesRawAll(page, buffer, NULL, 1);
sceNandReadExtraOnly(page, buffer+512, 1);
}
page++;
buffer += 528;
}
UnlockNand();
pspSdkSetK1(k1);
return 0;
}
int module_start(SceSize args, void *argp)
{
return 0;
}
int module_stop()
{
return 0;
}
В заголовке обращаем внимание на -
PSP_MODULE_INFO("NandDumper", 0x1006, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
0x1006 - Kernel mode prx
1,1 - версия нашей библиотеке (пофиг какая)
Также обратите внимание, что у нашей библиотеки есть функции module_start() и module_stop()
- они обязательны для внешних библиотек. Также важно, что в нашей библиотеке нету точки входа main().
pspSdkSetK1() - устанавливаем в 0, чтобы не дать Кернелу упасть при обращении к областям памяти юзер-режима..
Makefile делаем следущим образом -
TARGET = nanddumper
OBJS = main.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
BUILD_PRX = 1
PRX_EXPORTS = nanddumper.exp
USE_KERNEL_LIBC=1
USE_KERNEL_LIBS=1
LIBDIR =
LDFLAGS = -mno-crt0 -nostartfiles
LIBS = -lpspnand_driver2
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Обращаем внимание на "no-crt0" и "nostartfiles". Так делается по той причине, что у нас не программа,
а просто библиотека и все это нам не надо. Также обращаем внимание на подключаемые библиотеки.
Да, и у нас появляется строчка "PRX_EXPORTS = nanddumper.exp" - в этом файлике указаны функции нашей библиотеки,
функции которые будут видимы после её загрузки.
nanddumper.exp -
# Define the exports for the prx
PSP_BEGIN_EXPORTS
# These four lines are mandatory (although you can add other functions like module_stop)
# syslib is a psynonym for the single mandatory export.
PSP_EXPORT_START(syslib, 0, 0x8000)
PSP_EXPORT_FUNC_HASH(module_start)
PSP_EXPORT_VAR_HASH(module_info)
PSP_EXPORT_END
PSP_EXPORT_START(NandDumper, 0, 0x4001)
PSP_EXPORT_FUNC(ReadBlock)
PSP_EXPORT_END
PSP_END_EXPORTS
Усё должно быть в этом файле именно так, за исключением строчек "PSP_EXPORT_FUNC()" -
именно этими строчками вы указываете ваши функции экспортируемые из вашей библиотеки.
Да, и не забываем что строчка "PSP_EXPORT_START(NandDumper, 0, 0x4001)" должна соответствовать тому,
что вы написали в модульинфе в файле main.c.
Значит этот файлег "nanddumper.exp" нам нужен для того, чтобы сгенерить .S файл, который в свою очередь
юзается нашей прогой для доступа к экспортированным функциям. Чтобы сгенерить S файл идём в Пуск->выполнить
вбиваем "cmd", заходим в папку с установленным PSPSDK и выполняем команду-
psp-build-exports -s nanddumper.exp
Не забываем, что перед этим нам надо установить правильное окружение(запустить файл pspdev.bat)
Т.е. вся процедура отображена здесь -
[IMG]http://img521.**************/img521/8778/54330844wh4.jpg[/IMG]
Получившийся .S - файл будет выглядеть примерно так -
.set noreorder
#include "pspstub.s"
STUB_START "NandDumper",0x40090000,0x00010005
STUB_FUNC 0x9EDD6EE1,ReadBlock
STUB_END
Копируем .S файл в папку с нашей прогой. Усё, компилим нашу либу.
Ну а теперь
делаем наш EBOOT.PBP - главную программу, которая грузит нашу библиотеку.
#include <pspsdk.h>
#include <pspkernel.h>
#include <stdio.h>
#include <string.h>
PSP_MODULE_INFO("NandDumperMain", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20000);
u8 block[32*32*528];
int ReadBlock(u32 page, u8 *buffer);
#define printf pspDebugScreenPrintf
int main()
{
pspDebugScreenInit();
SceUID mod = pspSdkLoadStartModule("nanddumper.prx", PSP_MEMORY_PARTITION_KERNEL);
if (mod < 0)
{
printf("Error 0x%08X loading/starting naddumper.prx.\n", mod);
}
else
{
SceUID fd = sceIoOpen("ms0:/nanddump.flash", PSP_O_WRONLY | PSP_O_CREAT | PSP_O_TRUNC, 0777);
printf("Dumping...\n");
int i, j;
for (i = 0; i < (2048*32); )
{
u8 *p = block;
memset(block, 0xff, sizeof(block));
for (j = 0; j < 32; j++)
{
if (ReadBlock(i, p) < 0)
{
printf("bad block at page %d block %d\n", i, i/32);
}
i += 32;
p += (528*32);
}
sceIoWrite(fd, block, sizeof(block));
}
sceIoClose(fd);
printf("Done. Exiting in 5 seconds\n");
}
sceKernelDelayThread(5*1000*1000);
sceKernelExitGame();
return 0;
}
Обращаем внимание на заголовок. Прога должна быть в USER-режиме.
PSP_MODULE_INFO("NandDumperMain", 0, 1, 0);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(20000);
Размер буфера тоже увеличиваем.
Внимание, необходимо задекларировать все функции которые будем юзать из внешней библиотеки
int ReadBlock(u32 page, u8 *buffer);
А вот этой строчкой -
SceUID mod = pspSdkLoadStartModule("nanddumper.prx", PSP_MEMORY_PARTITION_KERNEL);
Грузим нашу библиотеку. Она уже будет в КЕРНЕЛ-режиме. Файлег .s у нас позаботится о переходах юзер/кернел
и голова у нас об этом не болит.
Ну и makefile
TARGET = nanddumpermain
OBJS = main.o NandDumper.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
BUILD_PRX = 1
PSP_FW_VERSION = 371
LIBDIR =
LIBS =
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Ну вот собстна и всё. Откомпилив всё это, вы получаете 2 файла - nanddumper.prx и EBOOT.PBP
Закидываете на стик и всё готово.
(С)Перевод мой) Оригинал на
ps2dev
Писал, не проверяя на PSP, вечерком возможно проверю. Если есть каменты, пожелания/исправления - пишите.