zoukankan      html  css  js  c++  java
  • 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 ”);

    printk(“<1>””hello world ”);

    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
    或者 $(MAKE) –C $(KDIR) M=$(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
    }
  • 相关阅读:
    《舌尖上的中国》精彩故事
    5年前的笔试题目
    遍历物理模型中的所有表,将表名、表代码、字段名、字段代码全部由小写改成大写
    MongoDB下载文件 百度盘共享
    认识MEAN开发框架[转]
    智能油田
    排课相关参数设置
    spring获取所有被装配类工具
    oracle常用sql集锦
    关于使用easyUI遇到过的一些坑
  • 原文地址:https://www.cnblogs.com/ikaka/p/3789870.html
Copyright © 2011-2022 走看看