LINUX.ORG.RU

разъясните по поводу стандартной библиотеки СИ


0

1

Я нашёл полное????? а может и не полное описание библиотеки языка Си, вот оно: http://www.opennet.ru/docs/RUS/glibc/glibc.html#toc12 Вопрос номер один это полное описание или нет?

Далее привожу цитату из методички: А. С. Деревянко «СИСТЕМНОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПЕРСОНАЛЬНЫХ ЭВМ» скачанной вот отсюда: http://www.twirpx.com/signup/

«Традиционно считалось, что единственным языковым средством, дающим полный доступ к аппаратным средствам ЭВМ, является язык Ассемблера. Применительно к ПЭВМ это не совсем так. Многие языки, системы программирования которых реализованы на ПЭВМ, имеют в своем арсенале такие средства, в частности язык Си, который был разработан в 1972 году Д.Ритчи именно как язык системного программиста для написания операционных систем (системы UNIX). Не следует, однако, считать, что средства низкоуровневого доступа являются исключительной прерогативой языка Си - они есть и в других языках, например, программные иллюстрации в [4] базируются на Паскале, а в [6] - на Бэйсике. Популярность Си для целей системного программирования обусловлена наряду с наличием упомянутых средств (а может быть и в первую очередь) высокой эффективностью объектных кодов, вырабатываемых Си-трансляторами.

В данной работе использовалась версия 2.0 системы программирования Турбо-Си. Выбор языка Си в качестве базового для нашего пособия объясняется также и тем, что запись интересующих нас в первую очередь обращений к аппаратным и системным средствам в языке Си весьма „прозрачна“ и соответствующие фрагменты текста Си-программ легко могут быть спроецированы на язык Ассемблера или на какой-либо другой язык высокого уровня. Не следует рассматривать наше пособие как пособие по программированию на языке Си. В целом ряде программ мы сознательно отказывались от присущих языку Си компактности и изящества, чтобы сделать тексты программ более удобочитаемыми. Кроме того, в системах программирования Си очень многие обращения к DOS и к BIOS реализованы в виде стандартных функций (в Турбо-Си описания этих функций находятся в файлах DOS.H и BIOS.H), мы же в наших программных примерах игнорировали наличие таких функций, чтобы достичь большего соответствия с Ассемблерным программированием.»

