Linux内核、驱动笔记

《Linux内核设计与实现》

单内核与微内核:

有助于理解内核的发展;1980年之前,所有内核都设计成单内核,单内核意味着一个单独的大过程,所有内核服务、模块运行在同一地址空间;

优点:简单、高效、性能高

缺点:安全、隐私问题、稳定性。

所有事物的发展都先野蛮生长,由于没有人为的规则约束,事物的发展首先是以效率为优先的,等事物发展的足够影响到人了,人类就会加以一定的规则约束,这样就需要考虑很多规则、安全、隐私等问题。

做一个行业很重要的是要理解当前行业处于事物发展的什么阶段。

微内核:微内核的功能被划分为多个独立的过程,每个过程叫一个服务器,,所有的服务器都保持独立运行在各自的地址空间上,不能直接调用函数,要通过消息传递处理微内核通信:系统采用了进程间通信(IPC)的机制,

只有强烈请求特权服务的服务器才能运行在特权模式。

服务器的独立有效避免了一个服务器的崩溃影响了另一个,同时模块化的系统可以很方便替换服务器。

微内核优点:安全、隐私、稳定性

缺点:开销太多,IPC、特权服务非特权的切换、消息传递等,性能不高是最大的问题,导致当前的微内核 windows NT 和Mac OS X都是全部服务器运行在内核空间(特权服务),这违背了微内核设计的初衷。

Linux汲取了微内核的精华,引以为豪的是模块化设计、抢占式内核、支持内核线程以及动态装载内核模块的能力。(实用主义)

《Linux设备驱动程序》

并发性

内核代码是可抢占的,即使是单处理器也需要考虑类似多处理系统的并发问题。

Linux内核代码(包括驱动程序代码)必须是可重入的,必须能够同时运行在多个上下文中。

内核数据结构需要仔细设计才能保证多个线程分开执行,访问共享数据的代码也必须避免破坏共享数据,要编写能够处理并发问题而同时避免竞态(不同的执行执行顺序导致不同的结果发生)的代码。

驱动程序需要考虑并发问题。

当前进程

内核代码可以通过访问全局项current来获得当前进程,current在<asm/current.h>中定义,是一个指向struct task_struct的指针,而task_struct结构在 linux/sched.h 文件中定义。

current指针指向当前正在运行的进程,在open、read等系统调用的执行过程中,当前进程指的是调用这些系统调用的进程。

对于SMP系统,内核开发者设计了不依赖于特定架构的机制,且是快速的,将指向task_struct结构的指针隐藏在内核栈中,这种实现的细节同时也对其他内核子系统隐藏,设备驱动程序只要包含 linus/sched.h 头文件即可引用当前进程。

内核的栈非常小,4K,我们自己的函数必须和整个内核空间调用链一同共享这个栈,因此声明大的自动变量不是好主意,如果需要大结构,应该在调用时动态分配该结构。

具有双下划线的函数名称,还表示该函数通常是接口的底层组件,谨慎调用。

内核代码不能实现浮点数运算,如果打开了浮点支持,某些架构上需要在进入和退出内核空间时保存和恢复浮点处理器的状态。内核代码不需要浮点运算。

编译模块

在内核源码中Documentation/kbuild目录下,展示了内核之间各个模块是如何连接在一起的,在Documentation/Changes文件中列出了编译内核需要的工具,gcc make ps udev 等工具。

真正的困难在于理解设备并最大化其性能。

有可能会有复杂的驱动程序会包含多种类型的设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值