Linux kernel ABI

Научно-технические вопросы применения русского языка в программировании. Проекты с сайта программирование-по-русски.рф, кроме ЯОС . Информация об организациях и людях, использующих или изучающих русский язык в программировании. Сравнение операционных систем.
Ответить
atz
Сообщения: 139
Зарегистрирован: 21.12.18 22:45

Linux kernel ABI

Сообщение atz » 12.06.19 19:31

Раз уж начал копать, оставлю тут (дальше кому надо докопает сам).

int 80h, x86 (32), BSD (posix):

http://www.int80h.org/bsdasm/#the-syscalls-file
3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
int 80h, x86 (32), linux:

есть пример на ассемблере (example reads a number from the keyboard and displays it on the screen)
https://www.tutorialspoint.com/assembly ... _calls.htm
3 sys_read
4 sys_write
int 80h -> vDSO, linux:

http://qaru.site/questions/22776/what-i ... or-syscall
http://articles.manugarg.com/systemcallinlinux2_6.html
Kernel also setups system call entry/exit points for user processes. Kernel creates a single page in the memory and attaches it to all processes' address space when they are loaded into memory. This page contains the actual implementation of the system call entry/exit mechanism. Definition of this page can be found in the file /usr/src/linux/arch/i386/kernel/vsyscall-sysenter.S. Kernel calls this page virtual dynamic shared object (vdso)
...
Userland processes (or C library on their behalf) call __kernel_vsyscall to execute system calls. Address of __kernel_vsyscall is not fixed. Kernel passes this address to userland processes using AT_SYSINFO elf parameter.
linux, номера:

https://github.com/torvalds/linux/blob/ ... all_32.tbl
3 i386 read sys_read __ia32_sys_read
4 i386 write sys_write __ia32_sys_write
https://github.com/torvalds/linux/blob/ ... all_64.tbl
0 common read __x64_sys_read
1 common write __x64_sys_write
x86_64, linux:

https://github.com/torvalds/linux/blob/ ... entry_64.S
entry_64.S:107 писал(а): * 64-bit SYSCALL instruction entry. Up to 6 arguments in registers.
*
* This is the only entry point used for 64-bit system calls. The
* hardware interface is reasonably well designed and the register to
* argument mapping Linux uses fits well with the registers that are
* available when SYSCALL is used.
Последний раз редактировалось atz 13.06.19 11:05, всего редактировалось 5 раз.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Linux ABI

Сообщение Лис [Вежливый] » 12.06.19 19:38

У линукса одновременно есть три разных ABI:
1) i[3-6]86
2) x86_64
3) x32

Ты привёл примеры не из того ABI (хотя в принципе-то это без разницы)

atz
Сообщения: 139
Зарегистрирован: 21.12.18 22:45

Re: Linux ABI

Сообщение atz » 12.06.19 19:42

i386 - это и есть x32.
x86_64 же у тебя, тебе и разбираться, номера оставил.
Последний раз редактировалось atz 12.06.19 20:10, всего редактировалось 1 раз.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Linux ABI

Сообщение Лис [Вежливый] » 12.06.19 19:49

i386 - это и есть x32

нет, это два разных набора системных функций.

atz
Сообщения: 139
Зарегистрирован: 21.12.18 22:45

Re: Linux ABI

Сообщение atz » 12.06.19 19:54

в чём разница?
Последний раз редактировалось atz 12.06.19 20:07, всего редактировалось 2 раза.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Linux ABI

Сообщение Лис [Вежливый] » 12.06.19 20:02

> в чём разница

Это можно прочитать здесь:
https://stackoverflow.com/questions/763 ... hitectures

atz
Сообщения: 139
Зарегистрирован: 21.12.18 22:45

Re: Linux ABI

Сообщение atz » 12.06.19 20:07

x32 ABI - is a new ABI being actively worked on. It is basically 32-bit code running in x86_64 (x64) mode,
x32 ABI - is part of Linux 3.4.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Linux ABI

Сообщение Лис [Вежливый] » 12.06.19 20:11

Ты просто не вполне понимаешь, как это работает. Например линковщик (ld.so) размещается на диске в трёх вариантах:

в директориях:
/usr/lib
/usr/lib64
/usr/libx32

/usr/lib/ld-linux.so.2: file format elf32-i386
architecture: i386, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000a90

/usr/lib64/ld-linux-x86-64.so.2: file format elf64-x86-64
architecture: i386:x86-64, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x0000000000000c90

/usr/libx32/ld-linux-x32.so.2: file format elf32-x86-64
architecture: i386:x64-32, flags 0x00000150:
HAS_SYMS, DYNAMIC, D_PAGED
start address 0x00000960

Обрати внимание, что у всех этих файлов разные флаги платформы в заголовке ELF-файла
elf32-i386
elf64-x86-64
elf32-x86-64

и соответственно все остальные библиотеки так же. Гуглить по ключевому слову multilib


Я не вижу смысла ограничиваться 32-хбитным вариантом, поэтому предлагается использовать x86_64 (то есть совсем 64-битный - elf64-x86-64).

Павиа
Сообщения: 136
Зарегистрирован: 23.05.19 21:28

Re: Linux kernel ABI

Сообщение Павиа » 13.06.19 15:34

Лис немного путает ABI с API.
ABI описан в книгах
https://en.wikipedia.org/wiki/Executabl ... ifications
А то что привел Ацтек это API, вернее POSIX часть SystemCall
Так как сам стандарт POSIX вроде как платный, то проще заглянуть в манпедж:
http://man7.org/linux/man-pages/man2/syscalls.2.html

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: Linux kernel ABI

Сообщение Лис [Вежливый] » 13.06.19 16:22

Лис не путает API и ABI.

Но это не имеет значения, потому что atz не решился писать под Linux.

Ответить