LINUXZONE






 >> Hlavní stránka

(1713/30.07.2010)


 >> Administrace

(160/29.07.2010)


 >> Literatura

(305/28.07.2010)


 >> Bezpečnost

(340/30.07.2010)


 >> Programování

(307/19.04.2010)


 >> Distribuce

(97/09.06.2010)


 >> Síťování

(86/03.06.2010)


 >> Lokalizace

(10/15.09.2004)


 >> Aplikace

(175/12.04.2010)


 >> Multimedia

(32/31.03.2006)


 >> Hardware

(45/02.03.2007)


 >> Začínáme

(228/24.06.2010)


 >> Aktuálně

(556/27.07.2010)


 >> RELAX

(201/26.07.2010)


 >> Jinde vyšlo

přehled ostatních serverů




 Přihlášení




Login:
Heslo:
 uložit v prohlížeči


Nejste-li ješte zaregistrováni, můžete tak učinit zde.





 Vyhledávání




Hledaný výraz:
v klíčových slovech
v titulku
v anotaci
v textu








 Reklama









 Servis




*   Vaše náměty a připomínky
Máte k Linuxzone.cz nějaké připomínky nebo náměty? Našli jste na stránkách chybu? Dejte nám o tom vědět pomocí formuláře nebo v diskuzi.
Komentářů: 30
*   Podpořte Linuxzone.cz
Chcete podpořit náš server umístěním odkazu nebo zveřejněním backendu? Zde najdete vše potřebné.
*   Pište pro Linuxzone.cz
Máte zájem podílet se na obsahu Linuxzone.cz ať už jako redaktoři nebo i jinak? Dejte nám o sobě vědět!





 Aktuálně z bezpečnosti




-- 
6.12.2005, 19:01
Na serveru informit.com vyšla ukázková kapitola týkající se práce s řetězci z knihy Secure Coding in C and C++. (lz)

-- 
3.12.2005, 12:34
Bugtraq: Format String Vulnerabilities in Perl Programs. (lz)

-- 
3.12.2005, 12:32
Linux Advisory Watch December 2nd 2005. (lz)

-- 
23.10.2005, 13:28
Rozhovor na téma klasické zálohování versus CDP. (lz)

-- 
23.10.2005, 13:24
Linux Advisory Watch October 21st 2005. (lz)

další >>





 Aktuálně o software




-- 
6.12.2005, 19:07
Potřebujete-li pod linuxem rozchodit bezdrát založený na čipsetech Broadcom 43xx, konečně existuje linuxový ovladač. (lz)

-- 
6.12.2005, 19:04
Byla uvolněna verze Xen 3.0.0 virtualizační technologie XEN. (lz)

-- 
6.12.2005, 18:59
Byla uvolněna verze X11R6.9/X11R7 RC 3 grafickérho rozhraní X Window System. (lz)

-- 
3.12.2005, 12:45
Co je nového okolo projektu Amanda (open source zálohovací software)? Více na osnews.com. (lz)

-- 
3.12.2005, 12:40
Jak to akuálně v linuxu vypadá s podporou SATA.. (lz)

další >>





 Aktuálně z IT




-- 
3.12.2005, 12:51
Novellu se daří prodej linuxových produktů, oproti loňskému roku se Novell dočkal výrazného nárůstu. (lz)

-- 
3.12.2005, 12:48
Třetí verzi licence GPL by měla být publikována během jara 2007. (lz)

-- 
23.10.2005, 13:20
V Peru nyní mají zákon, který umožňuje nasazení open source software ve vládní správě. (lz)

-- 
23.10.2005, 13:14
Proč se Microsoft bojí Google? (lz)

-- 
27.9.2005, 22:01
Peru má zákon podporující free software. (lz)

další >>





 Nejčtenější články




-- 
Hurd včera dnes a zítra

-- 
XEN aneb virtualizujeme (3/6)

-- 
Security Digest (15/2010)

-- 
Fotografický ateliér

-- 
XEN aneb virtualizujeme (4/6)

-- 
Novinky ze světa svobodného software (16/2010)

-- 
Gamesárium [138]

-- 
Proč používat svobodný software?

