Bir şekilde Linux çekirdek modülü kullanarak ne olduğunu anlamaya var mı?
Ben bir çekirdek modülü yüklemek ve lsmod
yüklü modülleri listeler "modülü (modülü için bir başvuru ile diğer modülleri sayısı). kullanım sayısı bulabilirim Bir çıkış yolu bulmaktırnebir modülü kullanarak, değil mi?
Konu geliştiriyorum modülü kullanımı rmmod
ama onun kaldırmak için kullanamazsınız, 1 ve böylece "tarafından" sütunu boş. Kont konusunda ısrar ediyor. Bu demek oluyor ki her zaman istediğim için yeniden derleyin ve yeniden yükleme modülü, ben makineyi yeniden başlatın (veya, en azından, çözemedim başka bir yolu boşaltın.
CEVAP
Aslında, orada öyle bir liste süreçleri iddia modülü/sürücü - ancak, izlemedim reklamı (dışında Linux çekirdeği belgeleri), yani zerre notlarımı burada:
Öncelikle, çok teşekkürler @haggai_e'In cevabı; işaretçi fonksiyonları try_module_get
try_module_put
olarak sorumlu olanlar için genel kullanım sayısı (refcount) anahtarı olan izni bana izini prosedürü.
Görünümlü daha fazla bilgi için bu çevrimiçi, ben bir şekilde sendeledi post Linux-Kernel Archive: [PATCH 1/2] tracing: Reduce overhead of module tracepoints; sonunda sivri bir tesis mevcut çekirdeği, bilindiği gibi (sanırım) "izleme"; belgelerine bu dizin Documentation/trace - Linux kernel source tree. Özellikle, iki dosya izleme olanağı, events.txt ve ftrace.txt açıklar.
Ama, orada da kısa bir "izleme mini-nasıl YAPILIR" üzerinde çalışan bir Linux sistemi /sys/kernel/debug/tracing/README
(I'm really really tired of people saying that there's no documentation…); not: bu kernel kaynak ağacını, bu dosya aslında tarafından oluşturulan dosya kernel/trace/trace.c. Yaptığım test bu Ubuntu natty
ve unutmayın bu yana /sys
ait kök, kullanmanızı sudo
okuma bu dosya, sudo cat
ya
sudo less /sys/kernel/debug/tracing/README
... ve burada açıklanacak olan /sys
altında hemen hemen tüm diğer işlemler için de geçerli.
Öncelikle, burada basit bir minimal modülü/sürücü kod (ki ben araya gelen sevk kaynakları), hangi sadece oluşturur /proc/testmod-sample
dosya düğümü döndüren, dize "Bu testmod." ne zaman bu olmak, okumak; butestmod.c
:
/*
https://github.com/spotify/linux/blob/master/samples/tracepoints/tracepoint-sample.c
https://www.linux.com/learn/linux-training/37985-the-kernel-newbie-corner-kernel-debugging-using-proc-qsequenceq-files-part-1
*/
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h> // for sequence files
struct proc_dir_entry *pentry_sample;
char *defaultOutput = "This is testmod.";
static int my_show(struct seq_file *m, void *v)
{
seq_printf(m, "%s\n", defaultOutput);
return 0;
}
static int my_open(struct inode *inode, struct file *file)
{
return single_open(file, my_show, NULL);
}
static const struct file_operations mark_ops = {
.owner = THIS_MODULE,
.open = my_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int __init sample_init(void)
{
printk(KERN_ALERT "sample init\n");
pentry_sample = proc_create(
"testmod-sample", 0444, NULL, &mark_ops);
if (!pentry_sample)
return -EPERM;
return 0;
}
static void __exit sample_exit(void)
{
printk(KERN_ALERT "sample exit\n");
remove_proc_entry("testmod-sample", NULL);
}
module_init(sample_init);
module_exit(sample_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mathieu Desnoyers et al.");
MODULE_DESCRIPTION("based on Tracepoint sample");
Bu modül aşağıdaki ile inşa edilebilirMakefile
(sadece* *32, ve aynı dizinde make
çalıştırın) ile aynı dizinde yer var:
CONFIG_MODULE_FORCE_UNLOAD=y
# for oprofile
DEBUG_INFO=y
EXTRA_CFLAGS=-g -O0
obj-m = testmod.o
# mind the tab characters needed at start here:
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Bu modül/sürücü oluşturulduğunda, çıktı, çekirdek nesne dosyası testmod.ko
.
Bu noktada, olay try_module_get
ilgili izleme ve try_module_put
; /sys/kernel/debug/tracing/events/module
içinde hazırlayabiliriz:
$ sudo ls /sys/kernel/debug/tracing/events/module
enable filter module_free module_get module_load module_put module_request
Benim sistemde, izleme varsayılan olarak etkin olduğunu unutmayın:
$ sudo cat /sys/kernel/debug/tracing/tracing_enabled
1
... ancak, modül izleme (özel):
$ sudo cat /sys/kernel/debug/tracing/events/module/enable
0
Şimdi, ilk testmod
Bu modül, ** 42 ** 43 vb olaylar, ama sadece tepki olacak bir filtre, yapmalıyız. Bunu yapmak için, ilk olayın biçimini kontrol etmeliyiz:
$ sudo cat /sys/kernel/debug/tracing/events/module/module_put/format
name: module_put
ID: 312
format:
...
field:__data_loc char[] name; offset:20; size:4; signed:1;
print fmt: "%s call_site=%pf refcnt=%d", __get_str(name), (void *)REC->ip, REC->refcnt
Burada bir alan karşı filtre hangi sürücü adı, tutan name
yok olduğunu görüyoruz. Bir filtre oluşturmak için, biz sadece 47* *ilgili dosyaya filtre dizesi:
sudo bash -c "echo name == testmod > /sys/kernel/debug/tracing/events/module/filter"
Burada, ilk sudo
dediğimiz beri tartışma sudo
-ed bash
komut echo
tüm yönlendirme sarmak zorundayız unutmayın. İkinci olarak, unutmayın bu yana yazdığımız için "ebeveyn" module/filter
, belirli olayları (hangi module/module_put/filter
vb), Bu filtre uygulanabilir tüm olaylar listelenmiş olarak "çocuklar" module
dizin.
Son olarak, biz modülü için izlemeyi etkinleştir:
sudo bash -c "echo 1 > /sys/kernel/debug/tracing/events/module/enable"
Bu noktadan izleme günlük dosyası; benim için, engelleme, okuma okuyabiliriz "izleme dosyası sürümü - bu gibi çalıştı: . "borulu
sudo cat /sys/kernel/debug/tracing/trace_pipe | tee tracelog.txt
Bu noktada, biz bir şey görüyor günlük yani, o zaman yük (ve kullanmak ve kaldırmak) sürücüsü (farklı bir terminal nereden trace_pipe
olarak okunur):
$ sudo insmod ./testmod.ko
$ cat /proc/testmod-sample
This is testmod.
$ sudo rmmod testmod
Eğer trace_pipe
okunan bulunduğu terminale geri gidersek, bir şeyler anlamaya çalışmalıyız:
# tracer: nop
#
# TASK-PID CPU# TIMESTAMP FUNCTION
# | | | | |
insmod-21137 [001] 28038.101509: module_load: testmod
insmod-21137 [001] 28038.103904: module_put: testmod call_site=sys_init_module refcnt=2
rmmod-21354 [000] 28080.244448: module_free: testmod
Yani hemen hemen tüm biz almak için bizim testmod
sürücü - refcount değişiklikler sadece sürücü yüklü (insmod
) veya yüksüz (rmmod
), ne zaman yaptığımız bir okuyun cat
. Sadece trace_pipe
okuma ile kesmeCTRLCterminal; ve izleme tamamen durdurmak için:
sudo bash -c "echo 0 > /sys/kernel/debug/tracing/tracing_enabled"
Burada, en örnekler trace_pipe
yerine dosya /sys/kernel/debug/tracing/trace
okuma için buraya bakın unutmayın. Ancak, bir sorun olduğunu, bu dosyanın olmaması gerek "borulu" (yani olmamalı run tail -f
bu trace
dosya); ama bunun yerine re-read trace
sonra her operasyon. Sonra ilk insmod
, biz elde aynı çıkış cat
-ing hem trace
trace_pipe
; ancak, sonra rmmod
okuma trace
dosya verecekti:
<...>-21137 [001] 28038.101509: module_load: testmod
<...>-21137 [001] 28038.103904: module_put: testmod call_site=sys_init_module refcnt=2
rmmod-21354 [000] 28080.244448: module_free: testmod
... : bu noktada, insmod
vardı zaten çıkıldığı için uzun, ve bu yüzden böyle bir yer yok artık işlem listesi - ve bu nedenle bulunamıyor üzerinden kayıtlı işlem KİMLİĞİ (PID) - böylece biz boş <...>
olarak işlem adı. Bu nedenle, daha iyi (tee
) bu durumda trace_pipe
çalışan bir çıktı günlük. Ayrıca,/reset net/trace
dosyayı silmek için, sadece bir 0 yazar unutmayın:
sudo bash -c "echo 0 > /sys/kernel/debug/tracing/trace"
Eğer bu mantığa aykırı gibi görünüyorsa, trace
özel bir dosya olduğundan, ve her zaman sıfır zaten dosya boyutuna sahip olacak not:
$ sudo ls -la /sys/kernel/debug/tracing/trace
-rw-r--r-- 1 root root 0 2013-03-19 06:39 /sys/kernel/debug/tracing/trace
... bile "eğer" ile doldu.
Son olarak, eğer bir filtre uygulamak etmedik bile, bir günlük elde ederdik unutmayıntümmodül o binfmt_misc
module grep
ve bu gibi herhangi bir çağrı (arka plan) günlük, hangi çalışan sistem çağrıları:
...
tr-6232 [001] 25149.815373: module_put: binfmt_misc call_site=search_binary_handler refcnt=133194
..
grep-6231 [001] 25149.816923: module_put: binfmt_misc call_site=search_binary_handler refcnt=133196
..
cut-6233 [000] 25149.817842: module_put: binfmt_misc call_site=search_binary_handler refcnt=129669
..
sudo-6234 [001] 25150.289519: module_put: binfmt_misc call_site=search_binary_handler refcnt=133198
..
tail-6235 [000] 25150.316002: module_put: binfmt_misc call_site=search_binary_handler refcnt=129671
... üstten biraz (günlük veri miktar ve işlem hem zaman, bunu oluşturmak için gerekli) ekler.
Bu Yukarı bakarken, üzerine bir aracı ifade eder Debugging Linux Kernel by Ftrace PDF, tökezledim hemen hemen - ama daha kolay bir komut satırı yukarıdaki gibi benzer arabirim yok trace-cmd,. Ayrıca bir "ön uç trace-cmd
KernelShark; bunların her ikisi de Debian ifade için" GUİ sudo apt-get install trace-cmd kernelshark
) Ubuntu depoları/. okuyucu Bu araçlar yukarıda açıklanan yordamı için bir alternatif olabilir.
Son olarak, ben sadece unutmayın, esnasında yukarıda testmod
örnek değil gerçekten Haritayı kullanın bağlamda birden çok iddia var kullanılan aynı izleme prosedürü keşfetmek için bir USB modülü ben kodlama, defalarca talep edildiği pulseaudio
olarak USB cihaz takılı - prosedür gibi çalışmak için bu gibi durumlarda kullanmak için.
Nasıl okuma/yazma Linux çekirdek modül...
Nasıl bir e-posta eki Linux Komut satı...
Nasıl güvenilir bir şekilde Mac OS X, ...
Neden Linux monolitik çekirdek denir?...
Nasıl geçerli tarih datetime Python mo...