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

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

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

(1)Linux层次结构:

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.omake -C /kernel/source/location SUBDIRS=$PWD modules


然后运行


sudo make modules_installsudo 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 */};






版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • lock接口是什么意思_mutextrylock无效

    lock接口是什么意思_mutextrylock无效正文开始前先把lock接口的源码摆出来(精简后的,特意保留了部分注释)publicinterfaceLock{/***Acquiresthelock.*/voidlock();/***Acquiresthelockunlessthecurrentthreadis*{@linkpl…

    2022年10月15日
    2
  • c语言经典的螺旋矩阵的几种

    c语言经典的螺旋矩阵的几种11 13 今天也要好好学习 虽然水了一天 今天的高代数分也没怎么搞懂 螺旋矩阵出现在我们学校 2 3 周前布置的编程题里 当时把自己转晕了 现在来回顾一下 介绍一下主流的实现算法大一都过了 1 4 了 好好学吧 题目很简短 就是让你输出一个型如的螺旋数组 solution1 设置一个大的 for 循环 里面有四个小 for 循环 对应四个边 因此进行一个大循环 便走完了一圈 先空着

    2025年6月2日
    3
  • 判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    判断一个点是否在某个区域内。百度,高德,腾讯都能用。(php版)

    2021年11月9日
    85
  • a标签去掉下划线_怎么去掉html a超链接下划线

    a标签去掉下划线_怎么去掉html a超链接下划线我们在HTML网页制作过程中,相信大家对css文本超链接这个概念并不陌生。我们都知道想要给某段文本或者指定元素添加一个锚点也就是超链接需要用到HTML中的a标签。程序猿的生活:打造全网web前端全栈资料库(总目录)看完学的更快,掌握的更加牢固,你值得拥有(持续更新)​zhuanlan.zhihu.com那么有的新手可能就会发现,在使用a标签时文本超链接会自动出现下划线!这就让一些小白们感到苦恼了,…

    2022年5月9日
    53
  • FCN语义分割_卷积神经网络可用于分割吗

    FCN语义分割_卷积神经网络可用于分割吗1.FCN概述图像的语义分割则不仅是区分每个像素的前后景,更需要将其所属类别预测出来,属于计算机视觉领域。CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别)。传统的基于CNN的语义分割方法是:将像素周围一个小区域(如25*25)作为CNN输入,做训练和预测。这样做有3个问题: -像素区域的大小如何确定 -存储及计算…

    2022年8月21日
    8
  • saga分布式事务_分布式事务原理

    saga分布式事务_分布式事务原理saga是分布式事务领域里一个非常重要的事务模式,特别适合解决出行订票这类的长事务,本文将深度剖析saga事务的设计原理,以及在解决订票问题上的最佳实践01.saga的理论来源saga这种事务模式最早来自这篇论文:sagas在这篇论文里,作者提出了将一个长事务,分拆成多个子事务,每个子事务有正向操作Ti,反向补偿操作Ci。假如所有的子事务Ti依次成功完成,全局事务完成假如子事务Ti失败,那么会调用Ci,Ci-1,Ci-2….进行补偿论文阐述了上述这部分基本的saga逻辑之后

    2022年9月15日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号