-- 
Velká kniha sportovní fotografie

-- 
Security Digest (16/2010)






 Nejlepší články




-- 
Gamesárium [138]

-- 
XEN aneb virtualizujeme (4/6)

-- 
Datové struktury bez předchozích znalostí

-- 
XEN aneb virtualizujeme (3/6)

-- 
Security Digest (16/2010)

-- 
Novinky ze světa svobodného software (17/2010)

-- 
Velká kniha sportovní fotografie

-- 
XEN aneb virtualizujeme (5/6)

-- 
Security Digest (15/2010)

-- 
Proč používat svobodný software?






 Anketa




Používáte nějaké rozšíření bezpečnostního modelu linuxového jádra?

Openwall (18%)

LIDS (12%)

Pax/Grsecurity (3%)

SELinux (6%)

RSBAC (1%)

jiné (1%)

používám standardní jádro (59%)







Linuxzone.cz - server o Linuxu pro programátory, administrátory a fanoušky.
Provozuje společnost Impossible.
ISSN: 1213-8738





Jak to chodí v jádře aneb napište si vlastní ovladač (8)

Po trochu větším předchozím díle trochu zvolníme a podíváme se na další souborovou operaci. Samozřejmostí je přiložený ukázkový příklad.

Minule jsem vás nabádal k položení otázek k částem, které stále nechápete. Neuvědomil jsem si, že mezi tímto a minulým článkem je pouze víkend. Většina z vás není na internetu, článek si tedy nepřečte a nebude moci položit dotaz. Proto přesunu odpovědi na dotazy (pokud nějaké budou) do některého z dalších dílů (středa nebo pátek).

Nová souborová operace

Dnes si odpočineme a ukážeme si pouze jednu novou věc. Naučíme se měnit pozici v našem zařízení. Jistě se většina z vás v rámci programátorské praxe setkala s funkcí lseek (viz. man lseek). My si právě teď naimplementujeme novou část modulu, která bude umožňovat použití funkce lseek.

Prototyp

Funkce umožňující pohyb v rámci našeho zařízení je součástí souborových operací. Podíváme se tedy do struktury file_operations jak má vypadat.

loff_t (*llseek) (struct file *, loff_t, int);

Jak již bývá zvykem, našim prvním parametrem je ukazatel na strukturu file, která udává jakého souboru se požadovaná operace týká. Druhý parametr je relativně či absolutně určená pozice souboru. Jakým způsobem bude jeho hodnota využita určuje náš poslední parametr, který nabízí tři možnosti:

  1. SEEK_SET

    Druhý parametr určuje absolutní pozici v souboru.


  2. SEEK_CUR

    Druhý parametr určuje relativní pozici v souboru vůči pozici aktuální. Nová pozice se tedy vypočítá jako součet pozice aktuální a námi uvedené hodnoty v druhém parametru. V případě záporné hodnoty se samozřejmě budeme vracet zpět.


  3. SEEK_END

    Druhý parametr určuje relativní pozici v souboru, ale už vůči konci souboru. Nová pozice se tedy vypočítá jako součet velikosti souboru a námi uvedené hodnoty v druhém parametru.


Ještě se zmíníme o návratové hodnotě. V případě úspěšného provedení přesunu je vrácena nově nastavená pozice souboru. Je-li návratová hodnota menší jako nula, obsahuje chybový kód.

Implementace

Podívejme se postupně na jednotlivé části námi implementované funkce.

Na začátku si ze struktury file přečteme ukazatel na strukturu otevřeného zařízení a raději zkontrolujeme jestli není NULL.

