zoukankan      html  css  js  c++  java
  • Linux操作系统编程 实验三 模块编程实验

    实验目的

    编写一个内核模块,要求:
    (1)编译该模块
    (2)加载、卸载该模块

    写内核程序需要注意:

    • 内核编程时不能访问C库
    • 内核编程时必须使用GUN C
    • 内核编程时缺乏像用户空间那样的内存保护机制
    • 内核编程时浮点数很难使用
    • 内核只有一个很小的定长堆栈
    • 由于内核支持异步中断、抢占SMP,因此必须时刻注意同步和并发
    • 要考虑可移植性的重要性

    实验记录

    我的虚拟机版本Ubuntu 20.04.1 x64,内核版本5.4.0-42-generic。

    首先切换到root权限,随后编写exp03.c和Makefile

    exp03.c

    点击查看详细内容
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    
    static int init_hello(void)
    {
            printk("Exp03_init...
    ");
            return 0;
    }
    static void exit_hello(void)
    {
            printk("Exp03_exit...
    ");
    }
    module_init(init_hello);
    module_exit(exit_hello);
    
    MODULE_LICENSE("GPL");  //告诉内核该模块遵循GPL协议
    MODULE_AUTHOR("Tea");   //模块作者
    MODULE_DESCRIPTION("Linux_Exp_03");     //模块描述
    MODULE_SUPPORTED_DEVICE("ExpDevice");   //模块支持的设备
    

    Makefile

    点击查看详细内容
    bj-m:=exp03.o
    
    all:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
    clean:
            make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
    

    实验过程

    执行make命令

    安装内核模块exp03.ko,然后在已安装的模块中查找exp03

    卸载内核模块exp03.ko,然后使用dmesg查看printk输出的内容

    问题记录

    1、在exp03.c中使用了printk命令打印内容,但是控制台却没有显示打印的内容

    原因:
    (1)查看当前控制台的打印级别

    cat /proc/sys/kernel/printk
    4 4 1 7
    其中第一个“4”表示内核打印函数printk的打印级别,只有级别比他高的信息才能在控制台上打印出来,既 0-3级别的信息

    (2)修改打印

    echo "新的打印级别 4 1 7" >/proc/sys/kernel/printk

    (3)不够打印级别的信息会被写到日志中可通过dmesg命令来查看

    (4)printk的打印级别,在c文件中开头部分加入以下内容,如果引入了<linux/kernel.h>,就不用加入了,直接使用关键字即可

    #define KERN_EMERG      "<0>" /* system is unusable */
    #define KERN_ALERT      "<1>" /* action must be taken immediately */
    #define KERN_CRIT       "<2>" /* critical conditions */
    #define KERN_ERR        "<3>" /* error conditions */
    #define KERN_WARNING    "<4>" /* warning conditions */
    #define KERN_NOTICE     "<5>" /* normal but significant condition */
    #define KERN_INFO       "<6>" /* informational */
    #define KERN_DEBUG      "<7>" /* debug-level messages */
    

    (5)printk函数的使用
    printk(打印级别 “要打印的信息”)
    打印级别:既上面定义的几个宏

    解决方案1

    通过命令:dmesg | grep Exp03来查看输出内容

    解决方案2

    在printk中加入关键字“KERN_ERR”,控制台就会输出相应的内容

    printk(KERN_ERR "Exp03_init...
    ");
    
  • 相关阅读:
    从 0 → 1,学习Linux该这么开始!
    Web和移动开发的未来
    css-div中文字过多(内容超出div宽度)后自动换行
    js+css--单选按钮,自定义选中的颜色???(性别按钮,男女)
    css-按钮中有图片和文字,怎么才能让文字和图片都中??
    js-点出弹框后(除了点击窗口上的叉子),点其他地方能够关闭窗口???
    css-外面元素的高度,由里面的元素进行撑开(由内部的高度决定)
    js-将传来的数据排序,让(全部)这个小按钮小圈圈,始终排列在最前面
    echart--如何在折线图上添加矩形背景(可以借用bar柱状图的实现效果)
    echart-如何将x轴和y轴的原点进行重合???
  • 原文地址:https://www.cnblogs.com/ast935478677/p/14167414.html
Copyright © 2011-2022 走看看