Linux内核的起步
2016-02-11 00:31
405 查看
目的:
2016年猴年来临,经过过去两年的积累,有了进一步的方向和定位:
依赖大数据(云计算)的云端GOS和分散在各种可移动、可编程、智能终端的ROS两个OS的互联互通。
针对GOS,经过过去几年在Hadoop平台领域的积累,基本能够触类旁通,MR/RDD/Graph/PS/Streaming、实时内存计算都不断的汇集到GOS的计算能力中。
而ROS则更加轻盈,同时又承载着GOS的触角和末端神经,两者相辅相承,共同打造商业的智能OS时代。
Linux作为最适合的OS的原形,从此开始入手最合适不过,也弥补一下这方法的不足。
b.进程管理
c.设备管理
d.文件系统
e.自旋锁、信号量(同步函数)
f.工作队列、tasklet
g.内核数据结构(链表、hash链表、红黑树)
从这些基础设施,逐步的着手内核的研究和分析。
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并行执行,所以必须考虑重入的问题
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并行执行,所以必须考虑重入的问题
相关文章推荐
- linux下JDK的安装详解及第一个java应用程序
- 2016-2-10 linux基础学习12
- Linux进程 -- exec函数操作
- Linux下的磁盘克隆
- Linux文件和目录操作
- Linux上php7环境的搭建 Lamp
- 不止 SteamOS,为游戏而生的 Linux 发行版盘点
- Linux进程 -- fork操作
- Linux系统各发行版镜像下载
- Linux创建目录和文件管理
- 在CentOS环境下mysql如何远程连接
- Linux目录结构和常用命令
- linux常用命令详解
- 【Linux学习014】特殊权限
- Linux - 命令
- 在Linux机上配置Eclipse并部署Maven
- Centos环境下安装java jdk 设置环境变量
- linux内核锁
- Linux查看端口占用情况和开启端口命令
- linux 信号 回收子进程