实验6 linux内核,Linux内核|实验六 内核模块编程

本文介绍了一个用于Linux系统的内核模块,该模块能够实现在/proc文件系统中读取系统时钟的功能。模块通过编写特定的函数,支持read()操作并返回当前的时间戳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、实验目的

模块是 Linux 系统的一种特有机制,可用以动态扩展操作系统内核功能。编写实现某些 特定功能的模块,将其作为内核的一部分在管态下运行。本实验通过内核模块编程在/porc 文件系统中实现系统时钟的读操作接口。

2、实验内容

设计一个实现系统时钟的读操作内核模块。构建一个在/proc文件系统中的内核模块clock,支持read()操作,read()返回值为一字符串,其中包块一个空各分开的两个子串,为别代表xtime.tv_sec 和 xtime.tv_usec。

3、实验原理

Linux 模块是一些可以作为独立程序来编译的函数和数据类型的集合。在装载这些模块 式,将它的代码链接到内核中。Linux 模块可以在内核启动时装载,也可以在内核运行的过 程中装载。如果在模块装载之前就调用了动态模块的一个函数,那么这次调用将会失败。如 果这个模块已被加载,那么内核就可以使用系统调用,并将其传递到模块中的相应函数。

4、实验内容

设计思路:

文件中主要包含 init_module(), cleanup_module(), proc_read_clock()三个函数。其中init_module(), cleanup_module()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc 中的入口。 read_func()负责产生/proc/clock 被读时的动作。

编译内核模块 Makefile 文件

137854_0.png

137854_1.png

编译完成之后生成 clock.o 模块文件。

137854_2.png

内核模块源代码 clock.c

137854_3.png

#include

#include

#include

#include

#include

#include

#define MODULE

#define MODULE_VERSION "1.0"

#define MODULE_NAME "clock"

struct proc_dir_entry* my_clock;

int read_clock(char* page, char** start, off_t off, int count, int* eof,

void* data) {

int len;

struct timeval xtime;

do_gettimeofday(&xtime);

len = sprintf(page, "%d %dn", xtime.tv_sec, xtime.tv_usec);

printk("clock: read_func()n");

return len;

}

struct proc_dir_entry *clock_proc_file;

int init_clock(void)

{

clock_proc_file =create_proc_read_entry("clock",0,NULL,read_clock,NULL);

return 0;

}

void exit_clock(void)

{

remove_proc_entry("clock",clock_proc_file);

}

module_init(init_clock)

module_exit(exit_clock)

MODULE_LICENSE("GPL");

加载内核模块

在系统 root 用户下运行用户态模块命令装载内核模块

#insmod clock.o

137854_4.png

测试源代码 gettim e.c

#include

#include

#include

int

main(void)

{

struct timeval getSystemTime;

char procClockTime[256];

int infile,len;

gettimeofday(&getSystemTime,NULL);

infile = open("/proc/clock",O_RDONLY);

len = read(infile,procClockTime,256);

close(infile);

procClockTime[len] = ' ';

printf("SystemTime is %d %dnProcClockTime is %sn",

getSystemTime.tv_sec ,

getSystemTime.tv_usec,

procClockTime);

sleep(1);

}

卸载内核模块

在系统 root 用户下运行用户态模块命令卸载内核模块

#rmmod clock.o

2017082209091948.png

2017082209091949.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值