(1)Linux层次结构:

(2)Linux内核组成:

主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等5个子系统组成。

(3)与Unix的差异:

  • Linux支持动态载入内核模块
  • 支持对称多处理(SMP)机制
  • Linux内核能够抢占
  • Linux内核并不区分线程和其它的一般进程
  • Linux提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统(sysfs)

(4)内核开发的特点:


  • 内核编程时既不能訪问C库也不能訪问标准的C头文件
  • 内核编程时必须使用GNU C
  • 内核编程时缺乏像用户空间那样的内存保护机制
  • 内核编程时难以运行浮点运算
  • 内核给每一个进程仅仅有一个非常小的定长堆栈
  • 因为内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
  • 要考虑可移植性的重要性

(5)模块的编写及执行:

来个Hello World,程序猿的老朋友了。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

/*
 * hello_init 初始化函数,当模块装载时被调用,假设装载成功返回0,
 * 否则返回非零值
 */
static int hello_init(void)
{
	printk(KERN_ALERT "I bear a charmed life.\n");
	return 0;
}

/*
 * hello_exit 退出函数,当模块卸载时被调用
 */
static void hello_exit(void)
{
	printk(KERN_ALERT "Out, out, brief candle!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Qiushan");
MODULE_DESCRIPTION("A Hello, World Module");

这是最简单的内核模块,hello_init()是模块的入口点,通过module_init()注冊到系统,在被装载时被调用。另外全部模块初始化函数必须符合以下的形式:


int my_init(void);

以下是Makefile的演示样例:


obj-m := hello.o

make -C /kernel/source/location SUBDIRS=$PWD modules

然后运行


sudo make modules_install

sudo insmod hello.ko //装载

sudo rmmod hello //卸载


(6)移植要注意对齐:

假设一个变量的内存地址正好是它长度的整数倍,那它就自然对齐。如,对于一个32位类型的数据,假设它在内存中的地址刚好能够被4整除(也就是最低两位为0),那它就自然对齐。对于RISC,加载未对齐的数据会导致处理器陷入

对齐原则:
  • 对于标准数据类型,地址仅仅要是其长度的整数倍就对齐了。
  • 对于数组,仅仅要依照基本数据类型进行对齐就行了,随后的全部元素自然可以对齐。
  • 对于联合体,仅仅要它包括的长度最大的数据类型可以对齐就行了。
  • 对于结构体,仅仅要结构体中每一个元素可以正确对齐就行了。
对于结构体,这里介绍一个样例:

struct animal_struct {
	char dog;                   /* 1 byte */
	unsigned long cat;    /* 4 bytes */
	unsigned short pig;  /* 2 bytes */
	char fox;                  /* 1 byte */
};


这可不是每一个元素正确对齐。实际上编译器会作例如以下变动:

struct animal_struct {
	char dog;                   /* 1 byte */
	u8 __pad0[3];            /* 3 bytes */
	unsigned long cat;     /* 4 bytes */
	unsigned short pig;   /* 2 bytes */
	char fox;                    /* 1 byte */
	u8 __pad1;               /* 1 byte */
};

第一个填充__pad0是为了保证cat能够依照4字节对齐,这样自己主动使其他小对象都对齐了,最后一个填充__pad1是为了填补struct本身的大小,是这个结构体长度能被4整除,这样,由该结构体组成的数组中,每一个数组项也就会自然对齐了。


struct animal_struct {
	unsigned long cat;     /* 4 bytes */
	unsigned short pig;   /* 2 bytes */
	char dog;                    /* 1 byte */
	char fox;                     /* 1 byte */
};






Linux内核设计基础(十)之内核开发与总结的更多相关文章

  1. 《Linux内核设计与实现》读书笔记(二十)- 补丁, 开发和社区

    linux最吸引我的地方之一就是它拥有一个高手云集的社区, 还有就是如果能=为linux内核中贡献代码, 一定是一件令人自豪的事情. 下面主要总结一些和贡献代码相关的主要内容. 加入社区 编码风格 提 ...

  2. 十天学Linux内核之第一天---内核探索工具类

    原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间 ...

  3. linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转)

    linux是如何组成的?答:linux是由用户空间和内核空间组成的为什么要划分用户空间和内核空间?答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的安全性,比如X86 ...

  4. Linux内核设计基础(五)之内存管理

    我感觉学习操作系统首先要从内存分配和管理入手. 首先我们应该知道现代操作系统是以页为单位进行内存管理的,32位体系结构支持4KB的页.而64位体系结构支持8KB的页.页是用来分配的.怎样才干进行高效和 ...

  5. Linux内核设计基础(一)之中断处理

    假设让内核定期对设备进行轮询.以便处理设备,那会做非常多无用功,假设能让设备在须要内核时主动通知内核,会是一个聪明的方式,这便是中断. 在响应一个特定中断时,内核会运行一个函数--中断处理程序. 中断 ...

  6. Linux 大爆炸:一个内核,无数发行版

    即使你是一个 Linux 新人,你可能也已经知道它不是一个单一的.整体的操作系统,而是一群项目.这个星座中不同的“星”组成了“发行版”.每个都提供了自己的 Linux 模式. 感谢这一系列发行版所提供 ...

  7. 戴文的Linux内核专题:07内核配置(3)

    转自Linux中国 OK,我们还继续配置内核.还有更多功能等待着去配置. 下一个问题(Enable ELF core dumps (ELF_CORE))询问的是内核是否可以生成内核转储文件.这会使内核 ...

  8. Linux从用户层到内核层系列 - GNU系列之glibc介绍

    题记:本系列文章的目的是抛开书本从源代码和使用的角度分析Linux内核和相关源代码,byhankswang和你一起玩转linux开发 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswa ...

  9. Linux 小知识翻译 - 「内核(kernel)」

    上次介绍了Linus Torvalds, 这次介绍他开发的「内核」. 经常听人提到「Linux kernel」,但如果被问到「kernel究竟是什么?」的话,会出乎意料的觉得难以回答. 那么,kern ...

  10. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

