linux内核编程(hello world)

Linux可加载内核模块是 Linux 内核的最重要创新之一。它们提供了可伸缩的、动态的内核。其它开发者可以不用重新编译整个内核便可以开发内核层的程序,极大方便了驱动程序等的开发速度。

本系列文章主要是记录个人从hello world开始,通过学习linux内核基本编程操作,再对ipvs负载均衡器源码进行初步学习分析;最后,基于netfilter机制(其实是iptables的xtables-plugin)完成一个报文转发工具,xt_GTPU工具。

基础环境:腾讯云虚拟机(最便宜的那种),ubuntu 14.04

hello world!

内核编程,当然最开始也是要从经典的hello world开始。

目录结构如下:

feiqianyousadeMacBook-Pro:helloworld yousa$ tree
.
├── Makefile
└── helloworld.c0 directories, 2 files

示例代码(命名此文件为helloworld.c)

#include <linux/init.h>
#include <linux/module.h>static int helloworld_init(void) {printk(KERN_INFO "hello world!\n");return 0;
}static int helloworld_exit(void) {printk(KERN_INFO "see you.\n");return 0;
}module_init(helloworld_init);
module_exit(helloworld_exit);

makefile文件(命名此文件为Makefile)

KERNEL_VER = $(shell uname -r)# the file to compile
obj-m += helloworld.o# specify flags for the module compilation
EXTRA_CFLAGS = -g -O0build: kernel_moduleskernel_modules:#make -C /lib/modules/`uname -r`/build M=$(PWD) modulesmake -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modulesclean:make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) clean

编译好之后执行make即可;编译成功之后,会有一个helloworld.ko文件,使用insmod命令加载模块

sudo insmod helloworld.ko

使用lsmod | grep hello可以看到已经加载了该内核模块

ubuntu@VM-7-212-ubuntu:~/kernel-code/kernel-netfilter-sample-code/helloworld$ lsmod | grep hello
helloworld             16384  0

使用dmesg | tail -n 20可以查看hello world相应的打印

内核模块

内核模块(linux kernel module–LKM)与直接编译到内核或典型程序的元素有根本区别。典型的程序有一个 main 函数,而内核模块 包含 entry 和 exit 函数。当向内核插入模块时,调用 entry 函数,从内核删除模块时则调用 exit 函数。因为 entry 和 exit 函数是用户定义的,所以存在 module_init 和 module_exit 宏,用于定义这些函数属于哪种函数和告知内核在加载/卸载对应模块时需要执行哪个函数。内核模块还包含一组必要的宏和一组可选的宏,用于定义模块的许可证、模块的作者、模块的描述等等。

(代码中的entry函数就是static int helloworld_init(void),exit函数是static int helloworld_exit(void),它们最后使用module_init 和 module_exit 宏告知内核加载时调用helloworld_init函数和退出时调用helloworld_exit函数)

在2.6版本之后(当前基本都是linux内核2.6以后的了吧……),可以通过insmod/rmmod等命令操作内核,其主要命令如下:

  1. insmod: 将模块插入内核中,使用方法:#insmod XXX.ko
  2. rmmod: 将模块从内核中删除,使用方法:#rmmod XXX.ko
  3. lsmod: 列表显示所有的内核模块,可以和grep指令结合使用。使用方法:#lsmod | grep XXX
  4. modprobe: modprobe可载入指定的个别模块,或是载入一组相依赖的模块。modprobe会根据depmod所产生的依赖关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。依赖关系是通过读取 /lib/modules/2.6.xx/modules.dep得到的。而该文件是通过depmod 所建立。
  5. modinfo: 查看模块信息。使用方法:#modinfo XXX.ko

源码信息

代码github

https://github.com/Miss-you/kernel-netfilter-sample-code

其中helloworld是在helloworld目录下

遇到的问题

make: * /lib/modules/4.4.0-53-generic/build: 没有那个文件或目录。 停止。

参照链接

http://blog.csdn.net/qq_15437667/article/details/69831509

