内核的设计有两种方式:单内核和微内核,两者各有优劣,关于两者的比较可以参见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内核模块设计的更多相关文章

  1. Linux 内核模块设计

    一.  内核模块 1.  头文件 Linux/init.h  和 Linux/module.h 2.  装载内核 insmod  对应的转载函数 module_init(); 3.  卸载内核 rmm ...

  2. [国嵌攻略][104][Linux内核模块设计]

    内核模块示例 #inlcude <linux/init.h> #inlcude <linux/module.h> static int hello_init(){ printk ...

  3. Linux驱动设计—— 内核模块(一)

    Linux内核理论基础 组成Linux内核的5个子系统:进程调度(SCHED)/内存管理(MM)/虚拟文件系统(VFS)/网络接口(NET)/进程间通信(IPC). 进程调度(SCHED) 在设备驱动 ...

  4. 《Linux内核设计与实现》CHAPTER17阅读梳理

    <Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...

  5. 5.linux内核模块基础,内核模块学习

    linux内核模块基础 一.定义 Linux 内核的整体结构非常庞大,其包含的组件也非常多,如何使用这些组件呢: 方法 1:把所有的组件都编译进内核文件,即:zImage 或 bzImage,但这样会 ...

  6. 《Linux内核设计与实现》CHAPTER1,2阅读梳理

    <Linux内核设计与实现>CHAPTER1,2阅读梳理 [学习时间:2.5hours] [学习内容:Linux内核简介——历史与现今版本:Linux内核源代码以及编译] CHAPTER1 ...

  7. 《Linux内核设计与实现》课本第一章&第二章学习笔记

    <Linux内核设计与实现>课本学习笔记 By20135203齐岳 一.Linux内核简介 Unix内核的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆文件 ...

  8. 《Linux内核设计与实现》读书笔记 第一章 Linux内核简介

    一.相关历史 1. Unix内核的特点 简洁:仅提供系统调用并有一个非常明确的设计目的 抽象:几乎所有东西都被当做文件 可移植性:使用C语言编写,使得其在各种硬件体系架构面前都具备令人惊异的移植能力 ...

  9. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块

    本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...

随机推荐

  1. WinCE小结

    第一章:开发环境搭建 软件列表:详细说明 1.系统定制和编译:Platform Builder 5.0 (依赖于Net Framework1.1)2.应用程序编写:早期的用Embedded Visua ...

  2. LeetCode() Largest Number

    全排列,超时,知道超时,只是想验证一下. class Solution { public: string largestNumber(vector<int>& nums) { so ...

  3. python之环境搭建windows版

    1.先到python官网下载属于自己的的python版本,有linux版,有mac版,有windows版:https://www.python.org/downloads/windows/ 2.下载完 ...

  4. outscan 一键批量 get struct2 devMode (CNVD-2016-04656)

    之前写的一个玩意 下载地址:http://pan.baidu.com/s/1i5jmEwP 密码:v8v3 一键批量 get struct2 devMode 支持百度.google(google有访问 ...

  5. 2016HUAS_ACM暑假集训3G - 还是畅通工程

    最小生成树,题目简单.套的Prim模板,其他的题目比较有意义. Sample Input 3                             //村庄个数1 2 1               ...

  6. javascript中call函数与apply

    javascript中的call方法使当前对象可以调用另一个对象的方法,即改变this的指向内容 var first_object = { num: 42 }; var second_object = ...

  7. WP8应用上传失败查错

    开发的一个应用,好久没有更新. 最近做了些修改,在设备上安装测试,没什么 问题,上传到STORE,收到反馈说有两个操作必挂. 知道了直接设备安装测试和从STORE上下载,会有些不同. http://s ...

  8. Could not load type from string value 'DALMSSQL.DBSessionFactory,DALMSSQL'.

    问题: 原因: DAL.dll不在程序目录下        --调了老半天.

  9. sql 2008 游标

    begin declare PlatformBulletin --定义游标 open PlatformBulletin --打开游标 declare @userid int,@zmscompanyid ...

  10. Java ResourceBundle类的使用

    1.使用ResourceBundle读取配置文件 #数据库配置信息: DRIVER=com.mysql.jdbc.Driver URL=jdbc:mysql://localhost:3306/dmo ...