本文共 17237 字,大约阅读时间需要 57 分钟。
1. 内核打印信息解读2. dmesg没有显示内核最开始的打印信息,如何调整.3. 控制台级别及打印级别4. dmesg 的使用
Starting kernel ... 是 U-boot 打印的最后一句[ 0.000000] Booting Linux on physical CPU 0x0 是Linux打印的第一句,前面是时间戳
Linux version 4.4.76 (pop@ubuntu) (gcc version 5.4.0 20160609 (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) ) #22 SMP Sat Oct 6 19:29:17 PDT 2018
Kernel command line: root=/dev/nfs rw nfsroot=192.168.131.142:/home/pop/linux-debug/rootfs init=/linuxrc ip=192.168.131.140 console=ttyAMA0
Memory: 512592K/524288K available (4881K kernel code, 156K rwdata, 1392K rodata, 284K init, 152K bss, 11696K reserved, 0K cma-reserved)Virtual kernel memory layout: vector : 0xffff0000 - 0xffff1000 ( 4 kB) fixmap : 0xffc00000 - 0xfff00000 (3072 kB) vmalloc : 0xa0800000 - 0xff800000 (1520 MB) lowmem : 0x80000000 - 0xa0000000 ( 512 MB) modules : 0x7f000000 - 0x80000000 ( 16 MB) .text : 0x80008000 - 0x80628758 (6274 kB) .init : 0x80629000 - 0x80670000 ( 284 kB) .data : 0x80670000 - 0x806971a0 ( 157 kB) .bss : 0x8069a000 - 0x806c03b8 ( 153 kB)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
Console: colour dummy device 80x30
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
before kernel_init_freeableCPU0: thread -1, cpu 0, socket 0, mpidr 80000000Setting up static identity map for 0x60008280 - 0x600082d8Brought up 1 CPUsSMP: Total of 1 processors activated (525.92 BogoMIPS).CPU: All CPU(s) started in SVC mode.before do_basic_setupdevtmpfs: initialized //driver_init->driver_initbefore do_initcallsdo do_initcall_level :0 begindo do_initcall_level :0 enddo do_initcall_level :1 beginVFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 0clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 nsfutex hash table entries: 1024 (order: 4, 65536 bytes)NET: Registered protocol family 16do do_initcall_level :1 enddo do_initcall_level :2 beginDMA: preallocated 256 KiB pool for atomic coherent allocationscpuidle: using governor laddercpuidle: using governor menudo do_initcall_level :2 enddo do_initcall_level :3 beginof_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e0000of_amba_device_create(): amba_device_add() failed (-19) for /memory-controller@100e1000of_amba_device_create(): amba_device_add() failed (-19) for /watchdog@100e5000of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/sysctl@01000of_amba_device_create(): amba_device_add() failed (-19) for /smb/motherboard/iofpga@7,00000000/wdt@0f000hw-breakpoint: debug architecture 0x4 unsupported.CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.4.76 #28Hardware name: ARM-Versatile Express[<80016420>] (unwind_backtrace) from [<80012e80>] (show_stack+0x10/0x14)[<80012e80>] (show_stack) from [<802452b8>] (dump_stack+0x84/0x98)[<802452b8>] (dump_stack) from [<80642654>] (pl011_init+0x8/0x48)[<80642654>] (pl011_init) from [<8000973c>] (do_one_initcall+0x90/0x1d8)[<8000973c>] (do_one_initcall) from [<80629f90>] (kernel_init_freeable+0x200/0x2b4)[<80629f90>] (kernel_init_freeable) from [<804a4bcc>] (kernel_init+0x24/0x114)[<804a4bcc>] (kernel_init) from [<8000f478>] (ret_from_fork+0x14/0x3c)Serial: AMBA PL011 UART driver10009000.uart: ttyAMA0 at MMIO 0x10009000 (irq = 35, base_baud = 0) is a PL011 rev1console [ttyAMA0] enabled1000a000.uart: ttyAMA1 at MMIO 0x1000a000 (irq = 36, base_baud = 0) is a PL011 rev11000b000.uart: ttyAMA2 at MMIO 0x1000b000 (irq = 37, base_baud = 0) is a PL011 rev11000c000.uart: ttyAMA3 at MMIO 0x1000c000 (irq = 38, base_baud = 0) is a PL011 rev1do do_initcall_level :3 enddo do_initcall_level :4 beginSCSI subsystem initializedusbcore: registered new interface driver usbfsusbcore: registered new interface driver hubusbcore: registered new device driver usbAdvanced Linux Sound Architecture Driver Initialized.do do_initcall_level :4 enddo do_initcall_level :5 beginclocksource: Switched to clocksource arm,sp804NET: Registered protocol family 2TCP established hash table entries: 4096 (order: 2, 16384 bytes)TCP bind hash table entries: 4096 (order: 3, 32768 bytes)TCP: Hash tables configured (established 4096 bind 4096)UDP hash table entries: 256 (order: 1, 8192 bytes)UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)NET: Registered protocol family 1RPC: Registered named UNIX socket transport module.RPC: Registered udp transport module.RPC: Registered tcp transport module.RPC: Registered tcp NFSv4.1 backchannel transport module.do do_initcall_level :5 enddo do_initcall_level :6 beginhw perfevents: enabled with armv7_cortex_a9 PMU driver, 1 counters availablesquashfs: version 4.0 (2009/01/31) Phillip Lougherjffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.9p: Installing v9fs 9p2000 file system supportio scheduler noop registered (default)clcd-pl11x 10020000.clcd: PL111 rev2 at 0x10020000clcd-pl11x 10020000.clcd: /clcd@10020000 hardware, 1024x768@59 displayConsole: switching to colour frame buffer device 128x48clcd-pl11x 1001f000.clcd: PL111 rev2 at 0x1001f000clcd-pl11x 1001f000.clcd: /smb/motherboard/iofpga@7,00000000/clcd@1f000 hardware, 640x480@59 display40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write method40000000.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000Intel/Sharp Extended Query Table at 0x0031Using buffer write methodConcatenating MTD devices:(0): "40000000.flash"(1): "40000000.flash"into device "40000000.flash"libphy: smsc911x-mdio: probedsmsc911x 4e000000.ethernet eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4e000000.etherne:01, irq=-1)smsc911x 4e000000.ethernet eth0: MAC Address: 52:54:00:12:34:56isp1760 4f000000.usb: bus width: 32, oc: digitalisp1760 4f000000.usb: NXP ISP1760 USB Host Controllerisp1760 4f000000.usb: new USB bus registered, assigned bus number 1isp1760 4f000000.usb: Scratch test failed.isp1760 4f000000.usb: can't setup: -19isp1760 4f000000.usb: USB bus 1 deregisteredusbcore: registered new interface driver usb-storagemousedev: PS/2 mouse device common for all micertc-pl031 10017000.rtc: rtc core: registered pl031 as rtc0mmci-pl18x 10005000.mmci: Got CD GPIOmmci-pl18x 10005000.mmci: Got WP GPIOmmci-pl18x 10005000.mmci: No vqmmc regulator foundmmci-pl18x 10005000.mmci: mmc0: PL181 manf 41 rev0 at 0x10005000 irq 31,32 (pio)ledtrig-cpu: registered to indicate activity on CPUsusbcore: registered new interface driver usbhidusbhid: USB HID core driverinput: AT Raw Set 2 keyboard as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10006000.kmi/serio0/input/input0aaci-pl041 10004000.aaci: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30aaci-pl041 10004000.aaci: FIFO 512 entriesoprofile: using arm/armv7-ca9NET: Registered protocol family 179pnet: Installing 9P2000 supportdo do_initcall_level :6 enddo do_initcall_level :7 beginRegistering SWP/SWPB emulation handlerrtc-pl031 10017000.rtc: setting system clock to 2018-10-07 03:22:01 UTC (1538882521)smsc911x 4e000000.ethernet eth0: SMSC911x/921x identified at 0xa12a0000, IRQ: 28input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2IP-Config: Guessing netmask 255.255.255.0IP-Config: Complete: device=eth0, hwaddr=52:54:00:12:34:56, ipaddr=192.168.131.140, mask=255.255.255.0, gw=255.255.255.255 host=192.168.131.140, domain=, nis-domain=(none) bootserver=255.255.255.255, rootserver=192.168.131.142, rootpath=ALSA device list: #0: ARM AC'97 Interface PL041 rev0 at 0x10004000, irq 30do do_initcall_level :7 endafter do_initcallsafter do_basic_setupVFS: Mounted root (nfs filesystem) on device 0:13.after kernel_init_freeable
VFS: Mounted root (nfs filesystem) on device 0:13.
VFS: Mounted root (nfs filesystem) on device 0:13. // 这一句是 kernel_init_freeable 打印出来的.Freeing unused kernel memory: 284K (80629000 - 80670000) //这一句是 free_initmem->free_reserved_area 打印出来的 ----------------------------------- //从这一句开始就不是内核打印的了.是 init 用户进程打印出来的 welcome to A9 vexpress board-----------------------------------Please press Enter to activate this console.
调整 CONFIG_LOG_BUF_SHIFT可以直接修改 .config,也可以直接修改 def_configmake menuconfig 位置在General setup ---> (14) Kernel log buffer size (16 => 64KB, 17 => 128KB)help 信息 | CONFIG_LOG_BUF_SHIFT: | | | | Select the minimal kernel log buffer size as a power of 2. | | The final size is affected by LOG_CPU_MAX_BUF_SHIFT config | | parameter, see below. Any higher size also might be forced | | by "log_buf_len" boot parameter. | | | | Examples: | | 17 => 128 KB | | 16 => 64 KB | | 15 => 32 KB | | 14 => 16 KB | | 13 => 8 KB | | 12 => 4 KB | | | | Symbol: LOG_BUF_SHIFT [=14] | | Type : integer | | Range : [12 21] | | Prompt: Kernel log buffer size (16 => 64KB, 17 => 128KB) | | Location: | | -> General setup | | Defined at init/Kconfig:820 | | Depends on: PRINTK [=y]
$ cat /proc/sys/kernel/printk 8 4 1 7 当前控制台 default minimum boot-time-default 当前控制台日志级别 默认的消息日志级别 最低的控制台日志级别 默认的控制台日志级别小于等于 控制台 loglevel 的 log 才能打出来勘误:小于 控制台 loglevel 的 log 才能打出来
一般不会改的几个值. default minimum boot-time-default 默认的消息日志级别 最低的控制台日志级别 默认的控制台日志级别 默认的消息日志级别 : 一般为4,printk("<4>" "level 4!\n");和 printk("level 4!\n"); 和 pr_warning("level 4!\n"); 效果是一样的 最低的控制台日志级别 : 一般为1.如果此时控制台级别设置为1,此时 KERN_EMERG(0) 和 KERN_ALERT 仍会打印出来. 默认的控制台日志级别 : 一般为7,此时 KERN_DEBUG(7) ... KERN_EMERG(6) 都会打印出来.
怎么改变控制台日志级别 1. 改变 dts chosen 节点中的 loglevel=5 为 loglevel=6,将当前控制台信息级别改为6. 改变的 是 cat /proc/sys/kernel/printk 中的第一个值, 控制台 loglevel 2. echo 1 > /proc/sys/kernel/printk ,将当前控制台信息级别改为1
怎么 改变打印级别 loglevel= All Kernel Messages with a loglevel smaller than the console loglevel will be printed to the console. It can also be changed with klogd or other programs. The loglevels are defined as follows: 0 (KERN_EMERG) system is unusable 1 (KERN_ALERT) action must be taken immediately 2 (KERN_CRIT) critical conditions 3 (KERN_ERR) error conditions 4 (KERN_WARNING) warning conditions 5 (KERN_NOTICE) normal but significant condition 6 (KERN_INFO) informational 7 (KERN_DEBUG) debug-level messages #define KERN_EMERG "\001" "<0>" 通常是系统崩溃前的信息 #define KERN_ALERT "\001" "<1>" 需要立即处理的消息 #define KERN_CRIT "\001" "<2>" 严重情况 #define KERN_ERR "\001" "<3>" 错误情况 #define KERN_WARNING "\001" "<4>" 有问题的情况 #define KERN_NOTICE "\001" "<5>" 正常情况,但仍然要注意 #define KERN_INFO "\001" "<6>" 信息型消息 #define KERN_DEBUG "\001" "<7>" 用作调试作用printk("\001" "<0>" "level 0!\n"); // printk(KERN_EMERG "level 0!\n");printk("\001" "<1>" "level 1!\n"); // printk(KERN_ALERT "level 1!\n");printk("\001" "<2>" "level 2!\n");printk("\001" "<3>" "level 3!\n");printk("\001" "<4>" "level 4!\n");printk("\001" "<5>" "level 5!\n");printk("\001" "<6>" "level 6!\n");printk("\001" "<7>" "level 7!\n"); 内核提供了动态打印的系统,例如pr_debug,dev_debug这种接口。他们是对printk(log_level " ")的二次封装include/linux/kernel.h#define pr_emerg(fmt, ...) \ printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)#define pr_alert(fmt, ...) \ printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)#define pr_crit(fmt, ...) \ printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)#define pr_err(fmt, ...) \ printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)#define pr_warning(fmt, ...) \ printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)#define pr_notice(fmt, ...) \ printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)#define pr_info(fmt, ...) \ printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)#define pr_cont(fmt, ...) \ printk(KERN_CONT fmt, ##__VA_ARGS__) // NOT LEVEL 7 /* If you are writing a driver, please use dev_dbg instead */ #if defined(CONFIG_DYNAMIC_DEBUG) /* dynamic_pr_debug() uses pr_fmt() internally so we don't need it here */ #define pr_debug(fmt, ...) \ dynamic_pr_debug(fmt, ##__VA_ARGS__) #elif defined(DEBUG) #define pr_debug(fmt, ...) \ printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #else #define pr_debug(fmt, ...) \ no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) #endif
BusyBox v1.30.0.git (2019-02-15 18:29:52 PST) multi-call binary.Usage: dmesg [-c] [-n LEVEL] [-s SIZE]Print or control the kernel ring buffer -c Clear ring buffer after printing // 打印后清空buf -n LEVEL Set console logging level // 设置当前控制台优先级 -s SIZE Buffer size // -r Print raw message buffer // 可看出打印优先级ubuntu dmesg dmesg -T // 按照标准事件显示 dmesg -d // 显示两条信息的时间间隔 dmesg -d -T dmesg | tail // 最近一次内核输出 dmesg -l 5 // 只打印level 5
内核侧配置 CONFIG_EARLY_PRINTK=yuboot侧配置 earlyprintk=ttySAC0,115200 (一般根据console=的值进行调整)setenv bootargs "root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 bootmem_debug earlyprintk=ttySAC0,115200"
printk(KERN_EMERG "mylog level 0!\n");dmesg -l 0 -T -d
安卓下打印上层应用的log , logcat 原理类似于dmesg 的原理,只不过dmesg是在内核空间维护环形buff,另一个是在用户空间维护环形buffadb logcat -c // 清log缓冲区adb logcat // 实时打印到终端adb logcat > D:\logcat.txt // 打印到文件里
# cat /system/etc/init/logcatd.rc# logcatd serviceservice logcatd /system/bin/logcatd -L -b ${ logd.logpersistd.buffer:-all} -v threadtime -v usec -v printable -D -f /data/misc/logd/logcat -r 1024 -n ${ logd.logpersistd.size:-256} --id=${ ro.build.id} class late_start disabled # logd for write to /data/misc/logd, log group for read from log daemon user logd group log writepid /dev/cpuset/system-background/tasks oom_score_adjust -600
转载地址:http://daigi.baihongyu.com/