linux 内核程序的简单实现

仙踪飘渺 2014-01-01 10:10:15
操作系统期末作业有一道编写一个简单的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
模块实用程序。
...全文
372 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfdeh 2014-01-24
  • 打赏
  • 举报
回复

.PHONY: all clean user kernel

KERNEL_PATH=$(firstword $(wildcard /lib/modules/$(shell uname -r)/build /usr/src/linux))
PWD=$(shell pwd)

obj-m := helleoworld.o

all: kernel

kernel:
	make -C $(KERNEL_PATH) M=$(PWD) modules

clean:
	@echo clean...
	@rm -fr *.ko *.mod.c *.o *.so *.order *.symvers .*.o.cmd .*.ko.cmd .tmp_versions

Carl_CCC 2014-01-02
  • 打赏
  • 举报
回复
关键问题是你的编译不要直接上gcc,找个Makefile就可以了。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