Далее в методичке приведены описания следующих функций: peek, peekb, poke, pokeb, inport, inportb, outport, outportb, int86 и т.д. Судя по описанию библиотеки Си (http://www.opennet.ru/docs/RUS/glibc/glibc.html#toc12) ТАКИХ ФУНКЦИЙ ТАМ НЕТ!!!! Вопрос, в стандартном языке Си (Турбо-Си насколько я понял это борландовский компилятор, а соответственно и разновидность языка Си) действительно нет таких функций и работа в Си на низком аппаратном уровне не возможна? Или описание стандартной библиотеки Си (http://www.opennet.ru/docs/RUS/glibc/glibc.html#toc12) не полное? Спасибо за ответы!

★★

Вы не забыли что Glibc вобще-то относится к UNIX, а не к Windows, а turbo C к UNIX никак не относится. Он использует DOSовские функции

pylin ★★★★★
()

Я нашёл полное????? а может и не полное описание библиотеки языка Си

Научное открытие века, да; открой для себя ISO/IEC 9899.

anonymous
()

glibc содержит массу функций, отсутствующих в стандарте си, т.е. нестандартных. стандартные функции си-99 описаны в 7-й главе стандарта iso/iec 9899:1999, си-89 (ansi c) — в 4-й главе соответствующего стандарта.

arsi ★★★★★
()

Существует т.н. ANSI standard c library. А есть glibc. Ещё есть turboc. Какбы никто не обещал, что они будут одинаковые. По техникуму помню, что в справке турбо-с на каждую функцию , внизу была табличка: ANSI, Win32 и что-то ещё. И стояли галочки - соответствует или нет. Может и путаю.

vahtu
()

/me постучал по календарю, нет, вроде 2012, а не 1992. А указанные функции это вообще крайне низкоуровневые обёртки которые использовать сейчас не нужно, нельзя и бессмысленно.

Artificial_Thought ★★★★
()

А Вам какой именно «низкий» уровень нужен?

solo1h
()

Дело не в языке программированния, а в ОС.
Обращаться к портам можно и на С и asm и на паскале, вопрос позволить ОС это сделать или нет. Для винды надо драйвер писать, на уровне приложений инструкции перехватываются операционкой. В DDK определены функции на С для работы с железом, более того строго рекомендую работать на С, а не на асме, для переносимости на другое железо и для отладки. В библиотеках С уровня пользователя всякие inport и outport были под дос.

Под линукс проще, через открытие /dev/port.
Можно почитать,
http://www.linuxcenter.ru/lib/articles/programming/io_port_prog_minihowto.phtml

ilovewindows ★★★★★
()
Ответ на: комментарий от ilovewindows

более того строго рекомендую работать на С, а не на асме, для переносимости на другое железо и для отладки

да я как бы это и подразумеваю, собственно у меня всё и сводилось к вопросу как же на Си работать с железом.

ilovewindows огромное спасибо за ответ, сейчас читаю материал по Вашей ссылке.

v4567 ★★
() автор топика

inport, inportb, outport, outportb, int86 ТАКИХ ФУНКЦИЙ ТАМ НЕТ!!!!

а зачем они нужны на PDP-11? или какой arm платформе? вопрос другой, а что ты хочешь сделать?

а линукс ядре вообще нет libc, но это не мешает большую его часть писать на си.

dimon555 ★★★★★
()
Ответ на: комментарий от v4567

ilovewindows у меня ещё вот такой вопрос. Получается исходя из ссылки: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf которую дал пользователь geekless это и есть стандарт языка Си (там даже нет функции sleep). Всё остальное это дополнение к языку Си в разных операционках. В линуксе это библиотека glibc, в дос это те функции которые в методичке приведены и т.д.?

v4567 ★★
() автор топика
Ответ на: комментарий от v4567

к вопросу как же на Си работать с железом.

оборачивать в функции ассемблерные вставки, даже если ассемблер не поддерживает всех современных мнемоник(например всякие инструкцию виртуализации для intel процессоров) всё равно можно вызвать через ассемблерные вставки.

dimon555 ★★★★★
()
Ответ на: комментарий от v4567

Не силен в стандартах, для меня С это десяток операторов и несколько десятков зарезервированных слов, все. Потом, в зависимости от заголовочных файлов, библиотек, компилятора, получается исполняемый код для разных ОС, железа, уровня приложения , уровня ядра и т.д.

зы. код для вывода в порт завалялся

// gcc -Wall io-wd.c -o io-wd
// use : sudo ./io-wd

#include <stdio.h>
#include <unistd.h>
#include <sys/io.h>
#include <stdlib.h>
#include <fcntl.h>

#define PORT_BASE 0x3F8
#define PORT_OFFSET 0

int fd;
int nports=2;

int write_port( unsigned long addr, unsigned char val )
{

if( addr != lseek( fd, addr, SEEK_SET ) ) return EXIT_FAILURE;

printf( «Writing: 0x%X to %lx\n», val, addr );
write( fd, &val, 1 );
usleep(1000);

return EXIT_SUCCESS;
}

int main( int argc, char *argv[] )
{
unsigned long addr = PORT_BASE;
unsigned char time_mode=SECOND_MODE;

if( ( fd = open( «/dev/port», O_RDWR ) ) < 0 )
{
fprintf( stderr, «Not open /dev/port\n» );
return EXIT_FAILURE;
}
write_port( addr, 0xAA );

close( fd );
return 0;
}

ilovewindows ★★★★★
()
Ответ на: комментарий от dimon555

Писать код на си (исключить ассемблер) для железа это рекомендация одной неназываемой здесь конторки, а не мои.

ilovewindows ★★★★★
()
Ответ на: комментарий от vahtu

В борланде был хороший хелп. Хотя раньше везде хелпы были хорошие, потому что надо было - гугла не было.

queen3 ★★★★★
()
Ответ на: комментарий от queen3

Была ещё такая прога hyperhelp или как-то так. Pascal и ассемблер. Давно, правда. :)

vahtu
()

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

какая у тебя задача? найти описание функций? каких? зачем?

просто пиши программы и не мучай себя, займись делом, изучай функции только по мере их востребованности в таком случае

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от v4567

да я как бы это и подразумеваю, собственно у меня всё и сводилось к вопросу как же на Си работать с железом

при чем тут Си? ты в курсе что работа с железом напрямую из программ напрямую запрещена во многих современных ОС в том числе и Linux, всё через драйверы осуществляется

ты можешь пояснить с каким железом ты собираешься работать? просто приведу пример http://lxr.linux.no/#linux v3.4.6/Documentation/i2c/ - работа с железом по стандартному интерфейсу I2C - просто открываешь файл драйвера и дергаешь ioctl-ы - всё

на самом деле можно работать с регистрами устройств напрямую, это может быть полезно в embedded, я так делаю через /dev/mem на платформе ARM (без ассемблера какого-либо), там встроенная в SoC периферия, но для x86 наверное это не имеет смысла так как вся периферия через шины и интерфейсы висит и есть драйверы, а в ARM и прочих - может не быть драйверов для чего-то, но доступ к настроечным регистрам в общем адресном может быть

работа с железом напрямую - это я понимаю работа с регистрами, что по сути изменить значение по такому то адресу и все, это и делают драйверы в соответствии с протоколом

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Ну как бы функции inb() и outb() вполне нормально работают напрямую с портами из пользовательского процесса (правда только руут сможет разрешить поднятие приоритета через iopl())

sigurd ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.