`
haoningabc
  • 浏览: 1482740 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编译内核模块的helloworld

阅读更多
http://www.tuicool.com/articles/jYreMf
树莓派编译网卡


编译内核模块的helloworld的例子如下
环境:
1.linode虚拟机
2.centos系统,其他系统都行
3.下面ibm的代码,sample.tar.gz
4.编译内核模块需要源码



参考链接
http://blog.csdn.net/tigerjb/article/details/6010997
http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/index.html
上代码
[root@li408-34 hello]# cat hello.c 
/*                                                     
 * $Id: hello.c,v 1.5 2004/10/26 03:32:21 corbet Exp $ 
 * The code samples are covered by a dual BSD/GPL license from
 * Linux Device Drivers, Third Edition, by Jonathan Corbet, 
 * Alessanfdro Rubini, and Greg Kroah-Hartman.Copyright
 * 2005 O鈥橰eilly Media, Inc., 0-596-00590-3.
 */                                                    
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, haoning-------------\n");
        return 0;
}

static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

Makefile
[root@li408-34 hello]# cat Makefile 

# To build modules outside of the kernel tree, we run "make"
# in the kernel source tree; the Makefile these then includes this
# Makefile once again.
# This conditional selects whether we are being included from the
# kernel Makefile or not.
ifeq ($(KERNELRELEASE),)

    # Assume the source tree is where the running kernel was built
    # You should set KERNELDIR in the environment if it's elsewhere
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    # The current directory is passed to sub-makes as argument
    PWD := $(shell pwd)

modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
        rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions \
        *.order *.symvers

.PHONY: modules modules_install clean

else
    # called from kernel build system: just declare what our modules are
    obj-m := hello.o
endif

★★★★★★★★★★★★★★★我是罪恶的分割线★★★★★★★★★★★
步骤:
环境linode
centos6
[root@li408-34 hello]# uname -a
Linux li408-34 3.8.4-linode50 #1 SMP Mon Mar 25 15:50:29 EDT 2013 i686 i686 i386 GNU/Linux
[root@li408-34 hello]# uname -r
3.8.4-linode50
[root@li408-34 hello]# 


由于linode的内核都是自己编译的
上网查了一些自己编译内核的方法,但是还是启动报错
参考http://www.xiaozhou.net/ittech/vps-ittech/upgrade_linode_vps_kernel_manually-2011-04-28.htm
★这个写得很好,学习了

后来自己下了
linux-3.8.tar.xz
xz -d linux-3.8.tar.xz
tar xvf linux-3.8.tar
cd  linux-3.8
cp /proc/config.gz .
gunzip config.gz 
mv config .config

这一步是用系统当前的config文件
作为内核的make menuconfig或者make config产生的文件
配置项太jb多了
然后可能需要改


CONFIG_PARAVIRT_GUEST=y
CONFIG_XEN=y
CONFIG_PARAVIRT=y
CONFIG_PARAVIRT_CLOCK=y
CONFIG_XEN_BLKDEV_FRONTEND=y
CONFIG_XEN_NETDEV_FRONTEND=y
CONFIG_HVC_XEN=y
CONFIG_XEN_SCRUB_PAGES=y

CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y

CONFIG_IP_NF_SECURITY=n

CONFIG_IP6_NF_SECURITY=n


#rm -rf /boot/*  看好了,这里可能原来就有启动的东西了,还是别删了
#开始编译
make modules
make
#安装内核
make install
make modules_install

然后就会在/boot下面生成vmlinuz System.map
据说改了 /boot/grub/menu.lst重新启动 ,linode选pv-grub-x86-32
就能重新启动使用新内核了,但是我没试验成功,反正我是为了编译内核模块,又不是重新然linode好使,可能虚拟机还是和真实机器有莫名其买的差距吧,没深究

继续编译内核模块:
ln -s /root/kernel/linux-3.8 /lib/modules/3.8.4-linode50/build 

把新编译的源码链接到 系统已经存在的内核源码
其实不太对,但是两个都是3.8的差别还不算大,内核模块可用

回到罪恶的分割线上面的代码
[root@li408-34 hello]# ls
Makefile  hello.c
[root@li408-34 hello]# pwd
/root/kk/samples/hello
[root@li408-34 hello]#

[root@li408-34 hello]# make
make -C /lib/modules/3.8.4-linode50/build M=/root/kk/samples/hello modules
make[1]: Entering directory `/root/kernel/linux-3.8'
  CC [M]  /root/kk/samples/hello/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/kk/samples/hello/hello.mod.o
  LD [M]  /root/kk/samples/hello/hello.ko
