linux内核编程(hello world示例程序) 男娘i 2022-06-18 12:17 211阅读 0赞 # 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.c 0 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 -O0 build: kernel_modules kernel_modules: #make -C /lib/modules/`uname -r`/build M=$(PWD) modules make -C /lib/modules/$(KERNEL_VER)/build M=$(PWD) modules clean: 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函数) ![简单 LKM 的源代码视图][LKM] 在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][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][http_blog.csdn.net_qq_15437667_article_details_69831509] [LKM]: /images/20220618/63bfc4f0f88d4f80aa3feb9586844682.png [https_github.com_Miss-you_kernel-netfilter-sample-code]: https://github.com/Miss-you/kernel-netfilter-sample-code [http_blog.csdn.net_qq_15437667_article_details_69831509]: http://blog.csdn.net/qq_15437667/article/details/69831509
相关 Java编程入门:简单Hello World程序详解 在Java编程入门阶段,"Hello World"程序是第一个要理解和编写的例子。下面详细解释一下这个程序: 1. **程序结构**: ```java public clas ﹏ヽ暗。殇╰゛Y/ 2024年09月11日 18:39/ 0 赞/ 6 阅读
相关 hello world_Hello World CGI hello world A CGI script can be as simple or complex as you need it to be. It could be 旧城等待,/ 2022年12月06日 15:23/ 0 赞/ 253 阅读
相关 Linux网络编程——libevent库Hello World程序 libevent介绍 1 事件驱动, 高性能, 轻量级, 专注于网络 2 源代码精炼, 易读 3 跨平台 4 支持多种I/O多路复用技术, 如epoll se 以你之姓@/ 2022年09月04日 09:48/ 0 赞/ 143 阅读
相关 Linux 模块编程-hello world 的准备工作 Linux运行时分为用户空间和内核空间两个部分。这个有点儿现在的体制内和体制外的区别,同时运行,但是运行的环境和所使用的规则不一样。用户空间运行的叫程序(APP),都有个 r囧r小猫/ 2022年08月11日 10:28/ 0 赞/ 130 阅读
相关 linux内核编程(hello world示例程序) linux内核编程(hello world) > Linux可加载内核模块是 Linux 内核的最重要创新之一。它们提供了可伸缩的、动态的内核。其它开发者可以不用重新编译 男娘i/ 2022年06月18日 12:17/ 0 赞/ 212 阅读
相关 RMI——hello world程序 RMI——hello world程序 RMI作为分布式的基础之一,主要用来解决的问题是两个jvm进程间通讯的问题。RMI可以用作提供统一的服务接口和实现,方面各个系统间统 迈不过友情╰/ 2022年06月13日 04:52/ 0 赞/ 160 阅读
相关 第一个Java程序示例——Hello World! <table style="table-layout:fixed;width:820px;color:rgb(68,68,68);font-family:Tahoma, 'Mi 谁借莪1个温暖的怀抱¢/ 2022年05月26日 09:29/ 0 赞/ 198 阅读
相关 springBoot创建示例(Hello World) 创建一个简单的web项目,利用spring Boot ![2018053111083045][] ![20180531110838521][] ![20180 淡淡的烟草味﹌/ 2022年05月26日 06:20/ 0 赞/ 159 阅读
相关 第一个Java程序示例——Hello World! 跟随世界潮流,第一个Java程序输出“Hell World!”。 通过Eclipse运行程序 启动Eclipse,在菜单中选择“文件 --> 新建 --> Java项目 缺乏、安全感/ 2022年05月24日 08:41/ 0 赞/ 194 阅读
还没有评论,来说两句吧...