cari
RumahTutorial sistemLINUXFungsi output nyahpepijat dalam kernel Linux: penjelasan terperinci tentang printk

Fungsi output nyahpepijat dalam kernel Linux: penjelasan terperinci tentang printk

Feb 14, 2024 pm 08:33 PM
linuxtutorial linuxsistem linuxarahan linuxskrip shellembeddedlinuxBermula dengan linuxpembelajaran linux

printk ialah salah satu fungsi penyahpepijatan yang paling biasa digunakan dalam kernel Linux Ia digunakan untuk mengeluarkan maklumat penyahpepijatan kepada penimbal atau konsol kernel, seperti nilai pembolehubah, aliran pelaksanaan fungsi, punca ralat, dsb. Kelebihan printk ialah ia mudah dan mudah digunakan serta tidak memerlukan peralatan atau pemandu tambahan. Pelaksanaan printk melibatkan konsep seperti penampan kernel, tahap log, dan rentetan berformat. Dalam artikel ini, kami akan memperkenalkan prinsip dan kaedah printk, teknologi penyahpepijatan kernel Linux, dan menggambarkan penggunaan dan langkah berjaga-jaganya dengan contoh.

Fungsi output nyahpepijat dalam kernel Linux: penjelasan terperinci tentang printk

1. Pengenalan (berdasarkan s3c2440 linux)

Antara teknologi penyahpepijatan kernel, yang paling mudah ialah penggunaan printk Penggunaannya adalah serupa dengan penggunaan printf dalam aplikasi bahasa C Dalam aplikasi, ia bergantung pada perpustakaan dalam stdio.h, manakala dalam kernel Linux Ada tiada perpustakaan sedemikian, jadi dalam kernel Linux, menggunakan printk ini memerlukan pemahaman tertentu tentang pelaksanaan kernel.

Perbezaan antara printf dan printk: printk akan menambah aksara gaya "" pada permulaan Julat N ialah 0~7, menunjukkan tahap maklumat ini.

Apabila n dalam printk(""......);

Mulakan tahap console_loglevel kepada 7 dalam fail kernel Printk.c (kernel).

/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG
 */int console_printk[4] = {
    DEFAULT_CONSOLE_LOGLEVEL,    /* console_loglevel */
    DEFAULT_MESSAGE_LOGLEVEL,    /* default_message_loglevel */
    MINIMUM_CONSOLE_LOGLEVEL,    /* minimum_console_loglevel */
    DEFAULT_CONSOLE_LOGLEVEL,    /* default_console_loglevel */
};

2 Semak konfigurasi tahap melalui arahan cat /proc/sys/kernel/printk:

# kucing /proc/sys/kernel/printk
7 4 1 7

7 4 1 7 antaranya sepadan dengan: console_loglevel, default_message_loglevel, minimum_console_loglevel, default_console_loglevel

3. Ubah suai konfigurasi tahap:

#echo “1 4 1 7”>/proc/sys/kernel/printk Tukar empat nilai ini Apabila console_loglevel ditetapkan kepada 1, semua maklumat penyahpepijatan akan dicetak.

4. Nama dan penggunaan rekod fungsi printk

Dalam fail kernel: Kernel.h (includelinux), 8 peringkat nama dari 0 hingga 7 ditakrifkan

#define   KERN_EMERG   ""    /* system is unusable */
#define    KERN_ALERT    ""  
  /* action must be taken immediately */
#define    KERN_CRIT     ""    /* critical
 conditions */
#define    KERN_ERR      ""    /* error conditions */
#define   
 KERN_WARNING  ""    /* warning conditions */
#define    KERN_NOTICE   ""  
  /* normal but significant condition*/
#define    KERN_INFO     ""   
 /* informational*/
#define    KERN_DEBUG    ""    /* debug-level messages 
*/
#define console_loglevel      (console_printk[0])
#define 
default_message_loglevel (console_printk[1])
#define minimum_console_loglevel 
(console_printk[2])
#define default_console_loglevel (console_printk[3])

Gunakan printk:

① printk(KERN_WARNING"there is a warning here!\n");//注意,中间没有逗号间隔。

