linux设备驱动学习(四)

1.系统的日志维护

 ◆syslog

  这个服务程序太重要了,大部分的系统维护都会用到它,也就是网络或系统管理员经常用到的log 文件。daemon在执行时其实是执行两个程序:syslogd和klogd,介绍如下,其分别负责不同种类的log,但全部的信息在系统刚开完机之后,会全部存放在/var/log/message。

klogd

  先介绍klogd是因为当一开始写入/var/log/message时,klogd所记录的信息会比syslogd 的顺序优先,原因是klogd所记录的是尚未进入操作系统的信息,但其实一开始的这些信息并不是由klogd所记录的,而是自加载kernel 时,就已经开始记录的。在系统尚未进入操作系统阶段,还在加载kernel及执行initrd时,会将信息先记录在/proc/kmsg文件中(因为在initrd阶段没有实体硬盘可供记录),等进入操作系统执行完klogd后,klogd再将/proc/kmsg的所有内容全数填入/var/log/message文件中,这也是为何在/var/log/message文件的一开始,依然可以看到刚开机在加载kernel以及initrd阶段的信息(连CPU的启用都看得到,信息中也注明了是kernel的信息)。

常用到的dmesg指令其实也就是将klogd检测出来的kernel信息,它直接通过console呈现在用户面前。在进入操作系统之后,kernel当然还在运行,而此时的kernel若检测到内部错误发生,klogd则会通过/boot/System.map文件找到kernel所在,如此一来,kernel就可以直接通过klogd的管道将信息再度呈现在用户面前。

syslogd

  在klogd填入所有kernel加载及initrd阶段的信息之后,接着执行的就是这一节所提到的服务级程序,而这些程序所产生的信息,就由syslogd负责整理,所以,这些信息会直接加在刚刚klogd的信息后面。在进入操作系统后就没有依照klogd或syslogd的顺序,只要产生信息,就直接依/etc/syslog.conf文件的定义,写入/var/log/message信息文件。

2.使用/proc系统

/proc文件系统是一种特殊的、由软件创建的文件系统,内核使用它向外界导出信息。/proc下面的每个文件都绑定于一个内核函数,用户读取其中的文件时,该函数动态的生成文件的内容。如以前用过的:所以,我们一般先实现read_proc这个函数指针:

int (*read_proc)(char *page, char **start, off_t offset, int count, int *eof, void *data);

page指向用来写入数据的缓冲区,函数应使用start返回实际的数据应写到内存页的哪个位置,offset和count同read/write的作用。

在实现了read_proc函数后,需要将其与/proc中的文件链接起来,为其提供接口。这用create_proc_read_entry来实现。

struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode,struct proc_dir_entry *base,read_proc_t *read_proc,void *data);

name就是要制定与read_proc建立连接的文件,可以重定向到其他文件夹下,不一定要在proc中。

3.在x86架构上,用户空间的栈默认自0xc0000000往下,因此,很容易联想到0xbfffda70可能是用户空间的栈地址,亦即传递给read系统调用的缓冲区地址,这个地址会在内核的调用链上重复向下传递。在x86架构上,内核空间起始于0xc0000000往上,故大于0xc0000000的值几乎肯定都是内核空间。在观察oops清单中,如果包含有0xa5a5a5a5这样的地址,那几乎可以肯定的是,我们在某处忘记了初始化动态分配的内存。

为了能够在oops在看到符号化的调用栈,要打开CONFIG_KALLSYMS选项。

4.strace命令是一个功能强大的工具,它可以显示由用户空间所发出的所有系统调用。它不仅可以显示调用,而且还能显示调用参数以及符号形式表示的返回值。系统调用失败时,错误的符号值(ENOMEM)和相应的字符串都会被打印出来

strace ls /dev > /dev/scull0

世上没有绝望的处境,只有对处境绝望的人。

linux设备驱动学习(四)

相关文章:

你感兴趣的文章:

标签云: