Linux内核-模块编译和安装
我安装Ubuntu的时候是没有安装源码的,在没有安装源码前 /usr/src/ 目录下是只有两个包含内核的头文件的文件夹的:

我的内核版本是:

所以接下来就是先安装内核源码:

执行后,/usr/src / 目录就多了两个文件夹:

这样源码就下载下来了,然后将源码解压:

解压之后 /usr/src/linux-3.13.0/文件夹里面的就是内核源码了.
然后再对源码进行编译.
先进入/usr/src/linux-3.13.0/ 文件夹:

然后依次执行 make oldconfig , make prepare , make scripts :



到这里源码算上安装完毕了吧.
Linux内核目录结构
=>/arch:该子目录包括了所有和体系结构相关的内核代码.它的每一个子目录都代表一种支持的体系结构.
=>/include:该子目录包括编译内核所需要的大部分头文件,与平台无关的文件在 /include/ude/linux子目录下,与intel cpu 相关的头文件在 /include/asm-i386子目录下,而 /includes/scsi/目录则是有关scsi设备的头文件目录.
=>/init:该子目录包含内核的初始化代码.
=>/mm:该子目录包括所有独立于cpu体系结构的内存管理代码,如页式存储管理内存的分配和释放等;而和体系结构相关的内存管理代码则位于 /arch/*/mm/例如 /arch/x86/mm/fault.c
=>/kernel:主要的核心代码,此目录下的文件实现了大多数linux系统的内核函数,其中最重要的文件当属sched.c;同样,和体系结构相关的代码在/arch/*/kernel中
=>/drivers:放置系统所有的设备驱动程序;每种驱动程序有占用一个子目录.
=>/net:核心与网络相关的代码.
=>/ipc:核心的进程间通信的代码.
=>/fs:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持一个文件系统.
下面就来简单来实现一个Hello World 吧!
在开始之前,还是先了解一下Linux内核模块机制吧!
模块(Module)机制:用户可以根据需要,在不需要对内核重新编译的情况下,可以将模块动态地载入或移出内核.
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行,它在运行时被链接到内核,作为内核的一部分在内核空间运行.
模块通常由一组函数和数据结构组成,用来实现一种文件系统,一个驱动程序或其他内核上层的功能.
内核模块是Linux 内核向外提供的一个插口,其全称为动态可加载内核模块(Loader Kernel Module , LKM),简称为模块.
模块编程
内核模式下编程有一些限制:
I. 不能使用用户模式下的C标准库,因为内核模式下不存在lib库,也就没有这些用户函数供使用.
II. 不能使用浮点运算,因为Linux内核切换模式时不保存处理器的浮点状态.
III. 尽可能保持代码的清洁整齐,因为内核调试不方便,简洁的代码能减少并方便后期调试.
IV. 模块编程和内核版本密切关联,因为不同的内核版本中某些函数的函数名会有变化.因此模块编程也可以说是内核编程.
V. 只用超级用户可以对其运行.
开始我们的Hello World!
没有编译前的目录结构:

首先编辑 hello.c文件:
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h> static int hello_init(void)
{
printk("Hello word");
return ;
}
static void hello_exit(void)
{
printk("Goodbye world");
} module_init(hello_init);
module_exit(hello_exit); MODULE_LICENSE("GPL");
然后编辑makefile文件:
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
PWD:=$(shell pwd)
KDIR:=/lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.mod.c *.ko *.symvers *.order *.markers
endif
编辑完成,检查无错后,执行make指令:

然后,编译完成后在看一下目录结构:

产生了许多中间文件,其中 .o文件是对象文件, .ko文件是kernel object .
接下来就可以安装模块了(insmod 模块名.ko)
没有任何输出,说明安装成功了.
我们不能在控制台看到我们自己编写的模块的输出,因为这时内核编程,只能通过查看系统日志来看我们的输出.使用 dmesg | tail -1 产看输出,也可以直接查看日志文件.

出现hello: module verification failed: signature and/or required key missing - tainting kernel 不影响模块的加载.
最后模块退出(rm mod 模块名):

这样一个hello World 就完成啦!
对于 hello.c文件的模块编程还是有必要说明一下的.

Linux内核-模块编译和安装的更多相关文章
- Linux内核配置编译及基本调试方法
一.Linux内核配置编译 1. 交叉编译设置:make ARCH=arm CROSS_COMPILE=arm-linux- 注:也可以直接修改顶层Makefile ARCH ?= arm CROSS ...
- ACE-6.1.0 linux 下的编译与安装步骤
ACE-6.1.0 linux 下的编译与安装步骤 引用至http://www.cnblogs.com/liangxiaxu/archive/2013/03/07/2948417.html 1.从 ...
- 【Linux内核】编译与配置内核(x86)
[Linux内核]编译与配置内核(x86) https://www.cnblogs.com/jamesharden/p/6414736.html
- Linux内核的编译安装
前言 Linux内核是Linux操作2347系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性.内核主要功能包括进程管理.内存管理.文件管理.设备管理.网络管理等.Linux内 ...
- inux内核的编译与安装 (转)
1.查看ubuntu版本号: xdj@xdj-MS-:~$ sudo lsb_release -a [sudo] password for xdj: No LSB modules are availa ...
- 在Linux CentOS上编译并安装Clang 3.5.0
编译CoreCLR需要Clang 3.5,而CentOS上安装的是Clang 3.4.2(yum repos中最新版也是这个),只能自己手工编译LLVM的源代码进行安装. (注:CentOS的版本是6 ...
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
宿主机:Ubuntu16.04 x64(Linux内核4.4.0) 交叉编译工具链:gcc-arm-linux-gnueabiarm-linux-gcc:4.4.3QEMU:2.5.0Linux ke ...
- 配置 Windows 下的 nodejs C++ 模块编译环境 安装 node-gyp
配置 Windows 下的 nodejs C++ 模块编译环境 根据 node-gyp 指示的 Windows 编译环境说明, 简单一句话就是 "Python + VC++ 编译环境&quo ...
- Linux下samba编译与安装(Ubuntu和嵌入式linux)
Ubuntu[i386-linux下安装过程] 1.安装samba $ sudo apt-get install samba $ sudo apt-get install smbfs (可选) $ s ...
随机推荐
- TCP拥塞控制
TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. 几个相关 ...
- jsp 页面 性别回显
采用ognl的方式来获取 <tr> <td>性别</td> <td><s:radio name="gender" list=& ...
- spring boot学习
window10的环境下 使用apache-maven-3.3.9 到https://github.com/spring-projects/spring-boot 下载源码包,解压到c:\spring ...
- JSF框架认识
JSF框架 编辑 JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架(是Java Community Process 规定的JSR-127标准).它提供了 ...
- js中style.display=""无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- jQuery.outerWidth() 函数详解
outerWidth()函数用于设置或返回当前匹配元素的外宽度. 外宽度默认包括元素的内边距(padding).边框(border),但不包括外边距(margin)部分的宽度.你也可以指定参数为tru ...
- servlet 配置
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.web.s ...
- Checked 和 UnChecked 异常 的使用场合
异常的概念 任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个子类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的 ...
- js事件知识整理
鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮……),则触发mousedown ...
- backbonejs中的模型篇(一)
一:模型及属性 模型是MVC应用的基石,它负责存放应用所需的数据,对数据的验证,执行访问控制,以及实现应用所需的特定业务逻辑. backbone通过扩展Backbone.Model对象来定义一个模型. ...

