首页 > 代码库 > Linux 驱动开发笔记(一)

Linux 驱动开发笔记(一)

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){//TODOkfree(buff);}else{//TODO}

(2)vmalloc, vfree

#include <linux/vmalloc.h>char *buff;buff = vmalloc(1024);//buff = vmalloc(32 * PAGE_SIZE);if(buff != NULL){//TODOvfree(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){//TODOfree_pages(buff, order);}else{//TODO}