Zpozdeni na seriovem portu 16550A
Pavel Kankovsky
peak na argo.troja.mff.cuni.cz
Úterý Srpen 19 20:35:18 CEST 2003
On Tue, 19 Aug 2003, Jan Kasprzak wrote:
> Pokud si pres gettimeofday() zjistuji, jak dlouho trva nacteni
> konkretnich bajtu, tak s 16450 to vypada tak, ze bajty prichazeji cca
> po 1ms (coz odpovida rychlosti 9600 bps) a v okamziku kdy mam vysilat,
> je cca 20ms pauza. Zatimco pokud pres setserial nastavim uart 16550A,
> tak prvni bajt prijde az treba po 10-20ms a dalsich 7 bajtu prijde po
> 9-11 mikrosekundach (cili jsou zrejme nekde nabufferovane).
Tohle vypada tak, ze je to skutecne tim, ze je UART nastaveny tak, aby
v bufferu pokud mozno nastosoval az 8 znaku, nez posle interrupt (patricna
klicova fraze je "trigger level"). Coz je pochopitelne vetsinou dobry
napad, protoze to zmensuje pocet interruptu, vadi to akorat kdyz nejaka
trubka vymysli zarizeni, co dokaze prijimat data jen obcas. :)
setserial rozumi flagu low_latency, ale to zjevne ovlivnuje hlavne
terminalovou linkovou disciplinu, i kdyz to i tak muze dobry napad pouzit.
Jak tak na to koukam, tak trigger level nejde v Linuxu nastavit primo, ale
mohlo byt to jit udelat neprimo nastavenim rychlosti. Nebudu predstirat,
ze rozumim tomu, o co se snazi ten divny kod v jadre, ale nastaveni
rychlosti na < 2400 by mohlo zafungovat.
--Pavel Kankovsky aka Peak [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."
Další informace o konferenci Linux