Форум программистов, компьютерный форум, киберфорум
Assembler: Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/34: Рейтинг темы: голосов - 34, средняя оценка - 4.91
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,319
Записей в блоге: 12

Системные вызовы и brk vs sbrk в частности

10.02.2017, 02:04. Показов 6930. Ответов 24

Студворк — интернет-сервис помощи студентам
Изучаю программинг под Linux, в частности системные вызовы
Многочасовые поиски нормального справочника по системным вызовам завершились, по сути, тремя ссылками:
http://linuxdoc.ru/sys-doc.html
http://www.digilife.be/quickre... erence.pdf
http://syscalls.kernelgrok.com/
Всё остальное - примерно то же самое, только с разным дизайном. Ну или учебник какой-нибудь о Unix в целом (хоть и на русском).

Так вот, на практике придётся использовать все 3 справочника...
1. В первом находить нужную функцию и читать её описание (неплохо, что там всё по-русски).
2. Во втором находить номер функции по названию.
3. Третий использовать, когда информации из 1-го недостаточно (там расписано подробнее и кол-во функций значительно больше... и даже исходники есть).

У кого есть, киньте, плиз, ссылкой на удобный, полный, структурированный справочник, в котором будут указаны (важно!) номера функций и значения констант (типа EBADF и т.д.). Что дескриптор стандартного ввода = 0, а вывода = 1 я уже понял, но сдаётся мне, есть там ещё куча подобных штук, искать которые опять же придётся в example'ах на просторах всея интернета, что не очень удобно... А если там ещё и примеры использования будут, то будет вообще супер (хотя не критично).

В частности, вот такой вопрос у меня возник: brk и sbrk вроде разные функции. А номер функции (eax) как будто один и тот же... Как это может быть? В чём подвох? Или система по значению передаваемого параметра определяет (типа > 0x8000000, значит brk, иначе sbrk)?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2017, 02:04
Ответы с готовыми решениями:

Системные вызовы. Получение заголовка консольного окна
Всем доброй ночи! Скоро сессия у тут, наверное очень много постов с просьбой студентов помочь сделать ту или иную лабу. И я вот как...

Brk, sbrk и прочие системные вызовы
Привет! Изучаю программинг под Linux, в частности системные вызовы :) Многочасовые поиски нормального справочника по системным вызовам...

Qt и системные вызовы
Здравствуйте. Задался таким вопросом - можно ли в Qt производить вызов системных вызовов Linux? Можно ли там подключать Си-шные...

24
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,319
Записей в блоге: 12
10.02.2017, 16:46  [ТС]
Студворк — интернет-сервис помощи студентам
nimazzzy, а как скомпилить 32-битную прогу?

Пишу, например:
Code
1
2
as --32 file.s -o file.o
ld -s -b elf32-i386 file.o -o file.elf
ld мне пишет:
ld: i386 architecture of input file `file.o' is incompatible with i386:x86-64 output

В общем, я перепробовал разные ключи ld -b, и для as --x32 тоже пробовал - бесполезно!

Дальше, as ругается на pushl %ebx
Это что за новость? В винде всё компилится нормально...

Зато в винде (MinGW32) objcopy -O elf32-i386 создаёт какие-то кривые объектники. Когда собираешь прогу из нескольких файлов, call'ы прыгают мимо функций на ≈4 байта.

Добавлено через 17 минут
На pushl он ругался из-за комментариев. Пипец просто!
0
Заблокирован
10.02.2017, 19:36
-m elf_i386

Добавлено через 2 часа 20 минут
Добрался наконец до своей машины. Проверил brk, все работает, где жесть-то
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
section   .text
global   _start
 
_start:
 
mov rax, 12 ; первый brk
xor rdi, rdi ; с нулем
syscall
 
mov rbx, rax
add rax, 1024 ; добавим к адресу 1024
mov rdi, rax
mov rax, 12 ; снова brk
syscall
 
add rbx, 512 ; запишем по смещению 512 что-нибудь в куче
mov [rbx], rax
 
xor rdi, rdi
mov rax, 60 ; выход
syscall
память выделилась, в нее записали. Если убрать второй сискол, то ожидаемо сегфолтится. Все как по нотам. Для 32 битов все то же самое, только свои там коды сисколов, регистры и т. д.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,319
Записей в блоге: 12
11.02.2017, 12:33  [ТС]
nimazzzy, ну да...

http://man7.org/linux/man-pages/man2/brk.2.html
C library/kernel differences
The return value described above for brk() is the behavior provided
by the glibc wrapper function for the Linux brk() system call. (On
most other implementations, the return value from brk() is the same;
this return value was also specified in SUSv2.) However, the actual
Linux system call returns the new program break on success. On
failure, the system call returns the current break. The glibc
wrapper function does some work (i.e., checks whether the new break
is less than addr) to provide the 0 and -1 return values described
above.
Спасибо!

Добавлено через 7 минут
Освобождать же её не нужно перед выходом?
0
Заблокирован
11.02.2017, 12:40
Цитата Сообщение от Jin X Посмотреть сообщение
Освобождать же её не нужно перед выходом?
Перед выходом не обязательно. Это актуально только для долгоиграющих приложений, чтобы память не держать занятой и неиспользуемой.
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6816 / 2055 / 239
Регистрация: 14.12.2014
Сообщений: 4,319
Записей в блоге: 12
12.02.2017, 01:30  [ТС]
Если кому интересно, мой код sbrk:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
; Наша функция sbrk, выход: eax = кол-во памяти, которую нужно выделить (или 0, если нужно получить "вершину" brk), выход: eax = указатель на начало выделенной памяти или -1 в случае ошибки
%define __NR_brk 45
my_sbrk:
        push    ebx            ; сохраняем ebx (esi, edi, ebp, esp)
        xchg    ecx,eax        ; сохраняем eax в ecx
 
        xor     ebx,ebx        ; новый brk, устанавливаем в 0 (чтобы получить текущее значение)
        mov     eax,__NR_brk   ; код функции brk
        int     0x80           ; запускаем, на выходе eax = brk
 
        jecxz   sbrk_end       ; если ecx = 0, выходим (вернув текущую позицию brk в eax)
 
        push    eax            ; сохраняем eax (текущий brk)
        lea     ebx,[eax+ecx]  ; ebx = eax+ecx = новая позиция brk
        mov     eax,__NR_brk   ; код функции brk
        int     0x80           ; запускаем, eax на выходе = brk
        xchg    ecx,eax        ; сохраняем новый brk в ecx
        pop     eax            ; eax = старый brk (начало выделенной памяти)
        sub     ecx,eax        ; ecx = ecx - eax (новый brk - старый brk)
        jnz     sbrk_end       ; если не равны, значит всё ok
 
        mov     eax,-1         ; иначе возвращаем -1
sbrk_end:
        pop     ebx
        ret
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.02.2017, 01:30

Системные вызовы
Дали задание: • Вывести имя компьютера; • Вывести имя пользователя; • Вывести версию ядра операционной системы; • Применить в...

Системные вызовы
Мне нужно продемонстрировать работу системных вызовов windows на с++. Как это можно сделать?

Системные вызовы
Как осуществить вывод счета в секундах на консоль (своеобразный таймер). и как организовать отсчет числа секунд в обратном направлении? ...

Pintos системные вызовы
подскажите, пжлста, какие-нибудь линки или книги, где можно прочитать как работать в Пинтос, как писать системные вызовы и программки,...

Системные вызовы Ubuntu
Доброго времени суток. Надеюсь, не ошибся с разделом. Недавно записался на онлайн курс по Linux, но немного подзавис на заданиях, которые...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru