SORU
15 Ocak 2009, PERŞEMBE


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
19 Mart 2013, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AlaskanGrizzly

    AlaskanGrizz

    30 EKİM 2009
  • BurnedInDotCom

    BurnedInDotC

    3 NİSAN 2010
  • Munchkin the Teddy Bear

    Munchkin the

    30 EYLÜL 2011