② printk(KERN_DEBUG"%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);

Dalam ① dan ②, kita perlu melihat data dalam buffer log_buf untuk melihat maklumat yang dicetak. Perlu menggunakan arahan #dmesg

#``# dmesg``Linux version 2.6.22.6 (book@book-desktop) (gcc version 3.4.5) #19 Thu
 Dec 8 14:06:03 CST 2016``CPU: ARM920T
 [41129200] revision 0 (ARMv4T), cr=c0007177``Machine: SMDK2440``Memory policy: 
ECC disabled, Data cache writeback``On node 0 totalpages: 16384`` ``DMA zone: 128 
pages used ``for` `memmap`` ``DMA zone: 0 pages reserved`` ``DMA zone: 16256 pages,
 LIFO batch:3`` ``Normal zone: 0 pages used ``for` `memmap``CPU S3C2440A (id 0x32440001)................................

Anda juga boleh menggunakan cat /proc/kmsg& untuk berjalan di latar belakang dan mencetak maklumat penyahpepijatan dalam masa nyata. Dalam ②, __FILE__, FUNCTION dan __LINE__ masing-masing sepadan dengan fail itu, fungsi itu dan baris mana. Sangat praktikal.

# cat /proc/kmsg&``# ./firstdrvtest on``/work/LinuxDrives/20.printk_debug/first_drv.c
 first_drv_open 23``/work/LinuxDrives/20.printk_debug/first_drv.c first_drv_open 25``
/work/LinuxDrives/20.printk_debug/first_drv.c first_drv_open 27``# ./firstdrvtest off`
`/work/LinuxDrives/20.printk_debug/first_drv.c first_drv_open 23``/work/LinuxDrives/
20.printk_debug/first_drv.c first_drv_open 25``/work/LinuxDrives/20.printk_debug
/first_drv.c first_drv_open 27

5. Hubungan antara port bersiri dan fungsi printk:

printk
    vprintk
        vscnprintf //先把输出信息放入临时BUFFER
                // Copy the output into log_buf.
                // 把临时BUFFER里的数据稍作处理,再写入log_buf
                // 比如printk("abc")会得到"abc", 再写入log_buf
                // 可以用dmesg命令把log_buf里的数据打印出来重现内核的输出信息

        // 调用硬件的write函数输出
        release_console_sem    
            call_console_drivers
          //从log_buf得到数据,算出打印级别
                _call_console_drivers
                    if ((msg_log_level write //con是console_drivers链表中的项,对用具体的输出函

数 在drives/serial/s3c2410.c中查看

在该函数中注册一个console结构体
static void s3c24xx_serial_console_write(struct console *co, const char *s,
unsigned int count)
{
uart_console_write(cons_uart, s, count, s3c24xx_serial_console_putchar);
}

Fungsi output port bersiri akan memanggil fungsi s3c24xx_serial_console_putchar

static int s3c24xx_serial_initconsole(void)
{
    ...........................
    register_console(&s3c24xx_serial_console);
    return 0;
}
static struct console s3c24xx_serial_console =
{
.name = S3C24XX_SERIAL_NAME,//这个宏被定义为:TTYSAC
.device = uart_console_device, //init进程,用户程序打开/dev/console的时候会调用
.flags = CON_PRINTBUFFER,//打印还没有初始化化console前保存在log_buf里面的数据
.index = -1,//选择那个串口,由uboot中的命令决定
.write = s3c24xx_serial_console_write,//控制台输出函数
.setup = s3c24xx_serial_console_setup //串口设置函数
}; 

Fungsi ini berkaitan dengan perkakasan Ia membaca daftar untuk melihat sama ada data telah dihantar

static void s3c24xx_serial_console_putchar(struct uart_port *port, int ch)

{
unsigned int ufcon = rd_regl(cons_uart, S3C2410_UFCON);
while (!s3c24xx_serial_console_txrdy(port, ufcon))
barrier();
wr_regb(cons_uart, S3C2410_UTXH, ch);
}

konsol uboot=ttySAC0, jika ia dikenali sebagai port bersiri 0 dalam Linux, terdapat kod berikut dalam /kernel/printk.c,

__setup("console=", console_setup);

static int __init console_setup(char *str)
{
........
  add_preferred_console(name, idx, options);
} 

Apabila kernel mula melaksanakan, apabila parameter baris arahan "console=..." ditemui, fungsi console_setup akan dipanggil untuk analisis data Untuk parameter baris arahan "console=ttySAC0", ia akan dihuraikan: the nama peranti (nama) ialah ttySAC, Indeks indeks ialah 0, dan maklumat ini disimpan dalam tatasusunan global jenis console_cmdline dan nama console_cmdline (nota: nama tatasusunan dan jenis tatasusunan adalah sama)

Dalam register_console(&s3c24xx_serial_console) berikut, struktur s3c24xx_serial_console akan dibandingkan dengan peranti dalam tatasusunan console_cmdline.

①Nama yang dihuraikan ialah S3C24XX_SERIAL_NAME, iaitu "ttySAC", dan nama dalam arahan dalam console_cmdline juga ialah "ttySAC"

②Indeks indeks dalam struktur s3c24xx_serial_console ialah -1, yang bermaksud menggunakan indeks dalam parameter baris arahan "console=ttySAC0", indeks = 0

Melalui artikel ini, kami telah mempelajari tentang prinsip dan kaedah printk, teknologi penyahpepijatan kernel Linux, yang boleh digunakan untuk menyahpepijat dan mengeluarkan kernel. Kita harus memilih kaedah yang sesuai berdasarkan keperluan sebenar dan mengikuti beberapa prinsip asas, seperti menggunakan tahap log yang betul, menggunakan rentetan format yang betul, menggunakan fungsi output yang betul, dsb. Printk ialah salah satu fungsi penyahpepijatan yang paling mudah dan berkesan dalam kernel Linux Ia boleh merealisasikan maklum balas dan pemantauan kernel, dan juga boleh meningkatkan kebolehselenggaraan dan kebolehskalaan kernel. Saya harap artikel ini dapat membantu dan memberi inspirasi kepada anda.

Atas ialah kandungan terperinci Fungsi output nyahpepijat dalam kernel Linux: penjelasan terperinci tentang printk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:良许Linux教程网. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Apakah gaji Pentadbir Linux?Apakah gaji Pentadbir Linux?Apr 17, 2025 am 12:24 AM

Purata gaji tahunan pentadbir Linux ialah $ 75,000 hingga $ 95,000 di Amerika Syarikat dan € 40,000 hingga € 60,000 di Eropah. Untuk meningkatkan gaji, anda boleh: 1. Secara berterusan mempelajari teknologi baru, seperti pengkomputeran awan dan teknologi kontena; 2. Mengumpulkan pengalaman projek dan menubuhkan portfolio; 3. Mewujudkan rangkaian profesional dan mengembangkan rangkaian anda.

Apakah tujuan utama Linux?Apakah tujuan utama Linux?Apr 16, 2025 am 12:19 AM

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

Adakah Internet berjalan di Linux?Adakah Internet berjalan di Linux?Apr 14, 2025 am 12:03 AM

Internet tidak bergantung pada sistem operasi tunggal, tetapi Linux memainkan peranan penting di dalamnya. Linux digunakan secara meluas dalam pelayan dan peranti rangkaian dan popular untuk kestabilan, keselamatan dan skalabiliti.

Apakah operasi Linux?Apakah operasi Linux?Apr 13, 2025 am 12:20 AM

Inti sistem pengendalian Linux adalah antara muka baris arahannya, yang boleh melakukan pelbagai operasi melalui baris arahan. 1. Operasi Fail dan Direktori Gunakan LS, CD, MKDIR, RM dan arahan lain untuk menguruskan fail dan direktori. 2. Pengguna dan Pengurusan Kebenaran Memastikan keselamatan sistem dan peruntukan sumber melalui UserAdd, Passwd, CHMOD dan arahan lain. 3. Pengurusan proses menggunakan PS, membunuh dan arahan lain untuk memantau dan mengawal proses sistem. 4. Operasi rangkaian termasuk PING, IFCONFIG, SSH dan arahan lain untuk mengkonfigurasi dan menguruskan sambungan rangkaian. 5. Pemantauan sistem dan penyelenggaraan sistem seperti TOP, DF, DU untuk memahami status operasi sistem dan penggunaan sumber.

Meningkatkan Produktiviti dengan Pintasan Perintah Custom Menggunakan Linux AliasesMeningkatkan Produktiviti dengan Pintasan Perintah Custom Menggunakan Linux AliasesApr 12, 2025 am 11:43 AM

Pengenalan Linux adalah sistem operasi yang kuat yang disukai oleh pemaju, pentadbir sistem, dan pengguna kuasa kerana fleksibiliti dan kecekapannya. Walau bagaimanapun, kerap menggunakan arahan panjang dan kompleks boleh membosankan dan er

Apa yang sebenarnya Linux?Apa yang sebenarnya Linux?Apr 12, 2025 am 12:20 AM

Linux sesuai untuk pelayan, persekitaran pembangunan, dan sistem tertanam. 1. Sebagai sistem pengendalian pelayan, Linux stabil dan cekap, dan sering digunakan untuk menggunakan aplikasi konkurasi tinggi. 2. Sebagai persekitaran pembangunan, Linux menyediakan alat arahan dan sistem pengurusan pakej yang cekap untuk meningkatkan kecekapan pembangunan. 3. Dalam sistem tertanam, Linux ringan dan disesuaikan, sesuai untuk persekitaran dengan sumber yang terhad.

Alat dan kerangka penting untuk menguasai penggodaman etika di LinuxAlat dan kerangka penting untuk menguasai penggodaman etika di LinuxApr 11, 2025 am 09:11 AM

Pengenalan: Mengamankan sempadan digital dengan penggodaman etika berasaskan Linux Di dunia yang semakin saling berkaitan, keselamatan siber adalah yang paling penting. Ujian penggodaman dan penembusan etika adalah penting untuk mengenal pasti dan mengurangkan keruntuhan secara proaktif

Bagaimana untuk belajar asas Linux?Bagaimana untuk belajar asas Linux?Apr 10, 2025 am 09:32 AM

Kaedah untuk pembelajaran asas Linux dari awal termasuk: 1. Memahami sistem fail dan antara muka baris perintah, 2. Master arahan asas seperti LS, CD, MKDIR, 3.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft