linux2.6内核编程培训.ppt_第1页
linux2.6内核编程培训.ppt_第2页
linux2.6内核编程培训.ppt_第3页
linux2.6内核编程培训.ppt_第4页
linux2.6内核编程培训.ppt_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux2.6内核编程培训,庞宇,2011年3月12日,网络安全部,目录,一,代码执行环境和互斥,内存管理和分配三,内核提供的同步机制四,闲谈,一代码执行环境和互斥,代码执行环境,内核启动初始化所有CPU (无论是单核还是多核)在任意时间点的活动范围都在用户空间中执行,并且是进程上下文中的三个活动之一。 它在内核空间中运行,并位于进程上下文中。 表示特定进程的执行。 在内核空间中运行,位于中断上下文中。 不管哪个进程,都处理特定的中断。 中断处理程序、linux的中断处理程序无需重新输入。 如果一个中断处理程序正在运行,则相应的中断线由所有处理器屏蔽,以防止同一中断线接收到另一个新的中断。

2、通常,所有其他中断都处于打开状态,因此可以处理这些不同中断线上的其他中断,但始终禁止当前中断。 因此,不会同时调用相同的中断处理程序来处理嵌套的中断。 但是,如果多个中断共享相同的数据,则必须考虑互斥。 单核:相同中断线的处理程序不需要考虑重新输入。 但是,如果要在不同的中断处理程序中使用共享数据,请使用local_irq_disable ()等函数掩蔽当前的CPU中断。 多核:相同的中断线处理程序不需要考虑重新输入。 但是,如果在不同的中断处理程序中使用共享数据,则使用spin_lock_irqsave ()和spin_lock_irqstore ()函数(因为不知道当前是否允许中断)屏蔽当

3、前的CPU中断并且互斥锁定这样可以确保当前CPU不会因其他中断而中断,并且无论其他CPU是在中断上下文中运行还是在进程上下文中运行,都可以与其他CPU互斥。 软中断处理程序(1)、软中断处理程序在中断上下文中处理并且在从一个硬件中断代码返回时被调度。 (软中断在中断的进程地址空间的中断上下文中执行)在ksoftirqd内核线程中执行。 (软中断在此进程的地址空间中断上下文中执行)同一类型的两个软中断可以同时在一个系统的多个处理器上执行。 但是,同一处理器上的一个软中断不会切断另一个软中断,所以不需要禁止下半部分。 单核心:不需要做任何事。 多核:使用spin_lock ()和rwlock ()

4、等函数阻止对全局变量的冲突访问。 软中断处理程序由中断处理程序中断,软中断处理程序和中断处理程序共享数据时。 可以使用单核: local_irq_disable ()等函数掩蔽中断的冲突。 (只能关闭当前处理器的中断)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函数屏蔽中断,同时施加互斥锁。 (只关闭当前处理器的中断)、软中断处理程序(2)、注意:在获得锁之前,必须首先禁止本地中断。 否则,中断处理程序可能会中断具有锁的内核代码并尝试冲突此自旋锁。 注意:只需要关闭当前处理程序上的中断。 如果在不同的处理器上发生中断,即使中断处理程序旋转到同一锁,也不会

5、阻碍锁的所有者(在不同的处理器上)最终解除锁定。内核抢占(1)、相同的内核进程上下文可以在多个CPU上同时运行,并且可以使用spin_lock ()等函数屏蔽多核冲突。 单核: spin_lock ()仅禁止内核断开。 多核: spin_lock ()锁定多个CPU,以防止它们同时访问同一数据。 如果软中断可能在内核进程上下文中中断,并且进程上下文和软中断共享数据:使用单核: local_bh_disable ()等函数掩蔽软中断。 (只能关闭当前处理程序的软中断)使用多核: spin_locak_bh ()等函数在屏蔽软中断的同时进行互斥锁定。(只能关闭当前处理器的软中断)注意:在获取锁之前

6、,必须禁止本地软中断。 否则,软中断处理程序可能会中断保持锁的内核代码,并尝试与此保持的自旋锁冲突。 注意:只需要关闭当前处理程序上的软中断。 如果在不同的处理器上发生软中断,即使软中断处理程序旋转到同一锁,也不会阻碍锁定的所有者(在不同的处理器上)最终解除锁定。内核抢占(2)、内核进程上下文可被中断,对于进程上下文和中断共享数据:使用单核: local_irq_disable ()等函数屏蔽中断。 (只能关闭当前处理器的中断)多核:用spin_lock_irq ()和spin_lock_irqsave ()等函数屏蔽中断,同时施加互斥锁。 (只能关闭当前处理器的中断)注意:在获得锁之前,必须

