zoukankan      html  css  js  c++  java
  • 01day 测试打印

    //module_init(函数名);    当模块被插入到Linux内核,自动执行func
    //int  func(void)
    //module_exit(函数名):     当模块被卸载时候,自动执行
    //void   func(void)
    //编译内核代码  必须要调用内核中的头文件
    #include <linux/module.h>  //MODULE_LICENSE("GPL");
    #include <linux/init.h>   //module_init  module_exit
    //内核是用printk打印

    //加载
    static int test_init(void)
    {
        //内核是用printk打印
        printk("%s:%s:%d   load ", __FILE__, __FUNCTION__, __LINE__);

        return 0;
    }

    //卸载
    static void test_exit(void)
    {
        printk("%s:%s:%d   reload ", __FILE__, __FUNCTION__, __LINE__);
    }


    module_init(test_init);
    module_exit(test_exit);


    MODULE_LICENSE("GPL");  //加入GPL许可

    //Linux内核模块必须遵循GPL协议

    -----------------------------------------

    makefile

    obj-m := test.o

    #添加当前的系统的路径
    #uname -r  查看当前系统的内核版本,
    #指定内核的地址
    #KERNEL_DIR := /usr/src/linux-headers-3.19.0-15-generic

    KERNEL_DIR:= ~/4412_res/linux/linux-3.5
    NFSROOT := ~/nfsroot/

    all: build

    build:
        make -C $(KERNEL_DIR) M=$(PWD) modules

    copy:
        mv $(obj-m:.o=.ko) $(NFSROOT)

    clean:
        make -C $(KERNEL_DIR) M=$(PWD) clean

    .PHONY: all build copy clean

    --------------------------------------

    其他相关阅读

    #include <linux/kernel.h>        /* printk() */
    //#include <linux/slab.h>       /* kmalloc() */
    //#include <linux/fs.h>        /* file_operations、inode_operations、super_operations结构体*/
    //#include <linux/errno.h>       /* error codes */
    #include <linux/types.h>        /* size_t等各种系统typedef的数据类型 */
    //#include <linux/fcntl.h>       /* O_ACCMODE */
    //#include <linux/poll.h>        /* COPY_TO_USER */
    #include <linux/module.h>          /*MODULE_LICENSE("GPL");内核认识的特定许可有,
                              "GPL"( 适用 GNU 通用公共许可的任何版本 ),
                              "GPL v2"( 只适用 GPL 版本 2 ),
                              "GPL and additional rights",
                              "Dual BSD/GPL",
                              "Dual MPL/GPL",
                              "Proprietary".
                              除非你的模块明确标识是在内核认识的一个自由许可下,
                              否则就假定它是私有的,
                              内核在模块加载时被"弄污浊"了.
                              象我们在第 1 章"许可条款"中提到的,
                              内核开发者不会热心帮助在加载了私有模块后遇到问题的用户.
                               MODULE_AUTHOR ( 声明谁编写了模块 ),
                               MODULE_DESCRIPION( 一个人可读的关于模块做什么的声明 ),
                               MODULE_VERSION ( 一个代码修订版本号; 看 <linux/module.h> 的注释以便知道创建版本字串使用的惯例),
                               MODULE_ALIAS ( 模块为人所知的另一个名子 ),
                               MODULE_DEVICE_TABLE ( 来告知用户空间, 模块支持那些设备 ).

    #include <linux/init.h>        /* #define module_init(x)    __initcall(x);  driver initialization entry point
                           #define module_exit(x)    __exitcall(x);  driver exit entry point
                           */
    #include <linux/miscdevice.h>        /* extern int misc_register(struct miscdevice * misc);  注册miscdevice结构体成员变量设备
                             extern int misc_deregister(struct miscdevice *misc);  注销miscdevice结构体成员变量设备
                             */
    #include <linux/cdev.h>        /* void cdev_init(struct cdev *, const struct file_operations *);
                          struct cdev *cdev_alloc(void);
                          void cdev_put(struct cdev *p);
                          int cdev_add(struct cdev *, dev_t, unsigned);
                          void cdev_del(struct cdev *);
                          void cd_forget(struct inode *); */
    #include <mach/hardware.h>                 /* 和GPIO口操作相关的函数定义的头文件
                                    对应的源文件在/linux-2.6.32.2/arch/arm/plat-s3c24xx/gpio.c
                                    void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);
                                    unsigned int s3c2410_gpio_getcfg(unsigned int pin);
                                    void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
                                    int s3c2410_gpio_getpull(unsigned int pin);
                                    void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
                                    unsigned int s3c2410_gpio_getpin(unsigned int pin);
                                    unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change);
                                    int s3c2410_gpio_getirq(unsigned int pin);
                                    int s3c2410_gpio_irq2pin(unsigned int irq);*/
    #include <mach/regs-gpio.h>        /* 和GPIO口相关的一些宏定义(在arch/arm/mach-s3c2410/mach) */
    #include <linux/platform_device.h>        /*  */


    #include <linux/interrupt.h>        /* typedef irqreturn_t (*irq_handler_t)(int, void *);
                             extern void free_irq(unsigned int, void *);extern void disable_irq(unsigned int irq);
                             extern void enable_irq(unsigned int irq);等和中断相关函数的声明 */
    #include <linux/wait.h>        /* wake_up_interruptible   唤醒 q 指定的注册在等待队列上的进程。该函数不能直接的立即唤醒进程,而是由调度程序转换上下文,调整为可运行状态。  
                        static DECLARE_WAIT_QUEUE_HEAD(button_waitq);声明等待队列为全局变量
                          wait_event_interruptible该函数修改task的状态为TASK_INTERRUPTIBLE,意味着改进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中*/
    #include <linux/poll.h>        /* poll_wait */
    #include <asm/uaccess.h>        /* copy_to_user和copy_from_user */
    #include <asm/io.h>              /* __raw_readl  __raw_writel*/
    #include <linux/clk.h>        /* struct clk *clk_get(struct device *dev, const char *id);
                          unsigned long clk_get_rate(struct clk *clk); */
    #include <plat/clock.h>        /* struct clk;结构体的定义 (在arch/arm/plat-s3c/plat/include/clock.arch中,对应的源文件在/arm/plat-s3c/clock.c)*/
    #include <linux/device.h>           //包含了device、class 、device_driver等结构的定义
    #include <mach/regs-mem.h>        /* 和bank相关的寄存器的宏定义 *sh: cd: 03: 没有那个文件或目录
    /
    #include <asm/div64.h>          /* Linux内核中64位除法函数do_div */
    #include <linux/fb.h>        /* struct fb_info 结构体的定义 */
    #include <mach/fb.h>        /* struct s3c2410fb_display(在arch/arm/mach-s3c2410/include/mach/fb.h) */





    #define KERN_EMERG 0/*紧急事件消息,系统崩溃之前提示,表示系统不可用*/
    #define KERN_ALERT 1/*报告消息,表示必须立即采取措施*/
    #define KERN_CRIT 2/*临界条件,通常涉及严重的硬件或软件操作失败*/
    #define KERN_ERR 3/*错误条件,驱动程序常用KERN_ERR来报告硬件的错误*/
    #define KERN_WARNING 4/*警告条件,对可能出现问题的情况进行警告*/
    #define KERN_NOTICE 5/*正常但又重要的条件,用于提醒*/
    #define KERN_INFO 6/*提示信息,如驱动程序启动时,打印硬件信息*/
    #define KERN_DEBUG 7/*调试级别的消息*/







  • 相关阅读:
    开启Spring Boot 之旅
    Java笔试面试练习题---集合
    Python
    Python
    Redis -下载与基本使用
    Git
    Vue全家桶-Vue-router&Vuex
    Es6
    Vue-前端
    Django基础及实战
  • 原文地址:https://www.cnblogs.com/baoshulin/p/6400880.html
Copyright © 2011-2022 走看看