杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)

一、题目介绍

  1. 掌握Linux 内核模块的基本概念

·阅读教材7.3.2节Linux内核模块简介 ,网上查找资料,了解Linux内核模块的基本概念。

·阅读教材7.3.3内核模块编程基础 ,网上查找资料(https://tldp.org/LDP/lkmpg/2.6/html/index.html),了解Linux内核模块的编写方法。

2、设计和添加Linux 内核模块

(1)设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态。

(2)设计一个模块,显示当前系统的名称和版本

二、设计和添加Linux 内核模块

1、设计一个带参数的模块,其参数为某个进程的PID号,模块的功能是列出该进程的家族信息,包括父进程、兄弟进程和子进程的程序名、PID号、进程状态。

1.1 cd home 进入home目录(初始home目录应该为空)

1.2 mkdir test1   新建test1文件夹,“cd test1”进入test1文件夹

 

1.3  vim module1.c 

#include 
#include 
#include 
#include 
#include 
static pid_t pid=1;
module_param(pid, int, 0644);

static int module1_init(void)
{
    struct task_struct *p;
    struct list_head *pp;
    struct task_struct *psibling;
    //当前进程的PID
    p = pid_task(find_vpid(pid),PIDTYPE_PID);
    printk("me: %d %ld %s \n",p->pid,p->state,p->comm);

    //父进程
    if(p->parent == NULL){
            printk("No Parent\n");
    }
    else{
            printk("Parent:%d %ld %s \n",p->parent->pid,p->parent->state,p->parent->comm);
    }

    //兄弟进程
    list_for_each(pp,&p->parent->children)
    {
            psibling = list_entry(pp,struct task_struct,sibling);
            printk("Brother %d %ld %s \n",psibling->pid,psibling->state,psibling->comm);
    }

    //子进程
    list_for_each(pp,&p->children)
    {
            psibling = list_entry(pp,struct task_struct,sibling);
            printk("Children %d %ld %s \n",psibling->pid,psibling->state,psibling->comm);
    }
    return 0;
}

static void module1_exit(void)
{
    printk(KERN_ALERT"goodbye!\n");
}

module_init(module1_init);
module_exit(module1_exit);
MODULE_LICENSE("GPL");

1.4  vim Makefile

obj-m := module1.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
        make -C $(KDIR) M=$(PWD) modules
clean:
        make -C $(KDIR) M=$(PWD) clean

注:如果此时复制代码进去,显示如下图

杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)_第1张图片

 那么就是这两句标红句前面的缩进有问题,删掉重新tab缩进,就不会出现红色了

 

1.5   make

        insmod module1.ko pid=4

        编译模块

1.6  dmesg 查看结果

杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)_第2张图片

 已经成功输出啦!!!

1.7  输入“rmmod module1”,卸载模块,输入dmesg查看,成功卸载

杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)_第3张图片

 

 2、设计一个模块,显示当前系统的名称和版本

2.1切换至home目录下输入“makdir test2”新建test2文件,“cd test2”进入test2文件

 注:cd /       返回根目录

2.2  vim module2.c

#include
#include
#include
#include
// 初始化函数
static int hello_init(void)
{
        printk("sysname:%s  \n  version:%s",utsname()->sysname,utsname()->version);
        return 0;
}
// 清理函数
static void hello_exit(void)
{
        printk("goodbye!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

2.3  vim Makefile

obj-m := module2.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
        make -C $(KDIR) M=$(PWD) modules
clean:
        make -C $(KDIR) M=$(PWD) clean

2.4 输入“make”,进行模块编译

输入“insmod module2.ko”,加载模块

输入"dmesg",查看

杭电操作系统实验二 --- Linux 内核模块编程(arm架构华为云)_第4张图片

 

 成功输出

 ps:

1、如果在make过程中报错,建议看看编写的程序里是否存在缩进问题

2、如果加载模块时,出现下图的报错

可以输入

 先卸载该模块,再重新加载该模块试试

 

你可能感兴趣的:(linux)