在加载模块之前,书中说要先建立内核源码树,那么,如何建立内核源码树呢?

  首先,要先知道你的OS的内核版本,用uname -r可以查得到

  

  在/url/src/目录下可以看到对应的版本目录

  

  如果没有可以用apt-cache search linux-source获取内核

  

  用sudo apt-get install linux-source-3.13.0下载内核

  下载完成后在该文件夹中产生一个对应的压缩文件 linux-source-3.13.0.tar.bz2

  然后解压该文件tar jxvf linux-source-3.13.0.tar.bz2

  进入解压后的目录

  然后进入root权限su (这里进入失败提示 Authentication failure),在终端中输入如下命令: 
  sudo passwd 
  Password:你当前的密码 
  Enter new UNIX password:这个是root的密码 
  Retype new UNIX password:重复root的密码 
  然后会提示成功的信息。

  输入指令make oldconfig开始配置内核。

  之前上网查资料看到配置内核要用一个小时左右,但我输入指令后输出

  

  资料说配置完成后会在/lib/modules下生成新的目录/lib/modules/3.16.0-30-generic/

  在该目录ls一下发现已经存在了这个目录= =!也就是原来系统已经存在内核源码树了。

  

  既然内核源码树已经存在,下面我们要做的就是将hello模块加载到内核中。

  下面是hello的源代码

  

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. MODULE_LICENSE("Dual BSD/GPL");
  4. static int hello_init(void)
  5. {
  6. printk(KERN_ALERT "Hello, world\n");
  7. return ;
  8. }
  9. static void hello_exit(void)
  10. {
  11. printk(KERN_ALERT"Goodbye, cruel world\n");
  12. }
  13. module_init(hello_init);
  14. module_exit(hello_exit);

  给代码编写Makefile文件

  1. obj-m := hello.o
  2. KERNELDIR := /lib/modules/3.16.-/build
  3. PWD := $(shell pwd)
  4. modules:
  5. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  6. modules_install:
  7. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

  运行make

  

  生成相应的hello.ko文件

  

  然后加载hello.ko模块,注意要在root模式下加载,然后lsmod查看加载的模块(书中说会在控制台输出hello world ,但是我的控制台没有输出)

  

  卸载模块

  

  虽然控制台没有进行输出,但是可以在/var/log/syslog下查看hello模块的输出

  

Linux内核源码树建立加载hello模块的更多相关文章

  1. 构建linux内核源码树

    编写驱动程序时,需要内核源码树的支持.内核源码树时从内核源代码编译得到的.下面开始构造内核源代码的步骤.以Ubuntu为例子 1. 下载内源代码,位置www.kernel.org. (注意:源码树内核 ...

  2. linux 2.6.xx自动加载kvm模块

    在文件夹/etc/udev/rules.d/中添加文件65-kvm.rules,文件内容如下: KERNEL=="kvm", MODE="0660", GROU ...

  3. Linux内核树的建立-基于ubuntu系统

    刚看 O'REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目 ...

  4. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

  5. linux内核源码注解

    轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...

  6. 和菜鸟一起学linux内核源码之基础准备篇

    来源:http://blog.csdn.net/eastmoon502136/article/details/8711104 推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学 ...

  7. Linux内核源码特殊用法

    崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要 ...

  8. Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程

    在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用 ...

  9. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

随机推荐

  1. .Net中的并行编程-6.常用优化策略

                本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...

  2. 03Mybatis_mybatis框架原理——执行流程

    mybatis的框架的原理(执行流程).

  3. pagePiling.js - 创建漂亮的全屏滚动效果

    全屏滚动效果是最近非常流行的网页设计形式,带给用户良好的视觉和交互体验.pagePiling.js 这款 jQuery 插件可以帮助前端开发人员轻松实现这种效果.支持所有的主流浏览器,包括IE8+,支 ...

  4. 【HTML5】浅析HTML5应用程序缓存(ApplicationCache)

    一.为什么需要Web应用程序缓存 在移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无法访问网站,这对于web的伤害是很大的    ...

  5. 高性能javascript学习笔记系列(4) -算法和流程控制

    参考高性能javascript for in 循环  使用它可以遍历对象的属性名,但是每次的操作都会搜索实例或者原型的属性 导致使用for in 进行遍历会产生更多的开销 书中提到不要使用for in ...

  6. silverlight如何通过单独部署的WCF站点访问sharepoint2013的图片库

    最近有项目silverlight通过单独部署的WCF站点访问sharepoint2013的图片库,需要做个笑脸墙效果如下: 结果开发完毕后无法在SP站点显示出来.使用VS自带的WCF工具进行测试.如下 ...

  7. Python将Excel生成SHP

    #!/usr/bin/env python # -*- coding: utf-8 -*- import gdal import xlrd import shapefile # open the ex ...

  8. AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 <?xml vers ...

  9. Maven版本与JDK版本

    http://maven.apache.org/docs/history.html

  10. CSS 选择器 关系

    常见的基于关系的选择器 选择器        选择的元素 A E    元素A的任一后代元素E (后代节点指A的子节点,子节点的子节点,以此类推) A > E   元素A的任一子元素E(也就是直 ...