(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内存(三)内核与用户空间交互

    来自网址http://www.kerneltravel.net/jiaoliu/005.htm 用户程序和内核的信息交换是双向的,也就是说既可以主动从用户空间向内核空间发送信息,也可以从内核空间向用户 ...

随机推荐

  1. 论js闭包的重要性

    很久没写博客了,今天发现了一个很有意思的问题,写下来分享一下 话不多说,贴前端代码: <script type="text/javascript" src="js/ ...

  2. Windows下用Caffe跑自己的数据(遥感影像)

    1 前言 Caffe对于像我这样的初学者来说是一款非常容易上手的深度学习框架.关于用Caffe跑自己的数据这样的博客已经非常多,感谢前辈们为我们提供的这么好的学习资源.这里我主要结合我所在的行业,说下 ...

  3. Qt install Phonon

    sudo apt-get install libphonon-dev phonon-backend-gstreamer

  4. Java基础知识强化54:经典排序之插入排序(InsertSort)

    1. 插入排序原理图: 算法步骤: 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列. 2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位 ...

  5. smbpasswd命令常用选项

    smbpasswd命令的常用方法 smbpasswd -a 增加用户(该账户必须存在于/etc/passwd文件中)smbpasswd -d 冻结用户,就是这个用户不能在登录了smbpasswd -e ...

  6. Eclipse 添加快捷方式

    1.在/usr/share/applications创建一个desktop文件,命名为eclipse.desktop 文件内容如下 [Desktop Entry]Name=EclipseType=Ap ...

  7. PagerSlidingTabStrip的使用

    布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  8. RDD 重新分区,排序 repartitionAndSortWithinPartitions

    需求:将rdd数据中相同班级的学生分到一个partition中,并根据分数降序排序. 此实例用到的repartitionAndSortWithinPartitions是Spark官网推荐的一个算子,官 ...

  9. 学习在创建好的工程里面添加CoreData

    在学习CoreData中, 在建工程后, 没有添加, 于是就参考网络文章进行更改. 这几天在学习做一个ios的小项目,项目中需要对数据进行基本的增删改查操作.于是就想用一把CoreData.但在创建项 ...

  10. cocos2dx 动画 二(iOS)

    7.Bezier曲线 需要ccBezierConfig结构体,设置2个控制点和一个结束点 ccBezierConfig bc; bc.controlPoint_1 = Vec2(,); bc.cont ...