linux内核简介、配置编译与内核模块

Linux系统架构

主要分为用户空间和内核空间。用户空间包括应用程序和C库等。内核空间包括系统调用接口,linux内核以及体系结构相关代码。关于linux要区分内核空间和用户空间的原因。首先要明白,内核空间与用户空间是程序运行的不同状态。现代的处理器往往有很多工作模式,以ARM9为例就有7中工作方式:(管理模式,系统模式,用户模式,外部中断模式,快速中断模式,数据终止模式和未定义指令异常模式)。X86也分有Rang0--Rang3四种模式。在不同的模式下,所使用的寄存器与访问权限不尽相同。Linux为了保护操作系统本身,系统分成了用户空间和内核空间,用户空间的访问权限要小,这样就起到了保护内核的作用。

Linux内核架构:如下表所示

-- 系统调用接口

--Linux内存管理子系统(重点掌握)

--Linux 进程管理子系统

Linux内核的组成 -----Linux 网络子系统(网络协议栈)

--虚拟文件系统

--驱动

--体系结构相关代码(汇编)

Linux内核的配置与编译(X86平台上)

第一步:Make clean或者Make mrproper或者Make distclean

第二步:make config 或者 make menuconfig

第三步:make zImage 或者 make bzImage

第四步:编译内核模块 make modules

第五步:安装内核模块 make modules_install (将编译好的内核模块拷贝至/lib/modules目录下面)

第六步:制作initramdisk

Linux内核模块

为何需要内核模块?如果把所有组件都编译进内核,那会使得内核模块非常庞大。另外如果想要添加或者删除某个组件就必须重新编译内核。所以提供了一种内核模块的机制。

首先要区别内核模块与一般程序的区别:

普通程序从main函数开始,从头到尾执行,然后从内存中消失。而内核模块通过初始化函数在内核中注册,然后一直存在内核中,等待将来的某个请求。模块始终存在于内核中,知道执行了卸载函数。

内核模块的写法。下面是一片hello world 的范例

#include <linux/module.h>

#include <linux/init.h>

MODULE_LICENSE("GPL");

MODULE_AUTHOR("DAVID");

MODULE_DESCRIPTION("Hello world module");

static int __init hello_init(void)

{

printk(KERN_ERR "hello world!\n");

return 0;

}

static void __exit hello_exit(void)

{

printk(KERN_EMERG "hello exit!\n");

}

module_init(hello_init);

module_exit(hello_exit);

有了内核模块的源文件,还必须有makefile。但这个makefile其实是一个假的makefile。它的作用是指定一个linux内核中的真正的makefile。下面是一篇makefile的范例(注意,这是针对X86平台的):

ifneq ($(KERNELRELEASE),)

obj-m :=hello.o

else

KDIR:= /lib/modules/2.6.18-53.el5/build

all:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c .symvers

endif

内核模块的安装与卸载

安装使用:insmod ***.ko;卸载使用 :rmmod  *** (注意不需要后缀名);查看已经安装的内核模块使用 lsmod

linux内核启动流程

uImage由zImage和uboot head相关两组成。而zImaeg又是由解压缩代码和压缩的vmlinux代码构成。总的来说内核启动流程可以分为 解压缩 、 初始化 、 启动应用程序三部分组成。初始化的最后一句代码是:run init_process("sbin/init").所以这也解释了为什么把程序放在这里面就能够开机自启动了。

linux内存管理

首先从几个地址的概念谈起。一是物理地址,这个很容易理解,它就是CPU所使用的地址,也就是在地址总线上传输的地址。二是线性地址或者成为虚拟地址,它的大小是根据地址线的根数来确定的。但它不表示实际的内存地址。因为就算地址线能达到4G,实际的内存很可能没有4G。所以它成为虚拟地址。三是逻辑地址,这个是针对段式管理的产物。也就是段式管理中的偏移地址。

一个程序中,代码寻址用的就是逻辑地址,一个逻辑地址经过段式管理,成了线性地址,线性地址经过页式管理,才准换成真正的物理地址。但由于很多处理器没有使用段式管理,所以linux有限制的采用了段式管理机制,将所有的段基地址都设置为0,那么偏移地址也就是逻辑地址和线性地址也就完全对应了,可以理解为相同的。也就是说,在linux中,逻辑地址,线性地址,虚拟地址都是一致的。然后线性地址经过页式转换就得到了真正的物理地址。