make[1]: Leaving directory `/root/kernel/linux-3.8'
[root@li408-34 hello]# 


[root@li408-34 hello]# lsmod
Module                  Size  Used by
[root@li408-34 hello]# 
[root@li408-34 hello]# ls     
Makefile  Module.symvers  hello.c  hello.ko  hello.mod.c  hello.mod.o  hello.o  modules.order
[root@li408-34 hello]# insmod hello.ko
[root@li408-34 hello]# lsmod
Module                  Size  Used by
hello                    606  0 
[root@li408-34 hello]# 
[root@li408-34 hello]# cat /proc/modules
hello 606 0 - Live 0xede36000 (O)
[root@li408-34 hello]#
[root@li408-34 hello]# cd /sys/module/hello
[root@li408-34 hello]# ls
coresize  holders  initsize  initstate  notes  refcnt  sections  taint  uevent
[root@li408-34 hello]# tree -a
.
|-- coresize
|-- holders
|-- initsize
|-- initstate
|-- notes
|   `-- .note.gnu.build-id
|-- refcnt
|-- sections
|   |-- .gnu.linkonce.this_module
|   |-- .note.gnu.build-id
|   |-- .rodata.str1.1
|   |-- .strtab
|   |-- .symtab
|   `-- .text
|-- taint
`-- uevent

3 directories, 13 files
[root@li408-34 hello]# dmesg
.....
Hello, world
Goodbye, cruel world
[root@li408-34 hello]# tail -f /var/log/messages
Apr 11 11:37:59 li408-34 abrtd: Init complete, entering main loop
Apr 11 11:37:59 li408-34 init: Failed to spawn hvc0 main process: unable to execute: No such file or directory
Apr 11 11:42:23 li408-34 kernel: Hello, haoning-------------
Apr 11 11:43:56 li408-34 kernel: Goodbye, cruel world
Apr 11 11:44:12 li408-34 kernel: Hello, haoning-------------
Apr 11 13:51:49 li408-34 kernel: Goodbye, cruel world
Apr 11 13:51:59 li408-34 kernel: Hello, haoning-------------
Apr 11 14:44:21 li408-34 yum[4371]: Installed: tree-1.5.3-2.el6.i686
Apr 11 15:05:21 li408-34 kernel: Goodbye, cruel world
Apr 11 15:05:51 li408-34 kernel: Hello, world


表示内核已经正确装载了
lsmod查看模块
rmmod 删除模块

把上面ibm的的代码放到附件里了
分享到:
评论