static loff_t
lz_llseek(struct file *filp, loff_t off, int whence)
{
	lzdev_t *dev = (lzdev_t *)filp->private_data;
	loff_t pos;

	// Mame spatne zarizeni?
	if (dev == NULL)
		return -EBADF;

Nyní se podle třetího parametru rozhodneme co uděláme s pozicí souboru. V případě 0 (SEEK_SET) je to absolutní pozice a tak pouze přiřaď novou pozici.

	// Jakym zpusobem se mame posunout?
	switch (whence)
	{
		case 0: /// SEEK_SET - nastaveni absolutni pozice
			pos = off;
			break;

V případě 1 (SEEK_CUR) se jedná o relativní posun vůči aktuální pozici a tak musíme novou pozici vypočítat.

		case 1: /// SEEK_CUR - relativni posun
			pos = filp->f_pos + off;
			break;

No a v třetím případě 2 (SEEK_END) se jedná také o relativní posun vůči konci souboru.

		case 2: /// SEEK_END - pozice od konce
			pos = dev->size + off;
			break;

Samozřejmě zde nechybí kontrola špatně zadaného parametru.

		default: // spatne zadana hodnota
			return -EINVAL;
	}

Raději zkontrolujeme zda-li uživatel neprovedl změnu mimo rozsah zařízení. Pokud ano, je nutné vrátit chybový kód -EINVAL.

	// Jsme mimo rozsah?
	if (pos < 0)
		return -EINVAL;

Nová pozice je v pořádku. Modifikujeme f_pos na novou pozici a také ji použijeme jako návratovou hodnotu funkce llseek.

	// Nastav novou pozici v zarizeni
	filp->f_pos = pos;

	// A zaroven ji vrat
	return pos;
}

Na vlastní oči jste se přesvědčili, že tato část patří do těch jednodušších. Pro přehlednost si raději celou funkci zopakujeme ještě jednou bez přerušování a komentářů.

static loff_t
lz_llseek(struct file *filp, loff_t off, int whence)
{
	lzdev_t *dev = (lzdev_t *)filp->private_data;
	loff_t pos;

	if (dev == NULL)
		return -EBADF;

	switch (whence)
	{
		case 0:
			pos = off;
			break;
		case 1:
			pos = filp->f_pos + off;
			break;
		case 2:
			pos = dev->size + off;
			break;
		default:
			return -EINVAL;
	}

	if (pos < 0)
		return -EINVAL;

	filp->f_pos = pos;
	return pos;
}

Struktura souborových operací

Nesmíme zapomenout funkci llseek přiřadit do našich souborových operací.

static struct file_operations lzdev_fops =
{
	open:    lz_open,
	release: lz_release,
	read:    lz_read,
	write:   lz_write,
	llseek:  lz_llseek
};

Ukázka použití

V souboru example.c najdete jednoduchou ukázku použití. Myslím, že k ní není potřeba dalšího komentáře. Snad jen to, že by Vám při správné funkci měla vypsat toto:

[root@echelon v0jta-ldd-8]# ./example /dev/lzdev0 
zarizeni.
Failed to set new rel pos -1024
[root@echelon v0jta-ldd-8]#

Závěr

Co řící závěrem? Nic chytrého mě teď bohužel nenapadá a tak jen doufám, že se vám tento seriál líbí.

No a co příště? Trochu zabrousíme do jednoho ze způsobů jakým lze náš modul ladit - všem známý /proc.

Soubory

Použité ukázky v dnešním díle naleznete zde.

Další části seriálu:

Autor: Robert V0jta, 25. 11. 2002, 00:00
Sekce Programování, Komentářů: 5
Průměrné hodnocení: 2,98

o Poslat e-mailem
o Tisk článku
o Uložit do profilu


 Přispějte nám




Líbil se Vám tento článek? Můžete ho ocenit zavoláním na tel. číslo 906 460 134.
Cena hovoru za 1 minutu je 46 Kč.





 Hodnocení článku




Článek hodnotím jako:  [1] výborný   [2] dobrý   [3] průměr   [4] špatný   [5] hrůza  





 Komentáře




--

Robert V0jta, 26. 11. 2002 10:50
Makefile












--

m, 25. 11. 2002 17:09
chyba pri kompilaci na MDK90












--

Petr Pechacek, 25. 11. 2002 16:41
Soubor...












--

Robert V0jta, 25. 11. 2002 12:31
Re: CHYBKY












--

Tomas Kasparek, 25. 11. 2002 10:36
Chybky?















PŘIDAT KOMENTÁŘ ZOBRAZ VŠE >>










2002 © Impossible, s.r.o.   >> Kontaktujte redakci >> Právní upozornění >> Reklama