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中主要由 ...
随机推荐
- WinCE小结
第一章:开发环境搭建 软件列表:详细说明 1.系统定制和编译:Platform Builder 5.0 (依赖于Net Framework1.1)2.应用程序编写:早期的用Embedded Visua ...
- LeetCode() Largest Number
全排列,超时,知道超时,只是想验证一下. class Solution { public: string largestNumber(vector<int>& nums) { so ...
- python之环境搭建windows版
1.先到python官网下载属于自己的的python版本,有linux版,有mac版,有windows版:https://www.python.org/downloads/windows/ 2.下载完 ...
- outscan 一键批量 get struct2 devMode (CNVD-2016-04656)
之前写的一个玩意 下载地址:http://pan.baidu.com/s/1i5jmEwP 密码:v8v3 一键批量 get struct2 devMode 支持百度.google(google有访问 ...
- 2016HUAS_ACM暑假集训3G - 还是畅通工程
最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3 //村庄个数1 2 1 ...
- javascript中call函数与apply
javascript中的call方法使当前对象可以调用另一个对象的方法,即改变this的指向内容 var first_object = { num: 42 }; var second_object = ...
- WP8应用上传失败查错
开发的一个应用,好久没有更新. 最近做了些修改,在设备上安装测试,没什么 问题,上传到STORE,收到反馈说有两个操作必挂. 知道了直接设备安装测试和从STORE上下载,会有些不同. http://s ...
- Could not load type from string value 'DALMSSQL.DBSessionFactory,DALMSSQL'.
问题: 原因: DAL.dll不在程序目录下 --调了老半天.
- sql 2008 游标
begin declare PlatformBulletin --定义游标 open PlatformBulletin --打开游标 declare @userid int,@zmscompanyid ...
- Java ResourceBundle类的使用
1.使用ResourceBundle读取配置文件 #数据库配置信息: DRIVER=com.mysql.jdbc.Driver URL=jdbc:mysql://localhost:3306/dmo ...