FreeBSD System Calls (кому всё ещё интересно)
Здравствуйте,
К вопросу о системных вызовах во freebsd:
есть во "FreeBSD Developers' Handbook"
соответствующая статья - "16.3 System Calls".
В ней кратко рассказывается о сходствах и различиях в реализации
системных вызовов в Linux и FreeBSD.
16.3.1 Соглашения о вызовах по умолчанию
По умолчанию, ядро FreeBSD использует соглашения о вызовах языка С.
Кроме того, хотя доступ к ядру осуществляется посредством int 80h,
предполагается, что вместо того, чтобы вызывать ядро непосредственно,
программа будет вызывать функцию, которая исполняет int 80h.
Это соглашение очень удобно, и намного удобней соглашений о вызовах
Microsoft MS-DOS. Почему? Потому что соглашение UNIX позволяет получить
доступ к ядру любой программе написанной на любом языке.
То же самое может делать и программа на ассемблере. Например, мы можем
открыть файл:
kernel:
int 80h ; Call kernel
ret
open:
push dword mode
push dword flags
push dword path
mov eax, 5
call kernel
add esp, byte 12
ret
Это очень ясный и портируемый стиль программирования. Если вы хотите
портировать код в систему UNIX, использующую другое прерывание, или
другой способ передачи параметров, всё что требуется - изменить
процедуру kernel.
Но программисты на ассемблере любят оптимизировать количество
выполняемых кодом тактов. Пример выше требует комбинации call/ret. Мы
можем её исключить, поместив в стек дополнительное двойное слово:
open:
push dword mode
push dword flags
push dword path
mov eax, 5
push eax ; Or any other dword
int 80h
add esp, byte 16
Число 5, которое мы поместили в EAX, определяет функцию ядра, в данном
случае - open.
16.3.2 Альтернативные соглашения о вызовах
FreeBSD - чрезвычайно гибкая система. Она предоставляет другие способы
вызова ядра. Хотя, для этого должна быть установлена эмуляция Linux.
Linux - UNIX-подобная система. Не смотря на это, её ядро использует то
же соглашение о системных вызовах, что и MS-DOS. По правилам UNIX, номер
функции помещается в регистр EAX. Параметры передаются не через стек, а
в регистрах EBX, ECX, EDX, ESI, EDI и EBP:
open:
mov eax, 5
mov ebx, path
mov ecx, flags
mov edx, mode
int 80h
Это соглашение намного хуже по сравнению со стилем UNIX, по крайней
мере, если брать в расчёт программирование на ассемблере: каждый раз
когда вы делаете вызов ядра, вы должны поместить регистры в стек, а
позже извлечь их. Это делает ваш код более громоздким и медленным. Тем
не менее, FreeBSD предоставляет вам выбор.
Если вы выбираете соглашения Linux, вы должны дать знать системе об
этом. После того, как ваша программа ассемблирована и собрана, требуется
пометить исполняемый файл:
% brandelf -f Linux filename
16.3.3 Какие соглашения следует использовать Вам?
Если вы программируете исключительно для FreeBSD, вы всегда должны
использовать соглашения UNIX: они быстрее, вы можете хранить глобальные
переменные в регистрах, вам не требуется помечать исполняемый файл, и
вам не навязывается установка на целевой машине пакета эмуляции Linux.
Если вы хотите создавать портируемый код, который cможет работать также
и в Linux, вы возможно всё ещё захотите дать пользователям FreeBSD код,
эффективный, насколько это возможно.
Hello all.
Работал ли кто с Radius сервером, желательно freeradius+Cisco :)
Возникли несколько вопросов:
1)Где можно взять дополнительные словари с АВпарами (на сайте cisco их
указано гораздо больше, чем в стандартной поставке сервера, и
кое-какие хотелось бы использовать );
2)Задача - есть модемый пул на маршрутизаторе, необходимо
авторизовывать пользователей и в зависимости от логина/пароля
предоставлять различный сервис, от телнета и ppp, до командной строки
на маршрутизаторе, с дополнительными параметрами, такими как время
соединения, трафик и т.д. Как сделать это с помощью tacacs нашел, но
вот как к радиусу перейти не знаю :( .
Подскажите - куда рыть (и где в плане документаци).