Linux内核源码树建立加载hello模块

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

  首先,要先知道你的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 0;
 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.0-30/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模块的输出

  

时间: 2024-11-08 04:43:25

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

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作

linux内核设计的艺术--加载内核代码

在BIOS触发0x19中断将磁盘的第一个扇区(512B)加载到内存中后,计算机才真正开始执行磁盘上的程序.而这512B的程序bootsect.s中的第一批代码,此时处理器还处于实模式内存寻址的最大范围是1M(0x0000-0xFFFF),接下来我们看看在bootsect.s的第一批代码中做了些什么? SYSSIZE = 0x3000 //内核程序的大小 SETUPLEN = 4 //要加载的setup程序长度单位为扇区数 BOOTSEG = 0x07c0 //启动扇区被BIOS加载的位置,也就是

linux内核-源码树(2.6.32) - 枯鱼的博客

/home/fishcried/Code/linux-2.6.32.61/ ├── arch 特定体系结构的源码,每个体系结构都有一个目录. │?? ├── ... │?? ├── x86 │?? │?? ├── boot 引导相关 │?? │?? │?? ├── compressed 压缩内核处理 │?? │?? │?? └── tools 生成压缩内核镜像的程序 │?? │?? ├── configs │?? │?? ├── crypto │?? │?? ├── ia32 │?? │?? ├

Linux的内核源码树的根目录下的每个文件的含义简介

在下载Linux内核源码包解压后,Linux的内核源码树的根目录的每一个含义看不太明白,估计每个喜欢研究内核源码的小伙伴刚开始都会有此疑问,因此,在这里对Linux内核源码的根目录的每个文件包做些简介,让喜欢研究内核源码的小伙伴对内核这个看起来特别神秘且复杂的东西有个大体的了解. 具体的详情请见下表: Linux 内核源码树的根目录描述 目录 含义描述 arch 特定体系结构的源码 block 块设备 I/O层 crypto 加密API Documentation 内核源码文档 drivers

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

刚看 O'REILLY 写的<LINUX 设备驱动程序>时.作者一再强调在编写驱动程序时必须 建立内核树.先前的内核只需要有一套内核头文件就够了,但因为2.6的内核模块吆喝内核源码树中的目标文件连接,通过这种方式,可得到一个更加健壮的模块 装载器,但也需要这些目标文件存在于内核目录树中.所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式.那怎么建立呢?为此上网“翻云覆 雨”起来而结果却是“惨败而归“. 为此托了一天又4个小时(当然包括吃饭睡觉的时间),连个简单的 hello wr

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

一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低.若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间. 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行

linux内核源码注解

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

轻松学习linux内核源码的方法

轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件组织:1.Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核心(例如2.0.30)都是一个稳定地发行的核心,而任何奇数的核心(例如2.1.42)都是一个开发中的核心. 本文基于稳定的2.2.5源代码,第二部分的实现平台为 RedHat Lin

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

本html页面地址:http://oss.org.cn/kernel-book/ 深入分析Linux内核源码 前言         第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核            1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义         1.4.1 开发适合自己的操作系统 1.4.2 开发高水平软件 1.4.3 有助于计算机科学的教学和