随机推荐

  1. mac下XAMPP服务器配置多站点配置局域网配置 (转)

    原文:http://blog.csdn.net/wbw1985/article/details/9493989 Mac 上的软件大多是收费的,配置开源的东东也挺麻烦,网上搜索发现XAMPP软件是集成了 ...

  2. xUtils框架的使用

    xUtils简介 xUtils 包含了很多实用的android工具,xUtils 源于Afinal框架,对Afinal进行了大量重构,使得xUtils支持大文件上传,更全面的http请求协议支持,拥有 ...

  3. jenkins2 插件安装

    文章来自:http://www.ciandcd.com 文中的代码来自可以从github下载: https://github.com/ciandcd Jenkins的安装包和插件在7个国家有20多个镜 ...

  4. JQ定义

    什么是jQuery对象 通过$(‘选择器’)获取到都是jQuery对象 什么是DOM对象 通过getElementById或者 getElementsByTagName或者getElementsByN ...

  5. kuryr环境搭建

    前言 kuryr是docker和neutron结合的一个项目.docker自1.9之后,支持libnetwork的remote的driver,使得可以通过json rpc调用,为docker提供网络. ...

  6. Git常用命令清单笔记

    git github 小弟调调 2015年01月12日发布 赞  |   6收藏  |  45 5k 次浏览 这里是我的笔记,记录一些git常用和一些记不住的命令,这个笔记原本是基于 颜海镜的文章增加 ...

  7. CentOS下mysql数据库data目录迁移和配置优化

    目录迁移 关闭数据库服务 service mysqld stop 复制数据库 mv /var/lib/mysql /data/mysql # 或者使用cp -a复制 # 这两个命令都会带权限到新目录去 ...

  8. vs2013突然打不开项目,项目全部不兼容

    转载:https://forum.cocos.com/t/vs2013/40931 转载:https://jingyan.baidu.com/article/cdddd41c7c6b5353cb00e ...

  9. iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器

    一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...

  10. 剑指offer面试题24:二叉搜索树的后序遍历序列

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是返回true,否则返回false. 假设输入的数组任意两个数字都不相同 解题思路:二叉搜索树的特点是根节点的左子树的值小于等 ...