что такое использование общего abi в таблице системных вызовов - PullRequest
1 голос
/ 18 января 2020

Я добавил простой системный вызов, который печатает привет, используя printk. Для этого я добавил следующую строку в syscall_64.tbl

434     common  hello                   __x64_sys_hello

Написал простое приложение, которое вызывает системный вызов из пространства пользователя

#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/syscall.h>
#include <string.h>
int main(void)
{
    long return_value = syscall(434);

    printf("return value from syscall: %ld\n", return_value);
    return 0;
}

Работает, и добавляется dmesg со строкой «Hello World»

Когда я генерирую 32-битное приложение, добавив флаг «-m32», оно завершается неудачно с -ENOSYS

syscall_0x1b2(0x5663bfd0, 0xffb09a8c, 0x5663a5a4, 0x1, 0xffb09a84, 0xffb09a8c) = -1 (errno 38)

Что такое «общее» поле во втором столбце таблицы системных вызовов. Нужно ли нам снова объявлять в 32-битной таблице системных вызовов доступ к 32-битным приложениям?

1 Ответ

1 голос
/ 20 января 2020

Существует два 32-битных ABI, которые могут поддерживаться 64-битными ядрами x86, в дополнение к собственному x86-64 ABI. 32-битные ABI:

  1. i386 ABI, имитирующий ABI, реализованный 32-битными ядрами x86.
  2. x32 ABI, который является более новым 32-разрядным ABI для ядер x86-64.

Флаг G CC -m32 сгенерирует код для ABI i386. Используйте флаг -mx32 для генерации кода для ABI x32.

Файл "syscall_64.tbl" перечисляет системные вызовы для ABI x86-64 и x32:

  1. . Записи «64» предназначены для ABI x64-64.
  2. Записи «x32» предназначены для ABI x32.
  3. «Общие» записи предназначены для ABI x64-64 и x32 .

"syscall_32.tbl" перечисляет системные вызовы для i386 ABI. Для каждого номера системного вызова в таблице перечислены две точки входа:

  1. Точка входа для 32-разрядных ядер x86.
  2. Точка входа "compat" для эмуляции ABI i386 на x86 -64 ядра.

Некоторые устаревшие системные вызовы, которые больше не реализуются ядром, перечислены без точки входа.

Хотя существует много старых 32-битных двоичных файлов - только программное обеспечение, которое использует i386 ABI и работает как на 32-битных, так и на 64-битных системах, новый x32 ABI никогда не становился очень популярным. Приложения, использующие x32 ABI, не будут работать в системах с 32-разрядными ядрами.

...