7、禁止本地中断。 否则,中断处理程序可能会中断保持锁的内核代码,并尝试与保持的自旋锁发生冲突。 注意:只需要关闭当前处理程序上的中断。 如果在不同的处理器上发生中断,即使中断处理程序旋转到同一锁,也不会阻碍锁的所有者(在不同的处理器上)最终解除锁定。 可能是内核断开(3)、内核进程的上下断开。 在从中断处理程序(软中断或硬中断)切换到内核区域之前发生内核断开(无法使用中断处理程序断开内核)。 内核在进程上下文中释放spinlock锁(如果保持旋转锁,则无法断开内核,也无法切换上下文)。 内核在进程上下文中调用perrmpt_enable ()函数允许内核断开连接时。 对于内核任务中显示的调用sc

8、hedule ()。 如果内核任务被阻止。 preempt_enable ()或preempt_disable ()函数用于允许或禁止内核断开。 用于上述冲突防止的spin_lock ()、spin_lock_* ()、local_irq_disable ()、local_bh_disable、2内存管理被分配为,内存管理、ZONE_DMA这样的区域中包含的页面,在旧的设备ZONE_NORMAL此区域中包含的页面在内核线性地址空间中映射,而x86系统中包含的页面通常位于与16M内核线性地址对应的物理内存范围内。 ZONE_HIGHMEM包含在此区域中的物理内存是无法映射内核的线性地址空间的内存

9、,并且当内核使用此区域的页面时,该区域的页面首先执行地址映射(映射到内核的VMALLOC线性地址空间)。 如果在分配内存时指定了_GFP_DMA标志,则仅搜索ZONE_DMA部分。 如果未指定标志,则同时搜索ZONE_NORMAL和ZONE_DMA部分,并优先搜索ZONE_NORMAL部分。 如果指定_GFP_HIGHMEM标志,则会搜索三个段,并且搜索段的优先级为ZONE_HIGHMEM、ZONE_NORMAL和ZONE_DMA。 编程中常用的类型标志GFP_KERNEL标志可以在内核空间的进程上下文中使用,并且可以休眠。 GFP_ATOMIC标志可在内核空间的进程上下文、中断上下文和spi

10、nlock锁之间使用,不能休眠。存储器分配(1)、如果需要连续的物理页,则以页为单位分配alloc_pages(gfp_mask,order )等函数,由于内核通过合作伙伴系统算法管理存储器页,所以此函数休眠吗? kmalloc (大小、标志)函数。 最多可按字节分配128K的内存。 flags决定此函数是否休眠以及要为哪些段分配内存。 但是,不能使用_GFP_HIGHMEM标志为高端内存分配内存。 此外,如果存储器分配部(2)不需要物理上连续的页面而仅需要虚拟地址上的连续页面,则存储器分配部(2)利用vmalloc(size )函数分配存储器。 此函数休眠,不能在暂停上下文中使用。由于vma

11、lloc ()分配内存指定了_GFP_HIGHMEM标志,因此首先从高端内存(缺省值大于896M )分配。 可获取的地址位于VMALLOC_STARTVMALLOC_END空间中,默认大小为128M。 由于物理上不连续,因此由此函数分配的内存不能用于处理器以外的其他处理器。 由vmalloc ()分配的内存会导致TLB抖动,因此无法高效使用。内存分配(3)、创建和销毁大量大型数据结构时,请考虑建立slab缓存。 kmem_cache_create ()创建仅使用ZONE_NORMAL和ZONE_DMA区域的高速缓存。 此函数休眠,不能在暂停上下文中使用。 kmem_cache_destroy

12、()释放缓存。 此函数休眠,不能在中断上下文中使用。 kmem _ cache _分配(卡片、标志)。 此函数从cachep指定的缓存中获取对象,flags决定是否休眠。 kmem _ cache _ free (卡片,对象)。 此函数将objp指向的对象释放到cachep指定的缓存中。 这个函数睡不着。 内存分配(4)需要从高端内存分配时,使用以下分配方法。 使用alloc_pages(gfp_mask,order )将_GFP_HIGHMEM标志指定给gfp_mask,但是此函数没有映射为返回指向page结构的指针,而是返回指向page结构的指针vmalloc ()函数也从高端内存分配,并