对于段式管理的起源,要有一定的认识。出现在intel的16位处理器上面。

linux内核编译与内核模块相关推荐

  1. Linux内核编译(通过内核模块显示进程控制块信息)

    Linux内核编译(通过内核模块显示进程控制块信息) 实验说明 在内核中,所有进程控制块都被一个双向链表连接起来,该链表中的第一个进程控制块为init_task.编写一个内核模块,模块接收用户传递的一 ...

  2. 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux 内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 )

    文章目录 一.打开 Linux 内核编译 菜单配置 二.菜单配置中的光标移动与选中状态 三.保存配置 四.配置项帮助文档 一.打开 Linux 内核编译 菜单配置 执行 make menuconfig ...

  3. linux内核编译如何选择cpu类型,Ubuntu内核编译和CPU Hot-Plug特性配置全过程及遇到问题记录...

    最近编译Palacios需要linux的内核支持cpu Hot-Plug(内存热插拔)特性,无奈我机器上安装的Ubuntu10.04系统默认不支持内存热插拔特性,所以需要修改配置文件并重新编译linu ...

  4. Linux内核编译与安装[转]

    Linux内核介绍 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机 制.Linux内核的一大特点就是采 ...

  5. LINUX内核编译(ZT)

    LINUX内核编译(ZT) 在这里转贴一些关于内核编译的文章,绝非笔者原创,也无意注明出处.有些内容有重复之处,请原谅. ==================================== 一. ...

  6. Linux内核编译基础

    2.6  Linux内核编译基础 当完成对Linux内核的配置以后,此时仍然以源代码的方式存在,不能直接下载到嵌入式系统中运行,因此,需要对内核进行编译,生成最终可以在嵌入式系统上运行的可执行代码. ...

  7. Linux内核编译、安装

    Linux内核编译.安装 Linux内核编译.安装(本次以Ubuntu4.4.260作为所需安装的内核版本). 1. 编译环境 主机+虚拟机: Windows10+virtualBox 6.1 操作系 ...

  8. Linux 内核编译配置选项简介(转)

    Linux 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发,但必须保留作者署名 ...

  9. linux内核编译和安装

    linux内核编译和安装 1.下载内核源码 点击我下载 2 . 解压缩内核源码 tar vxf xxxx.tar.xz 3. 图形化界面配置需要编译的模块 sudo make menuconfig 然 ...

最新文章

  1. ttc转换ttf字体在线_R 语言画图中英文字体解决方案
  2. java虚拟机资源根目录_Java路径问题最终解决方案—可定位所有资源的相对路径寻址 - java - CSDN技术......
  3. (转)新开发Apple Store上软件的实施步骤
  4. 【安全漏洞】Cisco命令注入漏洞CVE-2021-1414分析
  5. 最全面的 python 字符串拼接总结(带注释版)
  6. 深入浅出之动态内存(new,malloc深度分析)
  7. require引入js vue_请教 关于使用require 引入vue 和公共js的问题
  8. 机房设备服务器维护细则,机房安全管理方面的管理制度
  9. Oracle union多表查询
  10. ES6新特性_ES6生成器函数声明与调用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记020
  11. NAT对语音业务的影响(网络控制方案…
  12. 富文本_富文本原理了解一下?
  13. C++.Net在Release方式下单步调试时需要修改一些设置,否则变量会有错位或乱码,切记!...
  14. scala 单例对象 伴生对象
  15. 51单片机C语言智能小车,基于51单片机智能小车的设计与实现
  16. Python金融大数据分析-蒙特卡洛仿真
  17. 微信公众号不限次数发送消息
  18. 在Mac上阻止相机和麦克风的方法
  19. 图片生成二维码最好的工具
  20. Unity 3D数学 — 向量运算

热门文章

  1. java 6 jaxb_JAVA6开发WebService (五)—— JAXB
  2. swagger-bootstrap-ui 1.9.3 发布,i18n及自定义文档支持
  3. JS 中对数组按照数组中某个对象的属性值进行排序
  4. Oracle初学者入门指南-什么是 Metalink 或 MOS ?
  5. 识别SDN中的安全隐患
  6. JVM hotspot虚拟机对象探秘
  7. 树莓派Python编程指南--第一章(起航--启动和运行)
  8. 精通Android开发 1
  9. Blueprint:一个Flash Builder代码示例的扩展
  10. 语言中2000u等于多少_PLC文本语言