1、查看printk函数日记输出
(1)使用字符终端;通常使用ctrl+alt+f1切换查看;
(2)使用cat /proc/kmsg命令;(在Linux系统启动后,/proc/kmsg文件可以查看内核对外所用的符号表,可以用cat命令查看器内容。)
(3)使用dmesg命令查看。
linux/kernel.h文件定义的printk函数的Log Level:
常数定义语句
意义#define KERN_EMERG “<0>”/*系统不运行*/ #define KERN_ALERT “<1>”/*总是输出*/ #define KERN_CRIT “<2>”/*关键信息*/ #define KERN_ERR “<3>”/*error信息*/ #define KERN_WARNING “<4>”/*提示信息*/ #define KERN_NOTICE “<5>”/*正常信息*/ #define KERN_INFO “<6>”/*系统信息*/ #define KERN_DEBUG “<7>”/*调试信息*/
使用例子:
printk(KERN_ALERT “hello world\n”);
printk(“<1>””hello world\n”);
2、模块操作的一些命令:
(1)insmod 加载模块到内核
(2)rmmod 从内核中卸载模块
(3)ismod 查看内核中加载的模块目录
(4)depmod 生成模块间依赖性信息
(5)modprobe 加载或者卸载模块(用于模块自动安装功能)
(6)lsmod 显示加载到内核中的模块状态
3、最基本Makefile文件分析(kernel 2.6):
(1)定义生成模块的名称
obj-m := test.o
module-objs := test1.o test2.o test3.o
(2)指定源代码的位置
KDIR := /lib/modules/$(shell uname –r)/build
(3)指定编译模块源代码所在位置的当前目录
PWD := $(shell pwd)
(4)指定编译模块的命令
default: $(MAKE) –C $KDIR SUBDIRS=$(PWD) modules
(5)清除生成的文件
clean:
rm –rf *ko
rm –rf *.mod.*
rm –rf .*.cmd
rm –rf *.o
4、变量数据类型
变量数据类型在头文件:
#include <asm/types.h>
常用的数据类型:
__s8, s8 8位带符号的正数(字节) __s16, s16 16位带符号的正数(字) __s32, s32 32位带符号的正数 __s64, s64 64位带符号的正数 __u8, u8 8位不带符号的正数(字节) __u16, u16 16位不带符号的正数(字) __u32, u32 32位不带符号的正数 __u64, u64 64位不带符号的正数
5、动态内存
(1)kmalloc , kfree
使用kmalloc()函数时刻分配的大小为32 x PAGE_SIZE。大多数系统中PAGE_SIZE的大小为4096。
(a)GFP_KERNEL代表请求动态内存一定要成功,否则等待足够的空间。
(b)GFP_ATOMIC:内核存在可分配内存时,无条件分配内存,若没有就立即释放NULL。
(c)GFP_DMA:用于分配连续的物理内存。
#include <linux/slab.h> char *buff; buff = vmalloc(1024, GFP_KERNEL);//buff = vmalloc(32 * PAGE_SIZE, GFP_KERNEL); if(buff != NULL){ //TODO kfree(buff); }else{ //TODO }
(2)vmalloc, vfree
#include <linux/vmalloc.h> char *buff; buff = vmalloc(1024);//buff = vmalloc(32 * PAGE_SIZE); if(buff != NULL){ //TODO vfree(buff); }else{ //TODO }
(3)__get_free_pages, free_pages
#include <linux/gfp.h> char *buff; int order; order = get_order(8192); buff = __get_free_pages(GFP_KERNEL, order); if(buff != NULL){ //TODO free_pages(buff, order); }else{ //TODO }
Linux 驱动开发笔记(一),布布扣,bubuko.com