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

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

10.02.2017, 02:04. Показов 6922. Ответов 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,318
Записей в блоге: 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,318
Записей в блоге: 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,318
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru