`
yanfaguanli
  • 浏览: 661604 次
文章分类
社区版块
存档分类
最新评论

Linux内核设计基础(十)之内核开发与总结

 
阅读更多

(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内核设计的艺术_图解Linux操作系统架构设计与实现原理.新设计团队(第2版)

    本书的第1版广获好评,版权被中国台湾和美国两家大型...它也是一本能真正引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系统的著作。

    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理

    本书可能也代表着同类图书的顶尖水平,是一本真正能引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系统的著作。它的出版也许会...

    linux内核设计的艺术 图解linux操作系统架构设计与实现原理 (第2版) 高清PDF扫描版

    本书的第1版广获好评,版权被中国台湾和美国两家大型...它也是一本能真正引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系统的著作。

    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版) (华章原创精品)_--kindle版

    本书的第1版广获好评,版权被中国台湾和美国两家大型...它也是一本能真正引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系统的著作。

    Linux内核设计的艺术

    本书可能也代表着同类图书的顶尖水平,是一本真正能引导我们较为容易地、极为透彻地理解Linux内核的经典之作,也可能是当前唯一能从本质上指引我们去设计和开发拥有自主知识产权的操作系统的著作。它的出版也许会...

    《Linux内核修炼之道》超值精华版

    任桥伟《Linux内核修炼之道》精华版连载的最 新word版本,内含: NO1:《Linux内核修炼之道》精华版之方法论 (完整版) NO2:Linux内核学习的4个层次 NO3:Linux内核学习解决方案 NO4:linux应用开发技巧

    linux内核编译详解.pdf

    linux内核编译详解 。。。。。 Linux 编译内核详解 内核简介 内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和 网络系统,决定着系统的性能和稳定性。 Linux 的 一 个 重 要 的 特 点...

    浅谈Linux内核开发之PCI设备驱动

    本文内容包括:PCI介绍Linux内核对PCI的支持总结参考资料本文介绍了PCI的基本概念,并从Linux内核的角度出发,介绍了PCI设备的初始化以及配置。PCI介绍随着计算机应用的不断更新和发展(比如百兆网卡、视屏流等),...

    嵌入式Linux内核分析及其在多媒体机顶盒中的应用研究

    统和Linux的发展历史做了简要的回顾,接着深入分析了Linux内核源代码,对典 型嵌入式Linux一一uClniux操作系统进行了研究,包括uClniux的发展历史,内 核技术,移植方案,应用程序的开发等。实时性改造是嵌入式Lniux...

    Linux那些事儿之我是USB(第2版).pdf

    本次改版修改了第1版中出现的错误,增加了一个附录,主要内容是关于Linux内核的学习方法,是作者的经验总结,值得一读。 本书使用幽默诙谐的笔调对Linux内核中的USB子系统源代码进行了分析,形象且详尽地介绍了USB在...

    Linux C程序设计大全

    1.2.3 Linux内核版本 1.2.4 Linux与UNIX的关系 1.2.5 Linux在服务器方面的发展 1.2.6 Linux在嵌入式系统方面的发展 1.2.7 Linux在桌面系统方面的发展 1.3 Linux环境下的其他编程语言 1.3.1 C++ 1.3.2 Java 1.3.3 ...

    韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步

    第10课第4节 内核启动流程分析之内核启动 第11课第1节 构建根文件系统之启动第1个程序 第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根...

    嵌入式Linux之我行系列

    ·嵌入式Linux之我行——Linux-2.6.30.4在2440上的移植之内核 ·嵌入式Linux之我行——Linux-2.6.30.4在2440上的移植之文件系统 ·嵌入式Linux之我行——Linux-2.6.30.4在2440上的移植之RTC时钟驱动 ·嵌入式Linux之...

    嵌入式Linux驱动开发班讲义

    得到越来越多公司的支持,但是阻碍 Linux 各个领域广泛应用的主要因素之一就是内核/驱动高端人才极度缺乏,Linux源代码中80%是设备驱动,嵌入式系统中驱动程序更为重要,几乎每一个嵌入式系统的开发都是从驱动程序...

    韦东山视频目录+链接整合-1 视频目录

    第10课第4节 内核启动流程分析之内核启动 第11课第1节 构建根文件系统之启动第1个程序 第11课第2节 构建根文件系统之init进程分析 第11课第3节 构建根文件系统之busybox 第11课第4节 构建根文件系统之构建根...

    Linux内核源代码情景分析

    Unix两大主流之一的BSD就是在加州大学伯克利分校开发的。后来,Unix成了商品,其源代码也受到的保护,再说也日益复杂和庞大了,而第6版则又慢慢显得陈旧了,便逐渐不再用Unix内核的源代码作为教材了(但是直到现在...

    Linux服务器配置与管理项目1--Linux服务器安装与测试.pptx

    1991年10月5日,Linus Torvalds在赫尔辛基大学的新闻组发布消息,正式向外宣布Linux内核的诞生,并将Linux的内核上传到学校的FTP服务器上供计算机爱好者下载和使用,根据用户的反馈意见进行修改。随着Linux的功能...

    《Linux编程白皮书》DOC

    所介绍的知识包括Linux硬件和软件基础、内核机制、进程、模块、结构及源代码、Linux内核模块编程指南,把应用程序移植到Linux下,以及对网络的讨论等等。 Linux技术背景: Linux是当前最流行的操作系统之一。它...

Global site tag (gtag.js) - Google Analytics