相关推荐

    linux-2.4内核模块 helloworld

    - `make modules`: 编译内核模块。 - `make modules_install`: 将编译好的内核模块安装到系统中。 ### 二、内核模块编写 #### 2.1 模块文件结构 内核模块通常由一个或多个C源文件组成。对于本例中的“helloworld...

    ubuntu12.04编译内核模块

    Ubuntu 12.04 编译内核...本文详细介绍了在 Ubuntu 12.04 下编译内核模块的步骤,从前期准备到编写 hello.c 文件和 Makefile 文件,再到编译、加载和卸载内核模块。通过这些步骤,可以轻松地编译和加载自己的内核模块。

    08 内核模块Hello1

    【标题】: "08 内核模块Hello1" 涉及的知识点 【描述】: 描述中提到了深入理解UNIX系统内核、Linux设备驱动程序以及建立和运行Linux内核模块,这些都是与操作系统内核、设备驱动开发和内核模块编程相关的主题。 ...

    Ubuntu下内核编程之第一个模块helloworld(附源码)

    `build-essential`包含了许多基础的编译工具,如GCC编译器,而`linux-header-$(uname -r)`则提供了当前运行内核的头文件,这些头文件是编译内核模块所必需的。 接下来,我们创建一个简单的内核模块,名为“hello...

    LINUX内核模块编程

    Linux内核模块编程是Linux系统开发中的一个重要环节,它允许开发者在不重新编译整个操作系统内核的情况下,添加、修改或删除内核功能。这种方式极大地提高了系统的灵活性和可扩展性。下面将详细介绍Linux内核模块的...

    基础实验:linux内核的编译与内核模块.doc

    输入以下命令,开始编译 hello world 内核模块: [root@localhost kernel-2.6.13]# make modules 编译结束后,会在 drivers/char/ 目录下生成可动态加载的内核模块 mini2440_leds.ko。 六、加载新内核 将要下载...

    linux内核模块编程

    Linux内核模块编程是深入Linux操作系统核心的一种编程实践,它允许开发者动态地向内核添加代码(模块),而无需重新编译整个内核。这种机制极大地提高了系统的可扩展性和灵活性,使得增加、更新或删除特定功能成为...

    linux内核驱动模块模板之hello

    关于多文件编译,当一个内核模块包含多个源文件时,我们需要一个Makefile来组织编译过程。一个基本的Makefile模板可能如下: ```makefile obj-m += hello.o KERNEL_DIR ?= /lib/modules/$(shell uname -r)/build ...

    虚拟机VM Virtual Box 下ubuntu 编译内核 与 简单的Hello Word模块的添加删除教程

    ### 虚拟机VM Virtual Box 下 Ubuntu 编译内核与简单的Hello World模块的添加删除教程 #### 一、编译内核 ##### 1. 获取最新内核源码 - 首先访问[www.kernel.org](http://www.kernel.org),下载最新的Linux内核...

    HelloWorld程序编写及内核驱动

    - 将编译好的内核模块复制到目标系统。 - 重启系统,确保`HelloWorld`模块能够在系统启动时自动加载。 #### 总结 以上步骤介绍了如何从零开始创建一个简单的`HelloWorld`内核驱动程序,并将其集成到Linux内核中...

    Windows x64内核模块-HelloWorld

    Windows内核安全与驱动开发书的第一个示例程序,在新版本开发环境中调试通过,使用Visual Studio 2017加上WDK 1803环境编译。在调试过程中,由于x64驱动程序禁止使用嵌入汇编,采用Shellcode方式进行软件中断调用,...

    内核模块编写,初学者必备

    确保所使用的Red Hat Enterprise Linux 5系统已经安装了必要的开发工具包(如GCC、make等),以及内核源代码,因为这些工具对于编译内核模块至关重要。 #### 实验步骤详解 ##### 步骤一:创建工作目录 在任意位置...

    Linux内核模块实例

    Linux内核模块是Linux操作系统中一个重要的组成部分,它允许用户在不重新编译整个内核的情况下,添加、修改或删除内核功能。这对于系统管理员和开发者来说是非常实用的,因为可以动态地扩展内核功能,而不需要每次...

    linux 内核模块调用实例

    例如,我们创建一个名为`hello_world.c`的内核模块,代码如下: ```c #include #include #include MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple kernel module example")...

    linux内核模块设计实验

    对于初学者,从编写简单的“Hello World”模块开始,逐步理解内核模块的生命周期和工作原理。通过实践,不仅可以掌握内核模块的基本概念,还能深入理解Linux内核的内部工作机制,这对于Linux系统管理员和内核开发者...

    UBUNTU14.04下helloworld内核驱动源文件与makefile

    "Hello World"内核驱动程序是一个简单的起点,它可以帮助初学者熟悉内核模块的构建过程。这里我们将深入探讨如何在Ubuntu 14.04上创建并编译一个"Hello World"内核驱动,以及涉及到的关键文件。 首先,`hello.c`是...

    Linux内核驱动模块编程指南.pdf

    - **编译相关和内核版本相关的问题**:编译内核模块时需要注意内核头文件的版本与实际使用的内核版本一致,以确保模块能够正确编译并与内核兼容。 #### 三、Hello World 示例 本书通过一系列逐步深入的“Hello ...

Global site tag (gtag.js) - Google Analytics