转:http://www.groad.net/bbs/read.php?tid-1006.html

程序代码

引用
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init (void)
{
    printk("hello linux kernel\n");
   
    return 0;
}

static void hello_exit (void)
{
    printk("bye..lwave from the kernel\n");
   
}

module_init(hello_init);
module_exit(hello_exit);

编译方法( 只针对 2.6 内核 )

编写 Makefile 文件,Makefile 文件内容很简单,只有一行:

引用
obj-m := hello.o

执行命令

引用
beyes@linux-beyes:~/C/kernel> make -C /usr/src/linux-2.6.30 M=`pwd` modules
make: Entering directory `/usr/src/linux-2.6.30'
  CC [M]  /home/beyes/C/kernel/hello.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/beyes/C/kernel/hello.mod.o
  LD [M]  /home/beyes/C/kernel/hello.ko
make: Leaving directory `/usr/src/linux-2.6.30'
引用
beyes@linux-beyes:~/C/kernel> ls
hello.c  hello.ko  hello.mod.c  hello.mod.o  hello.o  Makefile  Module.markers  modules.order  Module.symvers

说明

经过以上简单几步后,即生成了一个简单的模块。这个模块在加载之后,属于内核空间,是内核空间的一部分,而不是用户空间。

在 2.6 内核版本里,编译模块,首先需要有一份完整的,编译了的内核源代码树。编译内核见:

http://www.groad.net/bbs/read.php?tid=770

在 Makefile 文件里,obj-m 名字不能改变成别的,假如写成 objj-m ,那么编译后并不会输出 hello.ko 内核模块文件,而是只有:

引用
make: Entering directory `/usr/src/linux-2.6.30'
  Building modules, stage 2.
  MODPOST 0 modules
make: Leaving directory `/usr/src/linux-2.6.30'
beyes@linux-beyes:~/C/kernel> ls
hello.c  Makefile  Module.markers  modules.order  Module.symvers

假如要从两个源文件里编译得到一个名为 module.ko 的模块,那么 Makefile 文件可写成:

引用
obj-m := module.o
module-objs := file1.o file2.o

在编译命令 make -C /usr/src/linux-2.6.30 M=`pwd` modules 中,
-C 参数后面接内核源码树路径,这是个顶层路径,也就是说在这目录下可以找到编译内核的 Makefile 文件;
M= 选项使 "makefile" 移动回到所要编译的源码所在的目录下。也就是说,一开始,需要找到内核源码树下的 Makefile,然后需要再找到欲编译源码下的 Makefile

转载于:https://blog.51cto.com/jkers/670174

hello world 简单内核模块相关推荐

  1. _Linux内核分析(二)-内核模块简介和简单内核模块实现

    一.Linux内核模块简介 1. 何为内核模块 在上一篇博文中我们先通过内核配置,在配置的过程中我们对内核的组件进行了选择(当然这个选择决定了我们内核的大小),然后才生成了我们最终的内核,那么我们如果 ...

  2. 从零开始学Linux内核驱动--(二)简单内核模块驱动程序

    Linux驱动–(二)简单的内核模块驱动程序 一.概述 Linux中所有的驱动都是以内核模块的形式来实现的,他们与其他所有的内核编译在一起形成一个单独的内核镜像文件(所以说Linux是一个宏内核).当 ...

  3. Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld

    文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...

  4. Linux Rootkit 系列五:感染系统关键内核模块实现持久化

    前言 照旧,本文所需的相关代码位于如下代码仓库:Github 测试建议:为了愉快地 Happy Hacking,请不要在物理机玩火. 概要 本文分为两大部分, 第一部分是基于链接与修改符号表感染并劫持 ...

  5. java中include标签的用法_原 ng-include用法分析以及多标签页面的简单实现方式

    在平时的项目开发中,应该会经常遇到上图所示的需求,就是在一个页面中有多个标签,被选中的标签颜色会高亮显示,切换不同标签显示相应的不同内容.如果内容代码过多则写在同一个html文件就会显得特别乱,所以这 ...

  6. Linux设备驱动02:Linux内核模块

    目录 1. 内核模块概述 1.1 引入原因 1.2 内核模块含义 1.3 内核模块构成 2. 内核模块操作命令 2.1 加载模块 2.2 卸载模块 2.3 查看模块信息 2.3.1 lsmod 2.3 ...

  7. Mach-O 二进制文件解析

    0x01  Mach-O格式简单介绍 Mach-O文件格式是 OS X 与 iOS 系统上的可执行文件格式,类似于windows的 PE 文件 与 Linux(其他 Unix like)的 ELF 文 ...

  8. 深入分析Linux内核源码oss.org.cn/kernel-book/

    本html页面地址:http://oss.org.cn/kernel-book/ 深入分析Linux内核源码 前言         第一章 走进linux 1.1 GNU与Linux的成长 1.2 L ...

  9. Linux 进程管理剖析--转

    地址:http://www.ibm.com/developerworks/cn/linux/l-linux-process-management/index.html Linux 是一种动态系统,能够 ...

最新文章

  1. 数据结构笔记--二叉查找树概述以及java代码实现
  2. java 手机号隐藏_Java隐藏银行卡号或者手机号中间几位,用*号代替工具类实现HideDataUtil...
  3. 21IC上关于stm32 option bytes的操作帖子记录
  4. 在.net 2.0/3.0程序中使用扩展方法
  5. 一台电脑,内外网同时使用
  6. python 爬虫 糗百成人
  7. 怎么把苹果手机通讯录导入华为手机_批量Excel表格号码导入苹果、安卓智能手机通讯录...
  8. Jdom的安装和使用
  9. 利用VLMCSD部署本地KMS服务器(Windows + CentOS7)
  10. 如何方便手机在线抖音去水印更有热门技巧
  11. 全球AI泰斗Stuart Rusell:研究人工智能太诱人了,不可抗拒
  12. 开发Android应用赚钱
  13. 花卉拍摄技巧 8 — 荷莲
  14. 制作立体图像(上):红蓝眼镜原理
  15. 马悦凌:从初级护士到“民间奇医”[1]
  16. Bean Definition到底是什么,附spring思维导图分享
  17. 【学习笔记】斯坦福SCI写作课 Unit 1
  18. SpringCloud DataFlow — 0. 本地部署
  19. 【日期】找找哪些日期是星期几
  20. java截取字符串中间的某个部分

热门文章

  1. 4个轮子+1部手机=长城眼里的智能汽车现状
  2. 安卓之父的手机创业项目卖了!这个华人接手,谷歌风投还投了钱
  3. arXiv灌水机:机器自动生成论文标题、摘要信息,还有40+奇妙AI应用
  4. 微软日本每周只上四天班,销售额提升39.9%!网友:老板快来看啊
  5. 新工具一键安装Java环境!微软又双叒叕造福开发者
  6. Mybatis入门之动态sql
  7. 猎八哥浅谈存储过程——数据库中的双刃剑
  8. 定制适合自己的精简桌面环境
  9. 自定义用户验证控件CustomValidator
  10. shell 输入输出脚本