13、返回映射的逻辑地址。 但是,可分配的内存大小为VMALLOC_STARTVMALLOC_END空间(默认为128M内存空间)。 此外,此函数取睡眠,不能在中断上下文中使用。 释放内存,每个内存分配函数对应一个释放函数,释放时使用对应的释放函数,并注意该函数是否休眠。 有些内存释放函数将内存释放到其高速缓存(slab缓冲区),而不是实际释放到空闲页面队列。 内核周期性地(几乎每隔两秒)调用cache_reap ()函数以重用slab高速缓存的内存页。 如果内核调用_alloc_pages ()检测到适合内存分配的所有内存管理区域中的可用页低于“警告”值,则激活kswapd内核线程并重用内存。 内

14、存分配失败时,激活内存不足回收函数try_to_free_pages ()进行回收。 如果内核无法释放更多内存,则删除进程将释放更多内存。 有些页面不能重复使用。 空闲页,保留页(带有PG_RESERVED标志),内核动态分配页,内核状态堆栈页,临时锁定页(PG_LOCKET标志集),内存锁定页(VM_LOCKED )。某些可重用页内存管理的一些问题是,内核只能直接使用0896M的内存空间。 即使系统有2G物理内存,并且CONFIG_HIGHMEM和CONFIG_X86_PAE选项打开,内核空间也只能使用896M内存。 这在linux2.6内核中也没有变化。 (如果选中CONFIG_HIGHM

15、EM选项,则用户区域可以使用超过1G的内存区域。 如果选中CONFIG_X86_PAE选项,则X86-CPU总线为36位。 也就是说,cpu可以访问064G内存。 调用_alloc_pages ()分配高端内存页,因为通过kmap ()的内核空间的线性地址空间只有1G。 由于内核仅限制了1G个线性地址空间,即使在我们的设备中使用2G个物理存储器,也将浪费1G个物理存储器。 (但是,如果选中CONFIG_HIGHMEM选项,则1G2G内存空间可供用户空间使用)、三个内核提供的同步机制以及每个CPU变量的CPU数据可用于大量(或最小化)数据丢失唯一的安全要求是禁止内核断开连接。 此成本远小于锁定,

16、因为接口会自动执行此过程(在获取当前处理器编号时必须调用get_cpu ()函数,该函数会自动调用preempt_disable ()以禁止内核断开对应的put_cpu ()也会自动调用preempt_enable ()以允许内核断开连接。 每个CPU数据在中断或进程上下文中使用是安全的。 但是,在访问各CPU数据时不能休眠。 不这样做的话,醒来之后可能到了其他处理器。 每个CPU变量保护来自不同CPU的并发访问,但不保护来自异步函数(中断处理程序和可延迟函数)的访问。 在这种情况下,需要另一个同步基元。 各CPU变量在单核中没有意义,只有在多核中才有意义。 一个CPU不能访问与其他CPU对应

17、的数组元素。 您还可以自由阅读和修改自己的元素,而不必担心竞争条件。 因为这是唯一有资格做到这一点的CPU。 保证原子操作(1)、原子操作在单核系统和多核系统中都能正确执行。 此外,执行效果相同。 通过原子操作,即使命令以原子方式执行,执行过程也不会中断。 内核提供两个原子操作界面。 一个操作整数,另一个操作单独的位。 linux支持的所有体系结构都实现了这两个接口。 大多数体系结构原本支持简单的原子操作,或提供锁定内存总线的指令,以便一步执行。 整数原子操作整数原子操作只能处理atomic_t类型的数据。 如果需要将atomic_t类型转换为int类型,可以使用atomic_read ()来执行。 原子整数运算函数为atomic_* ()。 原子整数操作最常见的用途是实现计数器。 在原子上,不要在指令执行过程中中断,或者完成所有执行,或者完全不执行。 原子操作仅保证原子性,顺序性根据屏障指令实施。 原子操作(2)、原子位操作位操作函数操作通常的存储器地址。 残奥仪表是指针和标记,第0位是指定地址的最低有效位。 在32位机器中,第31位是给定地址的最高有效位,第32位是下一个字的最低有效位。 使用原子操作时,通常会访问1字长的内存,因此标签应该在031之间(64位机器中在063之间),但标签的范围不受限制。 因为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论