linux内核编程(hello world示例程序)相关推荐

  1. Linux 内核编程指南

    Linux 内核编程指南   PeterJay Salzman MichaelBurian OriPomerantz Copyright© 2001 Peter Jay Salzman 2007−05 ...

  2. linux内核_Linux驱动编程的本质就是Linux内核编程

    由于Linux驱动编程的本质属于Linux内核编程,因此我们非常有必要熟悉Linux内核以及Linux内核的特点. 这篇文章将会帮助读者打下Linux驱动编程的基础知识. 本篇文章分为如下三个小节进行 ...

  3. Linux内核编程接口函数

    Linux内核编程接口函数 转载请注明出处: http://blog.csdn.net/drivelinux/article/details/8656280 字符设备相关函数 1.alloc_chrd ...

  4. Linux 内核编程风格

    Linux 内核编程风格 (518 个字於此篇帖子) (已阅读: 1177 次) 这篇短小的文章是对Linux内核编程风格的建议.编程风格非常的个性化,而且,我并不想将我的观点强加给任何人,但是为了变 ...

  5. linux内核编程_内核线程kthread_run

    linux内核编程_内核线程kthread_run 1. 简述: 2. 使用示例: 3. 详述: 1. 简述: 头文件: include/linux/kthread.h 数据类型: struct ta ...

  6. 由尚德linux内核编程进阶教材,由尚德老师Linux内核编程入门视频教程

    由尚德老师讲解的Linux内核编程教程入门课程,此课程学完后可以接着学进阶篇,下载地址:http://blog.csdn.net/congxue/archive/2009/05/17/4194112. ...

  7. 初探linux内核编程,参数传递以及模块间函数调用

    一.前言 我们一起从3个小例子来体验一下linux内核编程.如下: 1. 内核编程之hello world 2. 模块参数传递 3. 模块间函数调用 二.准备工作 首先,在你的linux系统上面安装l ...

  8. Windows SDK编程之一 窗口示例程序

    /*Win32应用程序框架主要由"初始化窗口类","窗口注册类","窗口的创建"以"窗口消息函数"等组成*/ #incl ...

  9. 【华为云技术分享】Linux内核编程环境 (1)

    在上一期中,我们介绍了Linux内核的源码结构,这一期我们介绍Linux内核编程环境,首先介绍的是Linux内核的编译方法. 一.Linux内核编译方法 本期中我们以Linux 4.19.94版内核来 ...

最新文章

  1. linux centos使用xrdp远程界面登陆
  2. 为什么说“概率”带来一场现代革命?
  3. 危机管理计划书模板_免费领!40套商业计划书PPT模板+10份知名公司商业计划书真实案例范文...
  4. 地址栏中的问号有什么作用
  5. [leetcode]1137. 第 N 个泰波那契数
  6. 《.NET内存管理宝典》在京东上架销售啦!
  7. 关于DateTime和String转换的容易犯得错误
  8. iphone固件降级_iPhone无法开机怎么办?三种快速维修方法
  9. 目标检测——模型的快速验证
  10. 马斯克宣布:半年后发布定制AI芯片,特斯拉车主免费升级Hardware 3
  11. 为什么要使用Iocomp控件?
  12. 【C++游戏引擎Easy2D】基于基础类型学习使用核心Game+Window+Input详解
  13. ps4html5播放器,PS4终获得全新媒体播放器 允许从PC或U盘串流媒体
  14. 将数字转换为中文大写(缩写)
  15. 51单片机流水灯现象2
  16. python文件管理api_python调用有道智云API实现文件批量翻译
  17. bestcoder#22NPY and girls
  18. 启用视口着色:在视图窗口实时显示灯光照明效果_daiding
  19. 代码题--C++--小米--英文句子字符串反转
  20. 集成学习算法策略 Boosting和Bagging

热门文章

  1. 健康医疗数据安全指南内容
  2. MySQL_启动_Windows
  3. java怎么把背景设成纯透明,怎么把BufferedImage设置背景为透明
  4. Android之CardView
  5. vim的文件比较功能
  6. 组播IP与组播Mac的对应关系
  7. 泽塔云:紧盯用户需求,用差异化竞争和技术创新赢得超融合云计算市场
  8. 微信小程序将身份证隐藏、手机号、姓名用****代替
  9. 图像数据标准化与归一化
  10. 用sed删除文件中指定行