Linux内核模块设计
内核的设计有两种方式:单内核和微内核,两者各有优劣,关于两者的比较可以参见wiki.windowds和Solaris采用微内核结构.
Linux内核采用单内核结构,设计比较简单,但单内核的理念是把所有的功能集成到一块儿,所以必然会导致内核的体积变大,然而事实是Linux内核体积并不大.因为Linux在设计的时候借鉴了微内核的设计思想,将内核模块化,用到的功能模块在使用的时候再加载.然而这又导致了一个问题,万一内核中没有对应硬盘的驱动模块,那么内核将无法在硬盘上展开,为了解决这个问题设计了一个过度的产物initrd,其中rd就是ram disk的意思,用于顺利将内核展开到硬盘上,等完成任务后就退出,然后内核可以根据系统需要装载相应的模块.
在我的debian8系统上,"/lib/modules/内核版本号"这个目录下保存了所有的以.ko结尾的内核模块,共183MB,需要的时候可以加载对应的模块,而内核文件保存在/boot目录下,只有3MB大小.所以真正的内核是由"内核核心"和"内核模块"两部分组成的,核心位于/boot/vmlinuz-version,各内核模块(.ko)位于/lib/modules/version.
内核在初始化的过程中会完成下个任务:
1.设备探测
2.驱动初始化,可能会从initrd 文件中装载驱动模块,从这个角度看initrd可以看成一个临时的linux系统,这个临时系统系统中集成了比较全的硬件驱动(在我的dbeian8上 initrd.img-3.16.0-4-amd64有16MB大)可以顺利地帮内核完成对即将要展开系统的硬盘的初始化,当它的使命完成之后就退出.
3.以只读方式挂载根文件系统.
4.装载第一个用户空间进程init进程,PID为1,在不同的系统上可能略有不同,主要有upstart和systemd等.
用户空间想要和内核空间打交道可以通过/proc 和 /sys 这两个伪文件系统,所谓伪文件系统是指这两个目录下的文件都是假的,我曾经尝试用vim编辑这下面的文件,结果提示错误.所以这两个目录下的文件实际上是一些内核参数,文件本省并不存在.而且大部分文件是只读的.然而/proc/sys这个目录下的文件是可写的,但是要用echo > /proc/sys/filename的方式修改内核参数.例如,我可以修改/proc/sys/net/ipv4/ip_forward 为1,开启数据包转发功能,echo 1 > ip_forward,这种方式比较麻烦,其实有一个系统管理工具sysctl(configure kernel parameters at runtime)可以方便地修该内核参数,具体使用方法参见man手册,比如修改/proc/sys/kernel/hostname 可以用sysctl kernel.hostname=asen修改主机名,这种方式会立即生效,但是重启之后又会失效.若要永久保存则需要编辑/etc/sysctl.conf文件增加一行参数,这个文件提供了一些范例可供参考,但这种方式的缺点是重启之后可以永久生效但现在无法生效,一个办法是用sysctl -p通知内核重新读取配置文件. sysct命令后面的参数其实就是对应的/proc/sys目录下的路径和文件,sysctl -a 可以显示所有内核参数和值.
内核模块的管理的几个常见命令:
modprobe MODULE_NAME 装载某模块
modprobe -r MODULE_NAME 卸载某模块
modinfo MODULE_NAME 查看某模块的具体信息,包括模块的依赖关系
lsmod 列出当前内核上已经装载的模块
insmod /PATH/TO/ MODULE_NAME 装载某模块
rmmod MODULE_NAME 卸载某模块
Linux内核模块设计的更多相关文章
- Linux 内核模块设计
一. 内核模块 1. 头文件 Linux/init.h 和 Linux/module.h 2. 装载内核 insmod 对应的转载函数 module_init(); 3. 卸载内核 rmm ...
- [国嵌攻略][104][Linux内核模块设计]
内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...
- Linux驱动设计—— 内核模块(一)
Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- 5.linux内核模块基础,内核模块学习
linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...
- 《Linux内核设计与实现》CHAPTER1,2阅读梳理
<Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...
- 《Linux内核设计与实现》课本第一章&第二章学习笔记
<Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...
- 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介
一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
随机推荐
- 通过js的console优雅的将php调试信息输出
function consoleLog($val){ $debug = debug_backtrace(); unset($debug[0]['args']); echo '<script> ...
- SQL EXEC 命令用法
EXEC命令有两个用法: 1.执行一个存储过程,或者执行一个动态批次. 2.批次是一个内容为SQL语句的字符串. 举列子: 1.exec name_proc :没有参数 exec name_proc ...
- pyspider 简单应用之快速问医生药品抓取(一)
网址:http://yp.120ask.com/search/-0-0--0-0-0-0.html from pyspider.libs.base_handler import * class Han ...
- FZU-2075 Substring(后缀数组)
Description Given a string, find a substring of it which the original string contains exactly n such ...
- VBA编程常用语句
.Option Explicit '强制对模块内所有变量进行声明 Option Private Module '标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示 Option Compa ...
- IO:InputStream
InputStream类(java.io.InputStream) public abstract class InputStream extends Object implements Closea ...
- 注册noip.com动态域名的步骤
1.先打开这个网址 http://www.noip.com/ 2.点击页面右上绿色的Sing Up,进行注册 3.会出现这个页面,把这些填上 Create my hostname later这一项不打 ...
- JSBinding+Bridge.NET:Unity游戏热更新方案
老版本链接如下:http://www.cnblogs.com/answerwinner/p/4469021.html 新用户不要再使用老版本了. 新版本 JSBinding 将抛弃 SharpKit ...
- python对象
一: 基本概念 在pyhton中一切皆对象,就像类unix中的一切皆文件一样,恩,一切.把事物当作对象进行处理, 这样自然就成了面向对象的编程了. 所有的 Python 对像都拥有三个特性:身份,类型 ...
- 动态加载(异步加载)jquery/MUI类库 页面加载完成后加载js类库
动态加载Mui类库: // ==UserScript== // @name // @version 1.4.0 // @author zzdhidden@gmail.com // @namespace ...