您的位置:首页 > 运维架构 > Linux

Linux内核的起步

2016-02-11 00:31 405 查看
目的:

2016年猴年来临,经过过去两年的积累,有了进一步的方向和定位:

依赖大数据(云计算)的云端GOS和分散在各种可移动、可编程、智能终端的ROS两个OS的互联互通。

针对GOS,经过过去几年在Hadoop平台领域的积累,基本能够触类旁通,MR/RDD/Graph/PS/Streaming、实时内存计算都不断的汇集到GOS的计算能力中。

而ROS则更加轻盈,同时又承载着GOS的触角和末端神经,两者相辅相承,共同打造商业的智能OS时代。

Linux作为最适合的OS的原形,从此开始入手最合适不过,也弥补一下这方法的不足。

Linux的基础设施

a.内存管理
b.进程管理
c.设备管理
d.文件系统
e.自旋锁、信号量(同步函数)
f.工作队列、tasklet
g.内核数据结构(链表、hash链表、红黑树)
从这些基础设施,逐步的着手内核的研究和分析。

内存管理

Linux操作系统的内核提供两种内存分配的接口

1.从最底层的内存管理机制入手,提供页式的内存管理

依赖alloc_pages,调用获取的是页面地址,通过page_address来获取内存地址

使用__get_free_pages来直接获取内存地址,该函数封装了上述的alloc_pages和page_address

注意:alloc_pages的分配单元以页为单位,至少为一个页

2.从slab系统分配内存,提供基于对象的内存管理

如果使用slab申请内存,需要创建slab对象

可以使用kmem_cache_create创建slab对象,提供对象的名称、大小、构造函数、析构函数,然后通过kmem_cache_alloc和kmem_cache_free来申请和释放内存

Linux内核中的kmalloc就是使用slab提供的对象管理,

另外关注vmalloc的使用,把物理地址不连续的内存页,映射为连续的内存区间。

进程的任务调度

在内核中实现任务调度,需要控制任务的睡眠、唤醒
__wait_event(wq,condition) 进程处于不可中断的睡眠,只有条件成立,恢复运行
相关的函数
wait_event_timeout 如果超时时间到达,恢复运行
wait_event_interruptible 进程进行可中断的睡眠,可接受信号量
wait_event_interruptible_timeout 同时支持超时、可接受信号量
wait_event_interruptible_exclusive 设置为排他性等待,如果满足唤醒条件的有多个,只唤醒一个排他性进程

重点:先关注核心的任务睡眠和唤醒处理机制

软中断

内核中的中断的实现:
硬中断:跟硬件相关、必须关闭中断来执行,以避免被后面触发的中断所打断,影响代码的正常执行
在中断上下文中执行,不可休眠
软中断:跟硬件关系不紧密,可以打开中断执行,在软中断上下文执行。

注意:关注计算机系统中的中断的重要性、以及使用的技巧

Linux内核的默认软中断
网络设备:发送和接受软中断
块设备:实现软中断

内核内部定义的tasklet软中断【同一时刻一个tasklet只能有一个cpu执行,不同的tasklet可以在不同的CPU上执行】
而软中断,同一时刻可以在不同的CPU并行执行,所以必须考虑重入的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: