博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核设计基础(十)之内核开发与总结
阅读量:6137 次
发布时间:2019-06-21

本文共 2200 字,大约阅读时间需要 7 分钟。

(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 
#include
#include
/* * 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 */};

你可能感兴趣的文章
Data Wrangling文摘:Non-tidy-data
查看>>
while()
查看>>
常用限制input的方法
查看>>
IIS7下使用urlrewriter.dll配置
查看>>
并行程序设计学习心得1——并行计算机存储
查看>>
JAVA入门到精通-第86讲-半双工/全双工
查看>>
bulk
查看>>
js document.activeElement 获得焦点的元素
查看>>
C++ 迭代器运算
查看>>
【支持iOS11】UITableView左滑删除自定义 - 实现多选项并使用自定义图片
查看>>
day6-if,while,for的快速掌握
查看>>
JavaWeb学习笔记(十四)--JSP语法
查看>>
【算法笔记】多线程斐波那契数列
查看>>
java8函数式编程实例
查看>>
jqgrid滚动条宽度/列显示不全问题
查看>>
在mac OS10.10下安装 cocoapods遇到的一些问题
查看>>
angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
查看>>
css技巧
查看>>
Tyvj 1728 普通平衡树
查看>>
[Usaco2015 dec]Max Flow
查看>>