linux 内核程序的简单实现
操作系统期末作业有一道编写一个简单的linux内核的作业,本人不才,鼓捣了好久,无果,特来请教。内核程序功能不用复杂,以下是我的问题及代码:
//系统版本:ubuntu 13.10
//halloworld.c
#define MODULE
#include </usr/src/linux-headers-3.11.0-12/include/linux/module.h>
int init_module(void)
{
printk("<1> Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("<1>Goodbye!\n");
}
问题如下:
1:最先是说 #include <linux/module.h>一句找不到文件,所以才改成了上边的绝对路径形式。
2:上边的代码在正确路径且root权限下,用 gcc -c halloworld.c 提示“fatal error: linux/list.h: 没有那个文件或目录”。我查询了下发现 #include <linux/list.h>一句是包含在module.h中的,而且它在我电脑的以下路径中
/usr/src/linux-headers-3.11.0-12/scripts/kconfig/list.h。请问这个问题怎么解决呢?(同学电脑ubuntu 12.04上没有提示过找不到 list.h文件……)
3:查询了好多,好像还有什么makefile之类的事情,本人初学,实在不懂,实现步骤都是按照老师给的文档来的。希望有大神能给个解释,或者是halloworld内核实现的详细步骤,不胜感激!
////////////////////////////////////////////
贴一下我参考的文档内容吧
实验提示
helloworld.c
#define MODULE
#include <linux/module.h>
int init_module(void)
{
printk(“<1> Hello World!\n”);
return 0;
}
void cleanup_module(void)
{
printk(“ <1>Goodbye!\n”);
}说明:
1. 代码的第一行#define MODULE 首先明确这是一个模块。任何模块程序的编写都需要包
含 linux/module.h 这个头文件,这个文件包含了对模块的结构定义以及模块的版本控制。
文件里的主要数据结构我们会在后面详细介绍。
2. 函数 init_module( )和函数 cleanup_module( )是模块编程中最基本的也是必须的两个函
数。init_module 向内核注册模块所提供的新功能;cleanup_module 负责注销所有由模块
注册的功能。
3. 注意我们在这儿使用的是 printk 函数(不要习惯性地写成 printf),printk 函数是由 linux
内核定义的,功能与 printf 相似。字符串<1>表示消息的优先级,printk 的一个特点就是
它对于不同优先级的消息进行不同的处理,之所以要在这儿使用高优先级是因为默认优
先级的消息可能不能显示在控制台上。这个问题我们就不详细讲了,你可以用 man 命令
寻求帮助。
接下来,我们就要编译和加载这个模块了。在前面的章节里我们已经学习了如何使用
gcc,现在还要注意的一点就是:确定你现在是超级用户,因为只有超级用户才能加载和卸
载模块。
root# gcc –c helloworld.c
root# insmod helloworld.o
Hello World!
这个时候, helloworld 模块就已经加载到内核中了。
我们可以使用 lsmod 命令查看。 lsmod
命令的作用是告诉我们所有在内核中运行的模块的信息, 包括模块的名称, 占用空间的大小,
使用计数以及当前状态和依赖性。
root# lsmod
Module
Size
helloworld 464
...
Used by
0 (unused)
最后,我们要卸载这个模块。
root# rmmod helloworld
Goodbye!
如果这时候我们再使用 lsmod 查看,会发现 helloworld 模块已经不在了。
关于 insmod 和 rmmod 这两个命令, 我现在只能简单的告诉你他们是两个用于把模块插
入内核和从内核移走模块的实用程序。前面用到的 insmod, rmmod 和 lsmod 都属于 modutils
模块实用程序。
//系统版本:ubuntu 13.10
//halloworld.c
#define MODULE
#include </usr/src/linux-headers-3.11.0-12/include/linux/module.h>
int init_module(void)
{
printk("<1> Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("<1>Goodbye!\n");
}
问题如下:
1:最先是说 #include <linux/module.h>一句找不到文件,所以才改成了上边的绝对路径形式。
2:上边的代码在正确路径且root权限下,用 gcc -c halloworld.c 提示“fatal error: linux/list.h: 没有那个文件或目录”。我查询了下发现 #include <linux/list.h>一句是包含在module.h中的,而且它在我电脑的以下路径中
/usr/src/linux-headers-3.11.0-12/scripts/kconfig/list.h。请问这个问题怎么解决呢?(同学电脑ubuntu 12.04上没有提示过找不到 list.h文件……)
3:查询了好多,好像还有什么makefile之类的事情,本人初学,实在不懂,实现步骤都是按照老师给的文档来的。希望有大神能给个解释,或者是halloworld内核实现的详细步骤,不胜感激!
////////////////////////////////////////////
贴一下我参考的文档内容吧
实验提示
helloworld.c
#define MODULE
#include <linux/module.h>
int init_module(void)
{
printk(“<1> Hello World!\n”);
return 0;
}
void cleanup_module(void)
{
printk(“ <1>Goodbye!\n”);
}说明:
1. 代码的第一行#define MODULE 首先明确这是一个模块。任何模块程序的编写都需要包
含 linux/module.h 这个头文件,这个文件包含了对模块的结构定义以及模块的版本控制。
文件里的主要数据结构我们会在后面详细介绍。
2. 函数 init_module( )和函数 cleanup_module( )是模块编程中最基本的也是必须的两个函
数。init_module 向内核注册模块所提供的新功能;cleanup_module 负责注销所有由模块
注册的功能。
3. 注意我们在这儿使用的是 printk 函数(不要习惯性地写成 printf),printk 函数是由 linux
内核定义的,功能与 printf 相似。字符串<1>表示消息的优先级,printk 的一个特点就是
它对于不同优先级的消息进行不同的处理,之所以要在这儿使用高优先级是因为默认优
先级的消息可能不能显示在控制台上。这个问题我们就不详细讲了,你可以用 man 命令
寻求帮助。
接下来,我们就要编译和加载这个模块了。在前面的章节里我们已经学习了如何使用
gcc,现在还要注意的一点就是:确定你现在是超级用户,因为只有超级用户才能加载和卸
载模块。
root# gcc –c helloworld.c
root# insmod helloworld.o
Hello World!
这个时候, helloworld 模块就已经加载到内核中了。
我们可以使用 lsmod 命令查看。 lsmod
命令的作用是告诉我们所有在内核中运行的模块的信息, 包括模块的名称, 占用空间的大小,
使用计数以及当前状态和依赖性。
root# lsmod
Module
Size
helloworld 464
...
Used by
0 (unused)
最后,我们要卸载这个模块。
root# rmmod helloworld
Goodbye!
如果这时候我们再使用 lsmod 查看,会发现 helloworld 模块已经不在了。
关于 insmod 和 rmmod 这两个命令, 我现在只能简单的告诉你他们是两个用于把模块插
入内核和从内核移走模块的实用程序。前面用到的 insmod, rmmod 和 lsmod 都属于 modutils
模块实用程序。
...全文
相关推荐
Linux下一个简单的文件系统实现
在Linux中,一个文件系统通常由两部分组成:用户空间的工具(如mount和umount命令)和内核空间的驱动程序。在这个项目中,XORFS的实现主要集中在内核空间,即`xorfs.c`文件。
Ubuntu中为Android系统上编写Linux内核驱动程序实现方法
这包括在Ubuntu上下载并编译Android源码,以及安装相应的Linux内核源码,因为Android内核驱动程序是基于Linux内核模块开发的。
Linux驱动程序教程:如何编写简单的Linux设备驱动程序
在"Simple Linux Driver"这个示例中,我们可能会看到一个简单的字符设备驱动程序的实现。
rpncalc:作为 Linux 内核模块实现的简单 RPN 计算器
**描述解析:**"计算,作为 Linux 内核模块实现的简单 RPN 计算器" 描述进一步强调了 rpncalc 的主要功能是执行计算,而且它是以 RPN 方式进行的。
深入理解Linux内核 + Linux内核设计与实现 英文版
同时,结合实际的编程实践,如编写简单的驱动程序或修改内核模块,将理论知识转化为实践经验,将有助于你更好地理解和掌握Linux内核。


