这些天在学习linux内核编程,就在这里小小的show以下。
首先编写如下的linux代码。并命名为hello.c
这里你应该注意亮点:
第一、linux内核编程,不同于普通的用户态下的编程;有一个入口的main函数;这里的“main”函数是module_init();同时还有一个善后处理的函数:module_exit()。
第二、linux内核编程在编译的时候,不同于用户态下的编程;可以直接使用gcc编译器编译链接,就能够成为可执行的;而是需要编写一个Makefile文件,不是makefile!!这里牵扯到很多的内核态下的东西,具体的我也没弄清楚!详细的会在后面和大家分享。
hello.c  文件
  1. 1 #include <linux/module.h>
  2. 2 #include <linux/kernel.h>
  3. 3 #include <linux/init.h>
  4. 4 static int __init lkp_init(void);
  5. 5 static int __exit lkp_exit(void);
  6. 6
  7. 7
  8. 8 static int __init lkp_init(void)
  9. 9 {
  10. 10 printk("<1>Hello ,Word!\n");
  11. 11 return 0;
  12. 12 }
  13. 13
  14. 14 static int __exit lkp_exit(void)
  15. 15 {
  16. 16 printk("<2>Hello,Word exit\n");
  17. 17 }
  18. 18 module_init(lkp_init);
  19. 19 module_exit(lkp_exit);
并在hello.c的同一目录下建立Makefile文件。
Makefile文件:
  1. 1 ifneq ($(KERNELRELEASE),)
  2. 2 mymodule-objs:= hello.c
  3. 3 obj-m += hello.o
  4. 4
  5. 5 else
  6. 6 PWD :=$(shell pwd)
  7. 7 KVER := $(shell uname -r)
  8. 8 KDIR :=/lib/modules/$(KVER)/build
  9. 9
  10. 10 all:
  11. 11 $(MAKE) -C $(KDIR) M=$(PWD)
  12. 12 clean:
  13. 13 rm -rf *.o *.mod.c *.ko *.symvers *order *.markers *-
  14. 14 endif
说明:
当命令在执行make时,将调用Makefile文件。KERNELRELEASE 是在内核源代码的顶层/usr/src/linux-headers-2.6.32-33/Makefile 文件中定义的一个变量。读者如果下载的是linux-3.0的内核的话在**/linux-3.0/Makefile。当中的380行。如下:
  1. 379 # Read KERNELRELEASE from include/config/kernel.release (if it exists)
  2. 380 KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
  3. 381 KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL) ,.$(SUBLEVEL)))$(EXTRAVERSION)
     在第一次读取执行此Makefile时,变量$(KERNELRELEASE) 并没有被设置,因此第一行ifneq的条件失败,从else后面的开始执行,设置PWD、KVER、KDIR等变量。
     当make遇到标号all时,-C$(KDIR)指名跳转到内核源码目录下读取那里的Makefile。M=$(PWD),表明返回到当前的目录进行继续读入,执行当前的Makefile,也就是第二次调用make。这时的变量$(KERNELRELEASE) 已经被定义,因此ifneq成功,make将继续读取紧接在ifneq后面的内容。ifneq的内容为kbuild语句,指名模块源码中个文件之间的依赖关系和要生成的目标模块
     语句  2 mymodule-objs:= hello.c  表是mymodule.o 由hello.c生成。 语句3 obj-m += hello.o表是链接后将生成mymodule.ko模块,这个文件就是要插入内核的模块文件。
