精华内容
下载资源
问答
  • android N dmesg源码分析

    千次阅读 2017-05-21 21:53:38
    dmesg源码位置: external/toybox/toys/lsb/dmesg.c system/core/toolbox/dmesg.c(应该不是这个) 在external/toybox/Android.mk的ALL_TOOLS变量中添加了dmesg.c,编译出的/system/bin/dmesg其实是一个指向 /...
    dmesg源码位置:
    external/toybox/toys/lsb/dmesg.c
    system/core/toolbox/dmesg.c(应该不是这个)


    在external/toybox/Android.mk的ALL_TOOLS变量中添加了dmesg.c,编译出的/system/bin/dmesg其实是一个指向
    /system/bin/toybox的符号链接,
    toybox是android m上集成的项目,目的在于用一个单一bin文件统一linux下的常用命令
    Toybox combines many common Linux command line utilities together into a single BSD-licensed executable. It's simple, small, fast, and reasonably standards-compliant (POSIX-2008 and LSB 4.1).

    Toybox's main goal is to make Android self-hosting by improving Android's command line utilities so it can build an installable Android Open Source Project image entirely from source under a stock Android system. After a talk at the 2013 Embedded Linux Conference explaining this plan (outlinevideo), Google merged toybox into AOSP and began shipping toybox in Android Mashmallow.

    adb shell后执行的ls cat等命令也其实都指向toybox

    linux内核自3.5以后提供了/dev/kmsg,用于向用户空间提供访问内核log的借口,
    What: /dev/kmsgDate: Mai 2012KernelVersion: 3.5Contact: Kay Sievers <kay@vrfy.org>Description: The /dev/kmsg character device node provides userspace accessto the kernel's printk buffer.

    external/toybox/toys/lsb/dmesg.c:
    /* dmesg.c - display/control kernel ring buffer.
     *
     * Copyright 2006, 2007 Rob Landley <rob@landley.net>
     *
     
    // We care that FLAG_c is 1, so keep c at the end.
    USE_DMESG(NEWTOY(dmesg, "w(follow)Ctrs#<1n#c[!tr]", TOYFLAG_BIN))
     
    config DMESG
      bool "dmesg"
      default y
      help
        usage: dmesg [-Cc] [-r|-t] [-n LEVEL] [-s SIZE] [-w]
     
        Print or control the kernel ring buffer.
     
        -C  Clear ring buffer without printing
        -c  Clear ring buffer after printing
        -n  Set kernel logging LEVEL (1-9)
        -r  Raw output (with <level markers>)
        -s  Show the last SIZE many bytes
        -t  Don't print kernel's timestamps
        -w  Keep waiting for more output (aka --follow)
    */
     
    #define FOR_dmesg
    #include "toys.h"
    #include <sys/klog.h>
     
    GLOBALS(
      long level;
      long size;
     
      int color;
    )
     
    static int xklogctl(int type, char *buf, int len)
    {
      int rc = klogctl(type, buf, len);
     
      if (rc<0) perror_exit("klogctl");
     
      return rc;
    }
     
    // Use klogctl for reading if we're on a pre-3.5 kernel.
    //3.5之前内核还是在legacy_mode中调用klogct去读kmsg
    static void legacy_mode() {
      char *data, *to, *from;
      int size;
     
      // Figure out how much data we need, and fetch it.
      if (!(size = TT.size)) size = xklogctl(10, 0, 0);
      data = to = from = xmalloc(size+1);
      data[size = xklogctl(3 + (toys.optflags & FLAG_c), data, size)] = 0;
     
      // Filter out level markers and optionally time markers
      if (!(toys.optflags & FLAG_r)) while ((from - data) < size) {
        if (from == data || from[-1] == '\n') {
          char *to;
     
          if (*from == '<' && (to = strchr(from, '>'))) from = ++to;
          if ((toys.optflags&FLAG_t) && *from == '[' && (to = strchr(from, ']')))
            from = to+1+(to[1]==' ');
        }
        *(to++) = *(from++);
      else to = data+size;
     
      // Write result. The odds of somebody requesting a buffer of size 3 and
      // getting "<1>" are remote, but don't segfault if they do.
      if (to != data) {
    //将/proc/kmsg中的内容写到标准输出中,这句完成将kmsg输出的任务
        xwrite(1, data, to-data);
        if (to[-1] != '\n') xputc('\n');
      }
      if (CFG_TOYBOX_FREE) free(data);
    }
     
    static void color(int c) {
      if (TT.color) printf("\033[%dm", c);
    }
     
    void dmesg_main(void)
    {
      // For -n just tell kernel which messages to keep.
      if (toys.optflags & FLAG_n) {
        xklogctl(8, 0, TT.level);
     
        return;
      }
     
      // For -C just tell kernel to throw everything out.
      if (toys.optflags & FLAG_C) {
        xklogctl(5, 0, 0);
     
        return;
      }
     
      TT.color = isatty(1);
     
     
      // Each read returns one message. By default, we block when there are no
      // more messages (--follow); O_NONBLOCK is needed for for usual behavior.
    // dmesg命令在3.5内核之后读取的是/dev/kmsg
      int fd = xopen("/dev/kmsg", O_RDONLY | ((toys.optflags&FLAG_w)?0:O_NONBLOCK));
      while (1) {
        char msg[8192]; // CONSOLE_EXT_LOG_MAX.
        unsigned long long time_us;
        int facpri, subsystem, pos;
        char *p, *text;
        ssize_t len;
     
        // kmsg fails with EPIPE if we try to read while the buffer moves under
        // us; the next read will succeed and return the next available entry.
        do {
          len = read(fd, msg, sizeof(msg));
        while (len == -1 && errno == EPIPE);
        // All reads from kmsg fail if you're on a pre-3.5 kernel.
        if (len == -1 && errno == EINVAL) {
          close(fd);
          return legacy_mode();//3.5之前内核还是在legacy_mode中调用klogct去读kmsg
        }
        if (len <= 0) break;
     //msg中保存的是从/dev/kmsg中读到的原始字符串,eg
    //4,222,12150,-;ACPI: 4 ACPI AML tables successfully acquired and loaded
        msg[len] = 0;

     // 用sscanf解析msg
    // char *msg = "4,222,12150,-;ACPI: 4 ACPI AML tables successfully acquired and loaded";
    // int retval = sscanf(msg, "%u,%*u,%llu,%*[^;];%n", &facpri, &time_us, &pos);
    // %u, 对应优先级"4,",因此输出facpri--4
    // %*u, 跳过行数"222,"
    // %llu,对应时间"12150," 下来剩下的就到了"-;ACPI: 4 ACPI AML tables successfully acquired and loaded";
    //%*[^;]; 这个意义是跳过接下来从不是字符;开始的到字符; 也就是会跳过"-;",剩下就到了"ACPI: 4 ACP。。。。",这些//就是真正的log
    //对于%n,gnu c 实现了 C 标准的 format specify 的 %n,它的含义是返回从该次 XXscanf 调用开始到此读了多少个字节,//目前已经读取到了"ACPI...",
    //从4到A前面的;一共14个字符,A是第15个,因此%n将使pos获取14
    //整个sscanf匹配到的输入项只有facpri和time_us,pos不算在内,因此返回值才与2做比较
    //获取到了pos后,text = msg + pos的意义就很明确了,从原始的msg中提取出";"后面真正的文本,作为text
    //这里text就是ACPI: 4 ACPI AML tables successfully acquired and loaded
    这个文档上也对/dev/kmsg的标准格式有所说明:

        if (sscanf(msg, "%u,%*u,%llu,%*[^;];%n", &facpri, &time_us, &pos) != 2)
          continue;
     
        // Drop extras after end of message text.
        text = msg + pos;
        if ((p = strchr(text, '\n'))) *p = 0;
     
    // subsystem是指kkernel log中带有 子系统名:详细信息的log,比如
    // NET: Registered protocol family 10
    //usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
        // Is there a subsystem? (The ": " is just a convention.)
        p = strstr(text, ": ");
        subsystem = p ? (p - text) : 0;
     
        // "Raw" is a lie for /dev/kmsg. In practice, it just means we show the
        // syslog facility/priority at the start of each line.
    // 打印优先级
        if (toys.optflags&FLAG_r) printf("<%d>", facpri);
     
        if (!(toys.optflags&FLAG_t)) {
          color(32); //调用printf("\033[%dm", 32); 用绿色打印
    // 如果不带-t参数就打印时间戳
          printf("[%5lld.%06lld] ", time_us/1000000, time_us%1000000);
          color(0);
        }
     
        // Errors (or worse) are shown in red, subsystems are shown in yellow.
    // 1 时间戳之后如果有subsystem先打印subsystem
        if (subsystem) {
          color(33); // 调用printf("\033[%dm", 32); 用黄色打印
          printf("%.*s", subsystem, text);
          text += subsystem;
          color(0);
        }
    // 2 下来按优先级,4级及以上调用xputs输出,1-3级用printf红色输出
        if (!((facpri&7) <= 3)) xputs(text);
        else {
          color(31);
          printf("%s", text);
          color(0);
          xputc('\n');
        }
      }

      close(fd);

    }

    展开全文
  • Rust中的'dmesg'实现 作为命令行实用程序 获取最新版本的二进制文件 wget https://github.com/polyverse/rmesg/releases/latest/download/rmesg chmod a+x ./rmesg # Optionally move to a stable location mv ./...
  • 保存dmesg 信息到文件源码

    千次阅读 2015-07-01 17:48:23
    #include #include #include #include #include //#include //内核编译的配置信息 #include #include //#define __LOG_BUF_LEN (1 )//在2.6.28内核中为默认1,这才是真正dmesg buffer的大小,网上其他都扯淡。...
    #include #include #include #include #include //#include //内核编译的配置信息 #include #include //#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)//在2.6.28内核中为默认1<<17,这才是真正dmesg buffer的大小,网上其他都扯淡。 #define __LOG_BUF_LEN (1 << 17)//在2.6.28内核中为默认1<<17 dmesg="" buffer=""
     define="" __log_path="" home="" default="" dmesg="" log="" define="" log_sleep="" x="" sleep="" x="" define="" __log_size="" 10485760="" 10m="" define="" buf_size="" 256="" long="" check_log_size="" void="" struct="" stat="" f_stat="" if="" stat="" __log_path=""
     f_stat="" -1="" return="" -1="" return="" long="" f_stat="" st_size="" int="" main="" int="" argc="" char="" argv="" char="" buf="" __log_buf_len="" 0="" char="" tmpbuf="" buf_size="" 0="" int="" ret="0;" file="" fp="NULL;" struct="" tm="" ptr="" time_t=""
     lt="" daemon="" 0="" 0="" while="" 1="" log_sleep="" 120="" sleep="" 10="" fp="fopen(__LOG_PATH,'a+');//追加打开" if="" null="=" fp="" printf="" creat="" file="" faild="" n="" continue="" ret="klogctl(4,buf,__LOG_BUF_LEN);//获得dmesg信息,该函数需要超级用户权限运行" if="" 0="">=
     ret){perror("klogctl "); fclose(fp); continue; } lt = time(NULL);//获得时间 ptr = (struct tm *)localtime(<); sprintf(tmpbuf," [LOG TIME:] %s",asctime(ptr));//记录时间 printf("tmpbuf = %s\n",tmpbuf); fwrite(tmpbuf,strlen(tmpbuf),1,fp); fwrite(buf,strlen(buf),1,fp);
     fflush(fp); fclose(fp); if(__LOG_SIZE < check_log_size()) { unlink(__LOG_PATH);//删除该文件 } memset(tmpbuf,0,BUF_SIZE); memset(buf,0,__LOG_BUF_LEN); } return 0; }
    
    展开全文
  • dmesg_exporter 一个导出器,它从收集度量。 用法 dmesg_exporter [OPTIONS] start [start-OPTIONS] Help Options: -h, --help Show this help message [start command options] --path= path to serve metrics ...
  • 需要修改 Linux 内核源码中的一个控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT,buffer size 是 2 ^ shift,加大这个就可以。 一、配置 $ make menuconfig General setup (18)Kernel log buffer size (16 ...

    需要修改 Linux 内核源码中的一个控制 log buffer size 的宏:CONFIG_LOG_BUF_SHIFT,buffer size 是 2 ^ shift,加大这个就可以。

    一、配置

    $ make menuconfig

    General setup
    (18)Kernel log buffer size (16 => 64KB,17 => 128KB)

    二、源码

    kernel/printk.c

    #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)

    static char __log_buf[__LOG_BUF_LEN];

    可以看到,是已经在编译时定死的一块静态空间,不能动态调整了。对于内核日志,唯一可以调整的在:/proc/sys/kernel/printk*

    三、限制

    init/Kconfig

    config LOG_BUF_SHIFT
    int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"
    range 12 21
    default 17
    help
    Select kernel log buffer size as a power of 2.
    Examples:
    17 => 128 KB
    16 => 64 KB
    15 => 32 KB
    14 => 16 KB
    13 => 8 KB
    12 => 4 KB

    可以看到 shift 最大值限制到了 21,也就是:2 M

    $ echo "(2^21)/1024/1024" | bc
    2

    如果再要加大,只能改源码了。

    展开全文
  • DepthSensing-源码

    2021-03-26 05:47:17
    打开终端并输入$ dmesg –w 获取有关系统诊断的信息。 然后将ZED2相机USB电缆插入Linux机器USB端口。 新的USB设备必须在实时诊断输出上可见。 硬件现已成功设置。 软件设置和安装 通过从以下位置下载适用于Linux...
  • 机器人v2-源码

    2021-02-19 14:34:26
    显示USB设备: lsusb或dmesg 确保没有错误 使用GUI选择音频扬声器和麦克风 播放/录制音频: 使用带麦克风的USB扬声器 安装sox库 播放音频文件:play file.mp3 录制音频文件:rec file.mp3(或.wav等) RPI设置: ...
  • dodecahedron-clock-源码

    2021-05-28 20:22:52
    pi@raspberrypi ~ $ dmesg | grep spi [ 6.164368] bcm2708_spi 20204000.spi: master is unqueued, this is deprecated [ 6.489381] bcm2708_spi 20204000.spi: SPI Controller at 0x20204000 (irq 80) 并且设备已...
  • 输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下 见: ...Ubuntu下构建内核源码树的方法 ...dmesg | tai

    输入:apt-cache search linux-source //查看内核版本

    输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下

    见:

    Ubuntu下构建内核源码树的方法

     

    ubuntu下编译本机模块是否需要下载内核源码呢?

    答案是可以的。

    dmesg | tail -1 命令用于查看载入内核后打印的数据。

     

    在ubuntu下,也可根据下载的源代码编译模块,若要使模块能够运行在本机中,下载的内核源码版本最好与本机一致。当然也可以根据交叉编译器开发嵌入式系统的模块。

     

    makefile版本1:

    obj-m := mod_test.o
    KERNELBUILD :=/lib/modules/$(shell uname -r)/build
    default:
     make -C $(KERNELBUILD) M=$(shell pwd)
    modulesclean:
     rm -rf *.o *.ko *.mod.c .*.cmd *.markers *.order *.symvers .tmp_versions

    在有源码情况下,makefile版本2:

    obj-m := mod_test.o

    命令行输入:

    make -C /usr/src/linux26/ SUBDIRS=$PWD modules
    即可产生模块。如果内核版本不同,会出现无法加载的问题。可以用modinfo mod_test.ko查看。

    vi  /lib/modules/`uname -r`/build/Makefile 可查看makefile中的内核版本号

    http://blog.csdn.net/sabalol/article/details/2076610

     

     

    Makefile为,
    PWD = $(shell pwd)
    KERNEL_SRC = /usr/src/linux-source-2.6.15/
     
    obj-m := test.o
    module-objs := test.o
     
    all:
           $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules

         
    clean:
           rm *.ko
           rm *.o
    在test.c和Makefile所在的目录下运行make,如果看到类似输出
    make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules

    make[1]: Entering directory `/usr/src/linux-source-2.6.15'
      CC [M]  /home/vmeth/hello.o
      Building modules, stage 2.
      MODPOST
      CC      /home/vmeth/hello.mod.o
      LD [M]  /home/vmeth/hello.ko
    make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
     
    一般用下面的Makefile,
    # Makefile2.6
    ifneq ($(KERNELRELEASE),)
    #kbuild syntax. dependency relationshsip of files and target modules are
    listed here.

    mymodule-objs := hello.o
    obj-m := hello.o 

    else
    PWD  := $(shell pwd)

    KVER ?= $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build
    all:
           $(MAKE) -C $(KDIR) M=$(PWD)

    clean:
           rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

    endif
    KERNELRELEASE 是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此
    Makefile时,KERNELRELEASE没有被定义,所以make将读取执行else之后的内容。
    当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;M=
    $(PWD) 表明然后返回到当前目录继续读入、执行当前的Makefile。
    当从内核源码目录返回时,KERNELRELEASE已被被定义,kbuild也被启动去解析kbuild
    语法的语句,make将继续读取else之前的内容。else之前的内容为kbuild语法的语句,
    指明模块源码中各文件的依赖关系,以及要生成的目标模块名。
    每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。

    展开全文
  • 在ubuntu下获取对应内核源码命令

    万次阅读 2012-04-04 22:06:09
    输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下 见: ...Ubuntu下构建内核源码树的方法 ...dmesg | tai
  • open-nic-driver-源码

    2021-04-06 23:10:57
    验证是否没有通过dmesg打印任何错误消息,并且新设备将显示在ifconfig输出中。 驱动程序为其探查的每个PF注册一个网络设备。 网络设备已向多个队列注册。 队列的数量上限为64个,取决于可通过关联的PF使用的MSI-X
  • 遥远的贝斯 版权所有(c)2019-2021 该存储库包含distant-bes的代码,一个用于将构建结果注入实现服务的库。 安装 为了安装该库,请克隆此存储库并... $ sudo dmesg > dmesg.log $ uname -a > uname.log $ echo "Th
  • 服务分类linux服务分为rpm包默认安装的服务和源码包安装的服务。 rpm包默认安装的服务分为独立的服务和基于xinetd服务。查询已安装的服务rpm包安装的服务 chkconfig --list #查看服务自启动状态,可以看到所有rpm包...
  • ubuntu下获取对应内核源码的方法

    千次阅读 2013-12-03 23:03:06
    输入:apt-cache search linux-source //查看内核版本 输入:apt-get install linux-source-3.0.0 //获取对应版本的内核,默认安装在/usr/src目录下 ...dmesg | tail -1 命令用于查看载入内核后打印的数
  • Raspberry Pi备份存储库 介绍 该存储库包含我的笔记和在我的rapibery pi(称为Barry)上用来备份我的个人数据的代码。 Barry安装了两个硬盘驱动器,其中1个作为Samba文件服务器公开供网络上的...dmesg ## Print kernal
  • 检查lsblk或dmesg,以确保您正在写入正确的驱动器! make flashsdx 或者您可以自己使用nasm进行编译: nasm filename.asm -f bin -o filename.bin 使用dd插入USB(无论是/ dev / sdb还是什么): sudo dd if=./...
  • 运行dmesg并提供与崩溃相关的行,例如: [ 4947.459104] cinnamon[2868]: segfault at 7f2611ffffe8 ip **00007f2667dda305** sp 00007fffb416b9d0 error 4 in libcjs.so.0.0.0[**7f2667db1000**+c1000] 启动...
  • 限制普通用户使用dmesg 启用 有关完整列表,请参见 /etc/fstab.new安装选项(创建/etc/fstab.new ) 另外,使用hidepid=2挂载 通过modprobe禁止使用某些内核模块禁用 配置外壳 创建一个选项以使用受限制的外壳...
  • owntracks-cli-publisher ... 确定接收器获得了哪个 USB 端口可能具有挑战性,但dmesg有助于找出。 知道端口后,请确认它在重新启动后保持不变,并确保您的gpsd服务正在运行。 对于测试,我们发现从终端启动
  • 将您的蓝牙 USB 加密狗插入您的机器并检查它是否被识别。 从 Linux 命令行,运行“lsusb”。 root@dev:/home# lsusb Bus 001 Device 002: ID 0424:9514 ... 如果没有,请重新启动您的机器,登录并运行 'dmesg | gr
  • ATM会检查所有dmesg输出。 如果要检查后再次使其变为绿色,则需要运行dmesg -c。 usage: check_oom.py [-h] [-m {warning,critical,default}] [-v] Check for OOM killer events optional arguments: -h, --help ...
  • Chef的硬件检测工具Ohai解析/var/run/dmesg.boot的输出以确定CPU信息,例如供应商,家族ID和步进。 为了确保我们拥有正则表达式解析这些数据的权利,我希望获得更多示例,特别是对于使用AMD或更旧的Intel硬件的用户...
  • dmesg | tail ruby19 "$METASPLOIT/tools/pattern_offset.rb" $SEGFAULT_IP 使用所需参数发起攻击 (python ./exploit.py /tmp/vuln --offset $OFFSET; echo ls) | /tmp/vuln 您还可以将执行漏洞利用所需的所有...
  • 系统76-dkms System76 DKMS驱动程序 在较新的System76笔记本电脑上,此驱动程序控制一些热键,并允许自定义风扇控制。 发展 要将其安装为内核模块: # Compile the module ...dmesg | grep system76
  • LANP源码安装注释版

    2011-02-25 14:41:20
     检查系统是否正常# more/var/log/messages(检查有无系统内核级错误信息)# dmesg (检查硬件设备是否有错误信息)# ifconfig(检查网卡设置是否正确)# ping www.163.com(检查网络是否正常)2. 关闭不需要的...
  • 默认支持256色ls,grep,dmesg和更少默认启用的颜色! 在$XDG_CONFIG_HOME/zsh/profile添加您的多余内容将自定义$XDG_CONFIG_HOME/zsh/completion/放在$XDG_CONFIG_HOME/zsh/completion/ Saner默认使用diff , hex...
  • 我的个人sysadmin / devops注释和代码段。 其他有用的文件 表中的内容 ...dmesg | grep kvm cat /proc/cpuinfo /proc/meminfo 可以访问Open Stack上的配置驱动器 mkdir -p /mnt/config mount /dev/d
  • 监视dmesg系统的不良行为 监控进程的最大和最小 自动发现 文件系统:inode和空间度量(发现的文件系统的数量可由受监视主机上的配置文件限制) 网络接口:每秒的数据包和传输速率 存储设备:每秒的操作(发现的设备...

空空如也

空空如也

1 2 3 4 5 6
收藏数 111
精华内容 44
关键字:

dmesg源码