Я реализую функцию MMAP с помощью системного вызова (я реализую ММАП вручную из-за рядом причин.)ММАПА возвращение -14 (-EFAULT ??)
Но я получаю возвращаемое значение -14 (. - EFAULT, я проверил с GDB) ти это сообщение:
WARN Nar::Mmap: Memory allocation failed.
Вот функция:
void *Mmap(void *Address, size_t Length, int Prot, int Flags, int Fd, off_t Offset) {
MmapArgument ma;
ma.Address = (unsigned long)Address;
ma.Length = (unsigned long)Length;
ma.Prot = (unsigned long)Prot;
ma.Flags = (unsigned long)Flags;
ma.Fd = (unsigned long)Fd;
ma.Offset = (unsigned long)Offset;
void *ptr = (void *)CallSystem(SysMmap, (uint64_t)&ma, Unused, Unused, Unused, Unused);
int errCode = (int)ptr;
if(errCode < 0) {
Print("WARN Nar::Mmap: Memory allocation failed.\n");
return NULL;
}
return ptr;
}
Я написал макрос (Для того, чтобы использовать как таНос() функции):
#define Malloc(x) Mmap(0, x, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)
и я так:
Malloc(45);
Я посмотрел на человека странице. Я не мог найти информацию о EFAULT на странице mmap man, но я нашел что-то о EFAULT на странице manap2 man.
EFAULT Проблема с получением данных из пользовательского пространства.
Я думаю, что это означает, что что-то не так с передачей struct в системный вызов. Но я считаю, нет ничего плохого в моих структурах:
struct MmapArgument {
unsigned long Address;
unsigned long Length;
unsigned long Prot;
unsigned long Flags;
unsigned long Fd;
unsigned long Offset;
};
Может что-то не так со значением результата вручая? Открыв файл (который не существует) с CallSystem дал мне -2 (-ENOENT), что верно.
EDIT: Полный источник CallSystem. открывать, писать, закрывать работы, но mmap (или old_mmap) не работает. Все аргументы были приняты хорошо.
section .text
global CallSystem
CallSystem:
mov rax, rdi ;RAX
mov rbx, rsi ;RBX
mov r10, rdx
mov r11, rcx
mov rcx, r10 ;RCX
mov rdx, r11 ;RDX
mov rsi, r8 ;RSI
mov rdi, r9 ;RDI
int 0x80
mov rdx, 0 ;Upper 64bit
ret ;Return
Исходный код для 'CallSystem'. – gudok
Просьба предоставить минимальный, но полный примерный код. Кроме того, удалите все макросы (они злы, рассмотрите встроенные функции или константы) и все ненужные роли. Затем, что произойдет, если вы запустите минимальный пример и эквивалент, используя команду 'mmap()', используя 'strace'? О, и, пожалуйста, решите для одного из C и C++. –
Нет кода для преобразования формата 'MmapArgument' в формат, который ожидает системный вызов. Этот код может работать только по волшебству. –