如果make的目标是clean,直接执行clean标号之后的操作,删除 一大堆的东西!执行文clean后面的rm命令之后,make整个工作就结束了!
执行效果:
  1. [#35#caopeng@laptop:~]$cd kernel/
  2. [#36#caopeng@laptop:~/kernel]$ls
  3. hello.c Makefile
  4. [#37#caopeng@laptop:~/kernel]$make
  5. make -C /lib/modules/2.6.32-33-generic/build M=/home/caopeng/kernel
  6. make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.32-33-generic'
  7. LD /home/caopeng/kernel/built-in.o
  8. CC [M] /home/caopeng/kernel/hello.o
  9. /home/caopeng/kernel/hello.c: In function ‘lkp_exit’:
  10. /home/caopeng/kernel/hello.c:17: warning: no return statement in function returning non-void
  11. /home/caopeng/kernel/hello.c: In function ‘__exittest’:
  12. /home/caopeng/kernel/hello.c:19: warning: return from incompatible pointer type
  13. Building modules, stage 2.
  14. MODPOST 1 modules
  15. CC /home/caopeng/kernel/hello.mod.o
  16. LD [M] /home/caopeng/kernel/hello.ko
  17. make[1]:正在离开目录 `/usr/src/linux-headers-2.6.32-33-generic'
  18. [#38#caopeng@laptop:~/kernel]$
编译成功!!
查看当前目录下的文件,会发现多了很多东西!如下:
  1. [#38#caopeng@laptop:~/kernel]$ls
  2. built-in.o hello.ko hello.mod.o Makefile Module.symvers
  3. hello.c hello.mod.c hello.o modules.order
  4. [#39#caopeng@laptop:~/kernel]$
这里不知道为什么生成的文件都没有x权限!这里要用到的就是hello.ko给其加上可执行权限。并使用insmod将其插入!然后用命令查看结果!
  1. [#47#caopeng@laptop:~/kernel]$sudo rmmod hello.ko
  2. [#48#caopeng@laptop:~/kernel]$sudo insmod hello.ko
  3. [#49#caopeng@laptop:~/kernel]$dmesg -c
  4. klogctl: 不允许的操作
  5. [#50#caopeng@laptop:~/kernel]$sudo dmesg -c
  6. [14651.331364] Hello,Word exit
  7. [14658.553284] Hello ,
  8. [#51#caopeng@laptop:~/kernel]$
最后要记得rmmod!!!
<script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/buttonLite.js#style=-1&uuid=&pophcol=3&lang=zh"></script> <script type=text/javascript charset=utf-8 src="http://static.bshare.cn/b/bshareC0.js"></script>

阅读(2903) | 评论(0) | 转发(0) |

0

上一篇:list.h头文件分析

下一篇:linux内核编程(二)

相关热门文章
  • Linux内核同步原语之原子操作...
  • 《编程的修炼》试读——揭秘编...
  • 代码阅读 dlm
  • 图解linux内核编译框架...
  • Linux文件描述符选择策略的讨...
  • linux 常见服务端口
  • 什么是shell
  • 【ROOTFS搭建】busybox的httpd...
  • linux socket的bug??
  • linux的线程是否受到了保护?...
  • 求教Linux 终端自动执行脚本的...
  • 以下描述的关于apache和PHP关...
  • 求教学习有关于linux 驱动方面...
  • 【趣味题】 发疯的机器人...
  • 如何安装java环境和tomcat(ub...
给主人留下些什么吧!~~
评论热议

linux内核编程(一)相关推荐

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

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

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

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

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

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

  4. Linux内核编程接口函数

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

  5. linux内核编程(hello world示例程序)

    linux内核编程(hello world) Linux可加载内核模块是 Linux 内核的最重要创新之一.它们提供了可伸缩的.动态的内核.其它开发者可以不用重新编译整个内核便可以开发内核层的程序,极 ...

  6. Linux 内核编程指南

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

  7. Linux 内核编程风格

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

  8. linux进程睡眠编程,linux内核编程-可睡眠锁之SRCU

    linux内核编程-可睡眠锁之SRCU DEFINE_SRCU DEFINE_SRCU_STATIC static修饰的定义只能在该c文件中使用,用于保护命名空间. 如果一个函数里面使用了static ...

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

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

最新文章

  1. linux hrtimer 绑定cpu,Linux hrtimer分析--未配置高精度模式
  2. SAP 创业计划 ---之三
  3. 关于搭建php电商环境时缺少fileinfo、数据库安装出错问题解决办法
  4. java中怎么找类的路径_Java中获取类加载路径和项目根路径的5种方法
  5. SAP BRF+ Interpretation模式与Generation模式的区别
  6. Yet Another Walking Robot CodeForces - 1296C
  7. java并发编程面试
  8. 量子通信入门相关书籍
  9. ftp协议是一种用于_______的协议_网络安全常见协议解析:TCP、UDP、HTTP、FTP、SMTP等之间的区别...
  10. SAP License:SAP精细化的应收付及要素为根设计思想
  11. gitlab 本地 定时备份
  12. 程序包androidx.appcompat.app不存在
  13. Windows下创建TFTP服务器,uboot访问,下载镜像
  14. android u盘加密代码,怎么用安卓手机给u盘加密
  15. JavaEE高级框架学习笔记(八)Struts高级ActionForm
  16. maven No plugin found for prefix ‘G‘ in the current project and in the plugin groups
  17. 解决大多数pip install出现Could not install packages due to an EnvironmentError错误
  18. Android PPP协议
  19. android之WebView应用
  20. 鸿蒙应用分身,应用分身怎么设置?按照这个步骤操作,分分钟即可搞定它

热门文章

  1. Linux i2ctool 工具的使用方法
  2. 【转载】yafu的安装及使用(线下工具与线上网站)
  3. 三、逻辑结构与存储结构的区分
  4. XCP实战系列介绍04-CANape工程配置超详细介绍
  5. stem教育什么意思
  6. 运筹学 五、运输问题
  7. VS2008 MFC类库精讲:使用MFC V9.0类库及新版Office Fluent UI实现CAD系统
  8. Heritrix3.1.1使用教程
  9. 北理工乐学C语言 47. 【大学】北理工的恶龙
  10. Android 百度地图之路径规划