第03章 模块编程和内核调试基础.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
printk() printk 默认级别DEFAULT_MESSAGE_LOGLEVEL 在2.6.10内核中为KERN_WARNING 根据日志级别,控制台打印消息 klogd 和 syslogd klogd运行时,内核消息追加到/var/log/messages klogd没有运行,不会传递到用户空间,只能查看/proc/kmsg console_loglevel 默认值是DEFAULT_CONSOLE_LOGLEVEL 通过sys_syslog系统调用修改 通过/proc/sys/kernel/printk的访问来读取和修改 消息如何被记录 printk将消息写到一个长度为_ _LOG_BUF_LEN 字节的循环缓冲区中(4 KB -1 MB ) 用户空间访问日志接口 syslog系统调用 /proc/kmsg klogd , syslogd 和dmesg LOG_KERN工具纪录内核消息 以与printk对应的优先级纪录 优点与缺点 内存浪费减少到最少 可以在任何地方调用printk 可能丢失数据 开启及关闭消息 实现方式 预处理语句,每次开启关闭须重新编译 C条件语句,系统要进行额外的处理,影响性能 利用宏实现 Makefile文件中添加下面几行 # Comment/uncomment the following line to disable/enable debugging DEBUG = y # Add your debugging flag (or not) to CFLAGS ifeq ($(DEBUG),y) DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines else DEBFLAGS = -O2 endif CFLAGS += $(DEBFLAGS) Gdb调试 启动调试器时必须把内核看作一个应用程序 gdb /usr/src/linux/vmlinux /proc/kcore 刷新gdb缓存 core-file /proc/kcore 对内核调试时,gdb的许多功能都不可用 调试模块 Linux的可装载模块是ELF格式的可执行映像 模块划分为许多代码段 调试会话相关的代码段:.text、.bbs和.data (gdb) add-symbol-file .../scull.ko 0xd0832000 \ -s .bss 0xd0837100 \ -s .data 0xd0836be0 内核开发的特点 最重要的差异 内核编程时不能访问C库 内核编程时必须使用GNU C 内核编程时缺乏像用户空间那样的内存保护机制 内核编程时浮点数很难使用 内核只有一个很小的定长堆栈 由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发 要考虑可移植的重要性 没有libc库 完整的C库太大——即便从中抽取一个合适的子集——大小和效率都不能被接受 大部分的C库函数在内核中都已经得到实现 如操作字符串操作函数在/lib/string.c文件中定义,只要包含<linux/string.h>头文件,即可使用 printf() 与printk() 内核源代码文件不能包含外部头文件 没有内存保护机制 如果内核非法访问了内存,后果很难控制 内核发生内存错误,会导致oops 一个 oops 显示了出错时的处理器状态, 包括CPU 寄存器内容和其他看来不可理解的信息 内核中的内存都不分页,每用掉一个字节,物理内存就减少一个字节 不要轻易在内核中使用浮点数 用户空间进行浮点操作时,内核通常捕获陷阱并做相应的处理,完成从整数操作到浮点数操作的模式转换 内核不能完美地支持浮点操作 内核本身不能陷入 在内核中使用浮点数,除了要人工保存和恢复浮点寄存器,还有其他一些琐碎的事情要做 同步和并发 内核的许多特性都要求能够并发的访问共享数据,要求有同步机制保证不出现竞争条件 Linux是抢占多任务操作系统 Linux内核支持多处理器系统 中断是异步的 Linux内核可以抢占 常用的解决竞争的办法是自旋锁和信号量 其他特点 内核的主体是以GNU的C语言编写的 容积小而固定的栈 内核栈随体系结构而变。一般来说,内核栈的大小是两页 可移植性的重要性 内核中大部分的C语言代码应该与体系结构无关 将体系结构相关的代码从内核代码树的特定目录中适当分离出来 保持字节序、64位对齐、不假定字长和页面长度 Thanks for Your Attention! * Linux内核分析与实践(Intel课程项目资助) 第三章 模块编程和内核调试基础 * 本章主要内容 模块机制简介 模块的编

文档评论(0)

一天一点 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档