我使用的系統調用實現MMAP功能(我採取的mmap手動因爲一些原因。)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;
}
我寫了一個宏(用那樣的malloc()函數):
#define Malloc(x) Mmap(0, x, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)
,我用這樣的:
Malloc(45);
我看了看手冊頁。我無法在mmap手冊頁上找到有關EFAULT的信息,但是我在mmap2手冊頁上找到了有關EFAULT的信息。
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),這是正確的。
編輯: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
請提供最少但完整的示例代碼。此外,刪除所有宏(它們是邪惡的,考慮內聯函數或常量)和所有不必要的轉換。那麼,如果使用'strace'運行最小示例和使用庫存'mmap()'的等價物,會發生什麼?噢,請選擇C和C++之一。 –
沒有代碼可以將MmapArgument的格式轉換爲系統調用所需的格式。此代碼只能通過魔法工作。 –