|
|
|
RAZRABOTKI
|
Linuks moduli
|
|
|
|
|
|
ot PxL(22-02-2007)
reiting (51)
[ dobre ]
[ zle ]
Variant za otpechatvane .::Linux draivuri::.
.:: Koi? Kude? Zashto?
Predi izvestno vreme biah mnogo zapalen da napisha draivur za iadroto na Linux.Izvestno mi beshe gore-dolu kak se pishe draivur i kak raboti takuv, suotvetno imah i izvestni poznaniia po C.Obshto vzeto tova bi triabvalo da e iziskvaneto za pisane na draivuri za ustroistva. Kato tsialo podobni materiali ne lipsvat v internet, no ne sum sreshtal na bulgarski.
.:: Niva na komunikatsiia
Kakto predpolagam e izvestno na povecheto Linux potrebiteli, ustroistvata tam sa predstaveni kato failove, namirat se v /dev chasta...Otsustva portovata komunikatsiia...? Po-skoro komunikatsiiata s fizicheskite ustroistva se osushtestviava na dve niva. Realnata komunikatsiia s harduernoto ustroistvoto se sushtestviava ot t.nar. kernel space nivo, kudeto iadroto i modulite mu se grizhat da predavat informatsiiata ot i za fizicheskite ustroistva kum suotvetstvashtite im takiva predstaveni ot failove. Drugata chast se naricha user space, kudeto aplikatsiite komunikirat s tezi failove.
.:: Kernel space / User space
Kato nachalo mozhem da kazhem nakratko, che modulite sa prilozheniia, chiiato ideia e da se razshiri i lesno da se dobavia funktsionalnost kum iadroto. V zavisimost ot tipa na iadroto (v konkretniiat sluchai viziram Linuks iadro) modulite mogat da se dobaviat dinamichno, t.e. ne e nuzhna prekompilatsiia i restart na samoto iadro za da bude dobaven nov modul. Po-spetsialno ni interesuvat t.nar. monolitic tip iadra, tui kato Linux iadroto e takuv tip. Pri monolitic tipovete iadra (za razlika naprimer ot microkernel tipovete) modulite izpolzvat pametta zadelena za iadroto. Tova oznachava, che vsichki globalni danni sa vidimi za vsichki moduli. Imenno poradi tova pisaneto na moduli triabva da e mnogo strogo standartizirano i e za predpochitane da se polzvat static promenlivi..
Kakto spomenah po-gore tselta na draivurite v kernel space e da svurzhat failovete na ustroistvata v /dev sus samit eharduerni ustroistva.Modulite v kernel space (LKM - Loadable Kernel Modul) obmeniat danni s potrebitelskite aplikatsii v user space chrez callback funktsii v iadroto.Predstaveno vizualno tova bi izglezhdalo taka:
Za da ne oburkam niakogo ili sebe si napravo shte dam primer za prost kernel modul.
simple.c |
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dimiter Todorov Dimitrov");
MODULE_DESCRIPTION("Simple kernel-space module");
MODULE_SUPPORTED_DEVICE("testdevice"); |
Kakto zabeliazvate izpolzvam niakolko makrosa, chrez koito opredeliame litsenz i informatsiia za modula. Definirani sa v module.h neobhodimost za vseki edin kernel modul (vim /usr/include/linux/module.h).
Za da kompilirame shte ni triabva elementaren Makefile
Makefile |
KDIR:=/lib/modules/$(shell uname -r)/build
obj-m:=simple.o
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(RM) .*.cmd *.mod.c *.o *.ko -r .tmp* *.symvers |
Neobhodimo e za kompilatsiia da se polzva iadroto, v koeto shte zaredite modula. Dobavil sum i optsiia za clean sled kompilatsiia.
Zapazvame i kompilirame:
Primeren kod |
jorko tut $ make; ls
make -C /lib/modules/2.6.18/build SUBDIRS=/pxl/Devel/tut modules
make[1]: Entering directory `/usr/src/linux-2.6.18'
CC [M] /pxl/Devel/tut/simple.o
Building modules, stage 2.
MODPOST
CC /pxl/Devel/tut/simple.mod.o
LD [M] /pxl/Devel/tut/simple.ko
make[1]: Leaving directory `/usr/src/linux-2.6.18'
Makefile simple.c simple.mod.c simple.o
Module.symvers simple.ko simple.mod.o
jorko tut $ |
Kompiliraniiat modul simple.ko mozhem da zaredim ot user space v iadroto, chrez insmod, i da razgledame s lsmod.
Primeren kod |
jorko tut
jorko tut
jorko tut
simple 2176 0
jorko tut |
Modula e zareden i raboti v kernel space. Mozhem da go premahnem s rmmod.
.:: Device failove
V gorniiat primer suzdadohme modul, koito defakto ne pravi nishto osven da se zaredi v kernel space. Pri zarezhdane na moduli v povecheto sluchai e neobhodimo da izvurshite operatsiia, naprimer initsializatsiia na ustroistvo, danni i t.n. Za tselta sa predostaveni dve funktsii: module_init() i module_exit().
Neka razshirim nashiiat primer:
Primeren kod |
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dimiter Todorov Dimitrov");
MODULE_DESCRIPTION("Simple kernel-space module");
MODULE_SUPPORTED_DEVICE("testdevice");
static int simple_init(void) {
printk("Simple module sayes: Hello!\n");
return 0;
}
static void simple_exit(void) {
printk("Simple module unloaded\n");
}
module_init(simple_init);
module_exit(simple_exit); |
Izpolzvame callback funktsiite predostaveni ot iadroto, za da izpulnim operatsiia pri zarezhdane i premahvane na nashiiat modul. V sluchaia polzvam kernel funktsiiata printk, koiato zapazva sistemni suobshteniia v sistemniiat log. Za da gi vidim mozhem da polzvame dmesg. Po analogichen nachin kakto purviiat put zarezhdam modula i tursia za suobshteniiata v log-a:
Primeren kod |
jorko tut
jorko tut
Simple module sayes: Hello!
jorko tut
jorko tut
Simple module sayes: Hello!
Simple module unloaded
jorko tut |
.::Device failove
Kakto spomenah veche aplikatsiite ot user space komunikirat s modulite v iadroto chrez fail-ove namirashti se v /dev chastta. Za vsiako ustroistvo predostaveno v /dev otgovaria suotveten modul v iadroto. Za da se /naznachi/ daden modul kum daden fail se izpolzvat unikalni chisla (zhelatelno e te da sa unikalni, za da ne se oburkvat modulite, no e vuzmozhno da se dublirat, koeto bi dovelo do nai-razlichni /nepriiatni/ posledstviia). Tezi chisla sa narecheni major numbers, chrez tiah iadroto znae koi modul za koi fail otgovaria.Vsiako ustroistvo ima i minor number, koeto ne igrae rolia pri iadroto, to e neobhodimo na samiiat modul da razlichava svoite ustrostva. Vazhno e da znaem, che tezi ustroistva mogat da sa dva vida: character i block.Glavnata razlikata kakto mozhebi se doseshtate e, che block ustroistvata predavat dannite na otdelni fiksirani v zavisimost ot tipa na ustroistvoto blokove, dokato character ustroistvata niamat fiksiran razmer na predavanite danni. Eto edin primer:
Primeren kod |
jorko tut $ ls -la /dev/hda*
brw-rw---- 1 root disk 3, 0 Feb 18 13:18 /dev/hda
brw-rw---- 1 root disk 3, 1 Feb 18 13:18 /dev/hda1
brw-rw---- 1 root disk 3, 2 Feb 18 13:18 /dev/hda2
brw-rw---- 1 root disk 3, 5 Feb 18 13:18 /dev/hda5
brw-rw---- 1 root disk 3, 6 Feb 18 13:18 /dev/hda6
brw-rw---- 1 root disk 3, 7 Feb 18 13:18 /dev/hda7
brw-rw---- 1 root disk 3, 8 Feb 18 13:18 /dev/hda8 |
Vizhdate tipa na ustroistvoto [color=blue]b[/color]rw-rw----. Kakto i negovite major i minor nomera brw-rw---- 1 root disk [color=red]3[/color], [color=blue]8[/color] Feb 18 13:18 /dev/hda8
Mozhete da zabelezhite ot gorniiat primer, che za tezi ustroistva otgovaria edin modul, tui kato imat edin i sushti major nomer. Suotvetno minor nomerata sa razlichni, za da mozhe modulut da razlichava ustroistvata.
Za da znaem koga protses se opitva da chete ili pishe v dadeno ustroistvo e neobhodimo da polzvame struktura narechena file_operations, definirana v fs.h.
Primeren kod |
struct file_operations {
struct module *owner;
loff_t (*llseek) (struct file *, loff_t, int);
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*aio_fsync) (struct kiocb *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
int (*check_flags)(int);
int (*dir_notify)(struct file *filp, unsigned long arg);
int (*flock) (struct file *, int, struct file_lock *);
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
}; |
Kakto sami zabeliazvate strukturata predostavia dosta ukazateli, kato povecheto ot tiah v sluchaia niama da ni interesuvat, taka che ne se striaskaite. Za tselta mozhem da polzvame GCC razshireniiat nachin za definirane na tazi struktura:
Primeren kod |
struct file_operations fops = {
read: device_read,
write: device_write,
open: device_open,
release: device_release
}; |
ili C99 standarta:
Primeren kod |
struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
}; |
Nedefiniranite chlenove na strukturata shte se definirat avtomatichno ot gcc kato NULL.
V primera, shte izpolzvam komentari direktno, za da e po-razbiraemo:
Primeren kod |
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Dimiter Todorov Dimitrov");
MODULE_DESCRIPTION("Simple kernel-space module");
MODULE_SUPPORTED_DEVICE("testdevice");
static int simple_init(void);
static void simple_exit(void);
static int simple_open(struct inode *inode, struct file *file);
static int simple_release(struct inode *inode, struct file *file);
static ssize_t simple_read(struct file *filp, char *buffer, size_t length, loff_t *offset);
static ssize_t simple_write(struct file *filp, const char *buff, size_t len, loff_t *off);
module_init(simple_init);
module_exit(simple_exit);
struct file_operations fops = {
read: simple_read,
write: simple_write,
open: simple_open,
release: simple_release
};
static int Major;
static int Device_Open = 0;
static char msg[BUF_LEN];
static char *msgPtr;
static int simple_init(void) {
Major = register_chrdev(0, "simple", &fops);
if (Major < 0) {
printk ("Registering the character device failed with %d\n", Major);
return Major;
}
printk("Simple module loaded into kernel space!\n");
printk("Simple module has been assigned to Major number %d\n", Major);
printk("Create device file with: mknod /dev/simple c %d 0\n", Major);
return 0;
}
static void simple_exit(void) {
int ret = unregister_chrdev(Major, "simple");
if (ret < 0)
printk("Error in unregister_chrdev: %d\n", ret);
printk("Simple module unloaded successfuly!\n");
}
static int simple_open(struct inode *inode, struct file *file)
{
static int counter = 0;
if (Device_Open)
return -EBUSY;
Device_Open ++;
sprintf(msg,"You have accessed this device %d times!\n", counter++);
msgPtr = msg;
return 0;
}
static int simple_release(struct inode *inode, struct file *file)
{
Device_Open --;
return 0;
}
static ssize_t simple_read(struct file *filp, char *buffer, size_t length, loff_t *offset)
{
int bytes_read = 0;
if (*msgPtr == 0)
return 0;
while(length && *msgPtr)
{
put_user(*(msgPtr++), buffer++);
length --;
bytes_read ++;
}
return bytes_read;
}
static ssize_t simple_write(struct file *filp, const char *buff, size_t len, loff_t *off)
{
printk( "You don`t wanna write to me :)");
return -EINVAL;
} |
Sled kato zaredim modula shte triabva da suzdadem fail za ustroistvoto v /dev s mknod kato mu zadadem Major number spored tova, kakuv Major number ni e opredelen ot iadroto
Primeren kod |
jorko tut
jorko tut
Create device file with: mknod /dev/simple c 253 0
jorko tut
jorko tut
You have accessed this device 0 times!
jorko tut
You have accessed this device 1 times!
jorko tut
You have accessed this device 2 times!
jorko tut
You have accessed this device 3 times!
jorko tut
jorko tut
Simple module unloaded successfuly
jorko tut |
Veche znaem kak da suzdadem modul i da go asotsirame s user space ustroistvo.
Ostana edinstveno momenta, v koito realno shte komunikirame s harduer...
.:: Operatsii s harduer
Linuks predostavia niakolko funktsii za operatsii s harduera. Predi da se zaredi draivur, podoben na gorniiat toi triabva da /rezervira/ daden IO port za polzvane.Tova se osushtestviava chrez funktsiiata request_region iziskvashta nomer na port, obhvat ako sa poveche ot 1 vhodno-izhoden port i ime na draivura. Predi neia obache, za da se uveri, che niakoi drug modul ne polzva porta draivura triabva da izvika check_region, iziskvashta dva parametura: nomer na port i dulzhina (1 za konkreten port). Sled priklyuchvane na rabota s vunshnoto u-vo Draiuvura triabva da osvobodi port-a za da e vuzmozhno drugi draivuri da rabotiat s nego, za tselta se polzva release_region iziskvashta otnovo sushtite parametri. Za komunikatsiia s ustroistvata se polzvat funktsii ot bibliotekata io.h (asm/io.h). Dvete po-sushtestveni funktsii za pisane i chetene ot port sa: outb i inb
.:: Harduerni prekusvaniia
Za da raboti s harduerni prekusvaniia (IRQ - Interrupt Request), draivurut polzva request_irq i
free_irq. Sushto mozhem da polzvame dve funktsii za vremenno prekratiavane na prekusvaniiata i suotvetno vuzstanoviavaneto im: cli i sti.
.:: DMA
DMA (Direct Memory Access) kanalite polzvat direktno RAM pametta, bez da nalagat prekusvane na protsesornata rabota. Za rabota s DMA se izpolzva bibliotekata asm/dma.h. Ustroistvata polzvashti DMA sa obiknoveno prikrepeni kum dunnata platka.
.:: KonkluzIoneto
Nai-dobriiat nachin da razberete neshto e da razgledate gotov primer i da testvate.
p.s.: Tazi statiia e provokirana ot osnovnoto solo v Sweet child o' mine na Guns 'n' Roses
Referentsii:
http://www.faqs.org/docs/kernel/
http://kernel.org/
Blagodarsko na @Angel ot http://forums.bgdev.org/ za suvetite otnosno kernel/user space grafikata.
Dimitur T. Dimitrov PxL 2007
http://insecurebg.org/
pxl at insecurebg
--EOF
Suzhaliavam ako imam netochnosti,pomagaite da gi opravim.
<< | Programirane grafichen interfeis (GUI) s Lazarus i freepascal >>
|
|
|
|
|
"ii" Ot: NT Na: 22-02-2007@11:31 GMT+2 Otsenka: 1/Neutralen Niamam nishto protiv statiiata i/ili avtora. Ne sum programist, zatova i niama da komentiram materiiata - ne ia razbiram. Ne znam obache koi sa "Funktsii" i "Referentsii" ... zvuchat niakak latinski, no niamat nishto obshto s poniatiiata "Funktsii" i "Referentsii".
Pozdravi !
[Otgovori na tozi komentar]
Kum: "ii" Ot: bash yuzura Na: 23-02-2007@10:16 GMT+2 Otsenka: 1/Neutralenmda, i na men mi napravi vpechatlenie che se spomenava za niakoi si Funktsii, Referentsii, Konfutsii, Klavdii i t.n. pichove.
no tova kato che li e edinstvenata zabelezhka otnosno pravopisa.
inache materialut si zasluzhva cheteneto i e mnogo informativen i pouchitelen. istinski mi 'otvori' ochite po temata i mi dade novi poznaniia za edni interesni za men neshta.
[Otgovori na tozi komentar]
Bravo :) Ot: gat3way Na: 22-02-2007@13:47 GMT+2 Otsenka: 1/NeutralenPozdravleniia za statiiata, mnogo dobra e :)
Za netochnosti v koda ne mislia, po-skoro bih predlozhil dve malki "podobreniia" : purvoto e tam kudeto prehvurliash danni userspace<->kernelspace, mislia che e po-dobre vmesto tsikul, koito prehvurlia po edin bait, sled kato znaesh goleminata na bufera (parametur na callback funktsiiata - size_t length), napravo da prehvurlish navednuzh vsichkoto chrez copy_to_user() / copy_from_user(), koito priemat kato parametur i broiat baitove. Taka neshtata spored men shte se uskoriat osobeno ako prehvurliash golemi obemi danni (napr. draiver za niakakva kamera, ot koiato vzemash izobrazheniia chesto). Drugoto, koeto ne mi dopada mnogo e polzvaneto na printk() bez makrosite za logging level. Povecheto hora polzvat klogd/syslogd i primerno iskat da logvat samo opredeleni suobshteniia ot iadroto, ne vsichki. Ne che tova e goliam problem de..
Inache v sferata na prostotiiata, zachudih se za koda svurzan s otvarianeto na device-a, koito subira v edin fiksiran bufer s golemina 64 baita "you have accessed blabla %d times\n". Dobre si go zamislil, hehe, malko po-dulgo da beshe suobshtenieto i modulut shteshe da e podatliv na DoS (edin userspace shit tsikli otvariane i zatvariane na devnode-a, kato v edin prekrasen moment sled neizvesten broi vreme, osobeno ako mozhe da e na 64-bitova arhitektura, zaradi po-golemiiat int, overflow-vash msg[BUF_LEN] - niamam ideia obache tova do kakuv tochno rezultat bi dovelo, veroiatno shte ima paniki :) ).
Da se vurnem pak na statiiata, otnovo pozdravleniia, naistina biah priiatno iznenadan :)
[Otgovori na tozi komentar]
Kum: Bravo :) Ot: offs3t Na: 23-02-2007@13:44 GMT+2 Otsenka: 1/NeutralenAko vzemem primera na gat3way s kamerata, tozi izklyuchitelno _obobshten_ primer ne bi svurshil nikakva rabota. Lipsvat obichainite praktiki za tozi vid ustroistva:
* pri otvarianeto i zatvarianeto na ustroistvoto ne se izpolvat struct inode *inode, struct file *filp (kakvo stava ako imam poveche ot edno ustroistvo ?)
* cheteneto i zapisa ne sa asinhronni (.aio_read, .aio_write, .lseek)
* niama kmem_cache_t *cache;
* ioctl implementatsiia
* mmap i t.n ...
Mozhe bi avtorut e iskal da zapoznae chitatelia s osnovnite momenti, no kato tsialo sistemnoto programirane si ostava *adski* trudna rabota iziskvashta mnogo vreme opit i poznaniia.
[Otgovori na tozi komentar]
i Ot: hellfire <hellfire7 __@__ gmail[ tochka ]com> Na: 22-02-2007@13:51 GMT+2 Otsenka: 1/NeutralenVsichko e mnogo dobre, samo ne moga da razbera zashto e tolkova moderno v dumi, koito sa v mnozhestveno chislo vmesto i da se pishe i ("Referentsii"). I obratno na mesta, kudeto po printsip triabva da ima i se pishe i.
PS
Po printsip ne se zaiazhdam za pravopisa, obache tozi protses na zameniane na i s i i obratno go nablyudavam ot dosta vreme i tozi put dosta me iznervi.
[Otgovori na tozi komentar]
Kum: i Ot: kpp Na: 22-02-2007@17:06 GMT+2 Otsenka: 1/NeutralenI ne samo "ii". Vizhte tova: "v povecheto sluchai"
To biva negramotnost...
[Otgovori na tozi komentar] Kum: i Ot: plamen Na: 22-02-2007@17:09 GMT+2 Otsenka: 1/NeutralenSushto taka i: "v niakoi sluchai"
Naistina e otvratitelno iznerviashto na kudeto i da se oburnesh da se sbluskvash s takava negramotnost.
[Otgovori na tozi komentar]
Kum: Kum: i Ot: PxL <x00< at >abv< dot >bg> Na: 22-02-2007@18:18 GMT+2 Otsenka: 1/Neutralen Napulno sum suglasen, shte popravia greshkite. CHestno kazano mnogo puti sum se useshtal, che pravia podobni greshki, no po-skoro tova e provokirano ot kontsentratsiiata v nasoka na tehnicheskata chast i zhelanieto da polucha mnenie za neia.
Blagodaria za komentarite do tuk! Naistina sa tsenni i shte se radvam na drugi dopulneniia i mneniia.
[Otgovori na tozi komentar]
udev Ot: growchie <growchie__at__yahoo< dot >com> Na: 22-02-2007@15:01 GMT+2 Otsenka: 1/NeutralenKak stoi polozhenieto s udev i suzdavaneto na ustroistva. mknod do kolkoto si spomniam se polzvashe pri statichni /dev direktorii.
[Otgovori na tozi komentar] Niakoi idei Ot: integer <coroot__at__gmail__dot__com> Na: 22-02-2007@15:02 GMT+2 Otsenka: 1/NeutralenIzvurshvaneto na failovi operatsii vuv kernelspace e opasno i mozhe da dovede nestabilnost na sistemata. Mozhe bi e dobra ideia da se izpolzva Virtual Filesystem layer. Ima dosta generic object types, koito mogat da se izpolzvat.
1. file - include/linux/fs.h
2. inode - include/linux/fs.h
3. dentry - include/linux/dcache.h
4. superblock - include/linux/fs.h
[Otgovori na tozi komentar]
Kum: Niakoi idei Ot: gat3way Na: 22-02-2007@15:29 GMT+2 Otsenka: 1/NeutralenTova ne sa "failovi operatsii", chovekut prosto si registrira character device i si definira callback funktsiite za komunikatsiia s nego. Samiiat "fail" si go suzdava potrebitelia s mknod. Qdroto ne suzdava nikakvi failove v sluchaia. Dori ne bi triabvalo da ima problemi svurzani s konkurentnost, tui kato niama variant 2 ili poveche protsesa ednovremenno da komunikirat s char device-a. Kodut si e absolyutno bezopasen spored men, a i tova e nachina, po koito rabotiat vsichki ostanali character devices - v tova chislo draiveri za terminali, sound karti, mishki, dummy draiveri kato /dev/random ili /dev/zero i t.n.
V edin po-spetsialen sluchai, iadroto defakto "suzdava" failove v procfs ili sysfs, koeto sushto e chesto izpolzvano iavlenie i niama nishto strashno i opasno :)
[Otgovori na tozi komentar]
bravo Ot: adelin Na: 22-02-2007@16:49 GMT+2 Otsenka: 1/Neutralensia moe li napishesh kernel modul za avtomatichno indeksirane na failove v direktoriia;)
ta oshte s metkaneto im da se otraziava razlikata:)
[Otgovori na tozi komentar]
rlocate Ot: BlackByte <bbyte __@__ mail< dot >bg> Na: 23-02-2007@7:51 GMT+2 Otsenka: 1/Neutraleneto ti neshto koeto pravi tova ... ama ne sum go testval :)
http://sourceforge.net/projects/rlocate/
[Otgovori na tozi komentar]
/off Ot: Vladsun <vsmin (a) mail __tochka__ bg> Na: 22-02-2007@20:32 GMT+2 Otsenka: 1/NeutralenHm, PxL ne te biah vizhdal tuk do sega - dobre doshul ot men! :)
Komentarut mi e malko offtopik - mislia, che shte si polezen i na oshte edno miasto v tozi sait:
http://openfmi.net/plugins/scmsvn/cgi-b...
Pozdravi!
Redaktiran na: 22-02-2007@20:32
[Otgovori na tozi komentar]
Kum: /off Ot: PxL <x00__at__abv__dot__bg> Na: 5-03-2007@14:42 GMT+2 Otsenka: 1/NeutralenZdrasti,
shte se radvam da pomogna, dazhe v momenta vizhdam edin maluk XSS propusk :)
[Otgovori na tozi komentar]
Kum: Kum: /off Ot: Vladsun <vsmin< at >mail[ tochka ]bg> Na: 21-03-2007@13:11 GMT+2 Otsenka: 1/Neutralen:) Znaeh si, che shte namerish neshto! ;)
E, vse pak dai da vidim kakvo e - kachi pach ili pusni edno pisumtse do administratora.
[Otgovori na tozi komentar]
Ima nuzhda ot takiva statii Ot: ivo Na: 23-02-2007@0:45 GMT+2 Otsenka: 1/NeutralenPohvalno e /i dosta smelo/ da se pishat
statii za Linuks iadroto.Deistvitelno ima
dosta informatsiia v Internet, no v ogromnata
si chast,tia ne e aktualna i e na praktika
bezpolezna.Za süzhalenie ,horata koito pishat
iadroto ,niamat vreme za dokumentatsiiata.A
tova koeto e "chetlivo" za Linuks i
kompaniia ,ne e dostatüchno za nas ...
"Zaravial" süm se na niakolko püti v koda , i
ako neznaeh ot kogo e pisano ,shtiah da kazha:
ili lud ili genii e pisal tova!
Absolyutno opasni i hazartni tehniki / i
krasivi / v ogromen proekt , vgradeniia
asembler , makrosite ... , iavno vsichko tova
e tsenata na spechelenata mikrosekunda.
Kazvam vsichko tova ,za da podkrepia avtora:
ima nuzhda da se poblikuvat statii ot tozi
rod.
kato preporüka bih kazal : da se zahvashtame
po iasno i podrobno izlozhenie na po malki
chasti ot kernela.V slucheia smiatam pürvata
chast za dobra : strukturata na modula
i t.n.A vtorata mi se vizhda izlishna.Zashtoto
razshiriava temata .Bi bilo polezno /spored
men ,niamam pretentsii da süm prav / da se
obiasni kak i küde se zarezhdat modulite
kakvi prdimtstva i nedostatütsi imat i t.n.
A v druga statiia da se prodülzhi.No molia ,ne
premaite tova za kritika.
Drugo ,koeto smiatam che zasiaga vseki ot
nas , tova sa opisanie na modulite v
iadroto.Helpa e kraino nedostatüchen,vseki
koito kompilira iadra , ima nuzhda da napravi
po-podrobna spravka za niakoi modul: Mozhe li
bez nego ,kak se otraziava na tsialoto
iadro ,koe go zabavia i t.n.
I vsichkite tezi statii bi bilo dobrea da sa
napisani v kratük ,iasen spravochen kontekst.
Izcherpatelno po vüprosa ,nai-vazhnoto i
neobhodimoto.Za da sa polezni.
[Otgovori na tozi komentar] Abe nie bulgari li sme ili lukovi glavi !! Ot: Ivan Kostov <ikostov (a) gmail __tochka__ com> Na: 23-02-2007@9:00 GMT+2 Otsenka: 1/NeutralenZdraveite,
suzhaliavam, che taka ni v klin ni v rukav pisha, no za poreden put mi pravi vpechatlenie, tova che tuk uporito se pishe na shlyukavitsa. Se se nadiavah, che vidnite umove na informatikata, koito se subirat tuk, mogat da pishat shto gode gramotno. Ako ima niakakuv problem s kirilitsata, kazhete da pomagame ... sramota takuv hubav sait da si ide zaradi edna kirilitsa ...
[Otgovori na tozi komentar]
Kum: Abe nie bulgari li sme ili lukovi gla Ot: Mircho Mirev <mircho __@__ linux-bg[ tochka ]org> Na: 23-02-2007@10:04 GMT+2 Otsenka: 1/NeutralenSaita zaradi tova niama da si otide. Obache mislia, che toi dava iasen primer, za tova, kakvo se opitvame da pravim - niakoi znae kak se pravi neshto i polaga usiliia da go pokazhe na drugite. Komentarite, ot koito obiknoveno ima polza, sa tezi, koito dopulvat i podkrepiat. "Nie bulgarite" ne vurshi obiknoveno rabota.
[Otgovori na tozi komentar] Kum: Abe nie bulgari li sme ili lukovi gla Ot: PxL <x00 __@__ abv__dot__bg> Na: 23-02-2007@10:21 GMT+2 Otsenka: 1/Neutralen Zdravei,
do kolkoto vizhdam niama komentari na /shlyukavitsa/. Suzhaliavam ako ne sum te razbral, niamam za tsel da te obidia, no mozhe bi problema e ot vuzmozhnostta na sait-a da konvertira kiriliskite simvoli. Gore ima menyu, ot kudeto mozhesh da vidish vsichko normalno.
Pozdravi
[Otgovori na tozi komentar]
Kum: Kum: Abe nie bulgari li sme ili lukov Ot: gat3way Na: 23-02-2007@10:34 GMT+2 Otsenka: 1/NeutralenTaka kato gledam ot 17 komentara uzh po temata, 8 komentirat edinstveno problemi s pravopisni greshki ili subektivnite vizhdaniia za pravilno formatirani postove.
Spored men sme lukovi glavi, tochno zashtoto sme bulgari :)
[Otgovori na tozi komentar] Kum: Kum: Kum: Abe nie bulgari li sme ili Ot: Ivan Kostov <ikostov__at__gmail[ tochka ]com> Na: 24-02-2007@12:51 GMT+2 Otsenka: 1/NeutralenSuzhaliavam ako ste me razbrali pogreshno. Radvam se mnogo na takiva hora, koito otdeliat vreme za da opishat iasno i edna sravnitelno nepoznata materiia, kato naprimer pisanto na draiveri za iadroto. Iskam izrichno da blagodaria na avtoria i. Prosto iskah da kazha, che mi beshe trudno da ia procheta zaradi "shlüokavitsata".
[Otgovori na tozi komentar]
Dobre e no mozhe i oshte po-dobre! Ot: BatSerzho Na: 19-03-2007@8:04 GMT+2 Otsenka: 2/Gradivna kritika
Niama da zapochvam vednaga s "gradivnata kritika" i stanaloto naposleduk dosta populiarno "stimulirashto ne" :-) Statiikata e gotina i bih se radval da vizhdam poveche takiva. Vsushtnost ot dosta vreme si mislia da napravia neshto podobno, kato razkazha s kakvi peripetii i stranichni "ekstri" s sum se sbluskval dokato sum ruchkal modulcheta za iadroto.
Ta taka sled kratkiia uvod sledva kritikata. Stimulirashtoto NE otiva za picha tvurdiasht, che koda bil mega siguren i otkazo-ustoichiv. Kakto i za picha koito se hvana za statichniia bufer koito v sluchaia si e bial kahur v sravnenie s kovarnite i ne tolkova ochevidni sustezatelni usloviitsa prisustvashti v primera.
Sega tuk e miastoto da utochnia che za primerna statiika nivoto e ne prosto zadovolitelno a napravo ZADOVOLQVASHTO! Problema za koito govoria (suztezatelni usloviia - race conditions) lezhi ei v tez niakolko reda.
if (Device_Open)
return -EBUSY;
Device_Open ++;
Ako koda se izpolzva sus stari iadra vurhu ednoprotsesorna bavna sistema problem nikakuv! Vsichko shte si vurvi ok. No vurhu iadra > 2.6 i po-burzi mashini tuk opredeleno mozhe da stane MAZALO. Iskam da popitam picha pisal tazi statiia: Zashto be, zashto ne si polzval mutex a? Zashto sa napraili horata mutex-i ako niama da se polzvat. Tui kato > 2.6 iadrata sa napulno preemtivni (kakvoto i da znachi tova za horata koito ne znaiat) to e napulno vuzmozhno edin protses da reshi da si otvori tova ustoistvo, togava vliza vuv funktsiikata simple_open i stiga da rechem do reda Device_Open ++; i neka tochno togava protsesut bude prekusnat kato drug poluchi protsesornoto vreme. Sega neka vtoriia protses se opita da otvori ustroistvoto. Tui kato purviia e bil prekusnat predi da uvelichi Device_Open to vtoriia shte uspee. Pri vrushtane na upravlenieto na vtoriia protses toi sushto veche e uspial i taka KE si imame 2 protsesa koito sa otvorili ustroistvoto. Fusss a takaaaa. Za horata koito ne stopliat za kakvo stava vupros da prochetat shto e to pulna preemtivnost + kakvo e big kernel lock. Niakoi mozhe da si pomisliat sega che se zaiazhdam, no ia se zamislete za niakoi "darovit" programist koito za takiva neshta vuobshte ne misli i shefa mu e kazal da napravi edi si kvo modulche za linuks iadroto. Efekta v edin moment shte bude placheven i horata kato men deto sa se parili sega kashichka duhat, shtoto niama nishto po stranno ot "zabila" linuks mashina koiato obache produlzhava da si rutira.
Ta taka tova sa mi preporukite za razshiriavane na statiiata. Da se vmuknat mutex-i da se pokazhe rabota s listcheta v iadtoto ( ima pone 3 predefinirani api-ta za tova ). Zashtoto si e seriozen problem i neopitnite programisti lesno biha se predali pred bug ot takava velichina.
[Otgovori na tozi komentar]
Kum: Dobre e no mozhe i oshte po-dobre! Ot: gat3way Na: 26-03-2007@10:21 GMT+2 Otsenka: 1/NeutralenMislia, che tova e malko presileno vse pak. V obshtiia sluchai veroiatnostta tova da se sluchi e niska, osven pri polozhenie che niamash mnogo protsesi, koito se biiat da otvariat device-a. Ako "upotrebata" se svezhda kakto gore v statiiata, v niakolko cat-vaniia na device-a, to togava, shansut da nastupish takava motika, kloni kum 0.
I posle, pone v tozi sluchai ne mislia, che shte se sluchi neshto fatalno, dori purviiat protses da se preempt-ne i vtoriiat da se schedule-ne tochno togava, taka che i dvata protsesa da "durzhat" ustroistvoto otvoreno. Taka kakto go vizhdam:
1) neka ediniiat protses "zatvori" device-a,a vtoriiat chete ottam - mislia, che shte mu se vurne EINVAL, EIO ili neshto ot sorta, ne viarvam che tova shte "paniküosa" iadroto.
2) Neka ediniiat go izchete, preempt-ne se predi da go "zatvori" i vtoriiat reshi da chete - msgptr ne se nulira ili promenia, taka che niama da ima drami s dostupvane na NULL pointer-i, suotvetno krash-vanki na iadroto.
3) dva protsesa sa "otvorili" ustroistvoto, ediniiat go zatvaria i dokato vtoriiat se mota, treti protses se opita da go otvori - Device_Open shte ima stoinost 1, taka che niama da uspee. Ne e mnogo iasno obache dali vtoriiat protses, kato se opita da go "zatvori", dali shte stigne dotam che da se namali Device_Open otnovo na 0 ili direktno niama da mu se vurne niakakva greshka bez vuobshte da se izpulni release funktsiiata, koiato e definirana. V takuv sluchai mai nai-dobre e pri release-vane na ustroistvoto, onzi broiach da se set-va na 0, a ne da se namalia s edinitsa.
V kraina smetka, mislia che v nai-loshiiat sluchai ustroistvoto shte stane nedostupno za otvariane i chetene, pone dokato modulut ne se rmmod/insmod-ne nanovo. Ne mislia, pone v konkretniia sluchai, che e vuzmozhno po niakakuv nachin da se krash-ne iadroto poradi concurrency drami.
Pone taka si go predstaviam de, mozhe i da gresha. Ti kak mislish?
[Otgovori na tozi komentar]
|
|
|
|
|
|
|
|