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中主要由 ...
随机推荐
- SpringMvc 页面DATE传值问题
页面传过来yyy-MM-dd格式的日期类型,springMVC是不认的. 解决办法: @DateTimeFormat(pattern="yyyy-MM-dd") 在类属性上加上注解 ...
- textarea光标处插入文字
(function($) { $.fn.extend({ //myField 对象元素 myValue 插入值 insertAtCursor: function(myField,myValue) { ...
- Matlab 进阶学习记录
最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal = proposal_config('image_means', ...
- MYSQL 判断一个时间段是否在另一个时间段内。
[1 CREATE TABLE #B 2 ( 3 MeetingRoom int, 4 BeginTime datetime, 5 EndTime datetime6 ) 7 insert into ...
- Oracle常用的性能诊断语句
--1.阻塞及等待事件信息查询 -- 查询所有会话的状态.等待类型及当前正在执行的SQL脚本 select se.SID, se.SERIAL#, se.Status, se.Event, se.BL ...
- [转]./configure,make,make install的作用
./configure,make,make install的作用(转) 这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤. ./configure是用来检测你的安装平台 ...
- Shell编程之--“grep-awk-sed” 基础用法汇总-菜鸟入门级
- 防止在iOS设备中的Safari将数字识别为电话号码
在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名中出现数字(手机注册新浪微博的话用户名就是“手机用户xxx ...
- MFC ADO连接Sql Server数据库报无效指针的问题
相关症状: Win7sp1上编译的ADO程序无法在低版本系统上运行,创建ADO时提示错误:0x80004002 解决办法如下: 1.下载: http://download.microsoft.c ...
- C#动手实践:Kinect V2 开发(2):数据源工作原理及红外源Demo
Kinect体系架构