вызовите mmap из сборки на Macos Catalina, чтобы зарезервировать память - PullRequest
0 голосов
/ 30 мая 2020

У меня есть файл сборки без связанных библиотек на MacOs Catalina, который хочет вызвать mmap для динамического резервирования некоторой памяти. Я думал, что мне нужно сделать что-то вроде

#define __NR_mmap 0x20000c5

#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)

#define MAP_ANON 0x1000
#define MAP_SHARED      0x0001
#define MAP_PRIVATE     0x0002

#define USER_DEFS_SIZE 0x20000

        mov $__NR_mmap, %rax            //mmap
        xor %rdi,%rdi                   // start address
        and $USER_DEFS_SIZE,%rsi        // length
        mov $PROT_READ, %rdx            // rwx
        mov $(MAP_ANON|MAP_SHARED),%rcx // flags
        xor %r8,%r8                     // file descriptor
        xor %r9,%r9                     // offset
        syscall

, но это возвращает 0x13 (ENODEV) в% rax. Я попытался передать файловый дескриптор $ -1, но это дало мне ожидаемую ошибку «плохой файловый дескриптор». ]

  • Вопрос1: Что я делаю не так - как мне правильно вызвать mmap для резервирования памяти?

  • Вопрос2: как адрес возврата а эррно вернулся? Не могут ли оба ралли быть в% rax, или они могут? Я не уверен в соглашении о вызове.

Спасибо за помощь.

1 Ответ

3 голосов
/ 30 мая 2020

Во-первых, проблема с неинициализацией% rsi, как указал Шут.

После этого у вас неправильный системный вызов ABI. Четвертый аргумент (флаги) следует передавать в %r10, а не в %rcx.

Ошибка указывается флагом CF регистра флагов. Если это установлено, то %rax содержит ошибку; в противном случае - возвращаемое значение.

Наконец, я должен указать, что Apple специально заявляет, что ABI системных вызовов может быть нестабильным от выпуска к выпуску ОС. Стабильный ABI - это уровень оболочки библиотеки (т.е. вы должны вызывать _mmap из libSystem.dylib). Они оставляют за собой право в любой момент сломать все, что выполняет системные вызовы напрямую.

...