预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共89页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

学习LINUX内核Linux简介一个典型的Linux操作系统的结构最简单也是最复杂的操作Linux基本概念提纲Ckcore的特权指令有:MFCR、MTCR、PSRSET、PSRCLR、RFI、RTE、STOP、WAIT、DOZE 这里所说的地址空间是虚拟地址而不是物理地址区分用户态和内核态目的在于安全考虑: 禁止用户程序和底层硬件直接打交道 (最简单的例子,如果用户程序往硬件控制寄存器写入不恰当的值,可能导致硬件无法正常工作) 禁止用户程序访问任意的物理内存 (否则可能会破坏其他程序的正常执行,如果对内核所在的地址空间写入数据的话,会导致系统崩溃)用户程序如何同设备打交道?系统调用的意义系统调用过程: 执行陷阱异常指令trap0 进入异常后,处理器PSR最高位被硬件置1,实现普通用户到特权用户的转变 根据系统调用号(r1传入),调用相应函数,满足用户需求 系统调用返回,重新回到用户态,用户获得资源。 API和系统调用完全不同: API只是一个函数定义 系统调用通过“软中断”向内核发出一个明确的请求trap0Linux2.6提供了300多个系统调用,用户可以通过这些系统调用,及它们的组合实现对设备的操作。 通常,应用程序开发并不直接和系统调用打交道,而是用C库提供的一层包装函数。 如,malloc()sbrk()sys_brk内核函数 sys_brk是45号系统调用,C库中它的系统调用方式可能是: … movir1,45 trap0 …Linux基本概念提纲虚拟内存Ckcore的MMU虚拟地址空间虚拟地址到物理地址转换虚拟地址到物理地址转换:多级映射 物理内存获取过程: 用户程序请求物理内存内核分配物理页面内核填写对应页表项用户程序获得物理内存 从这个过程看出,内存管理的核心内容是:物理页面分配和所有进程页表的维护,即物理内存管理和虚拟空间管理。物理内存管理虚拟空间管理缺页异常处理Linux页面交换策略slab分配器ioremap():外部设备存储空间的地址映射Linux基本概念提纲简单说进程的概念标识一个进程进程描述符Linux2.6进程的状态Linux2.6最新进程状态特性: 1.TASK_DEAD状态区分两个不同的exit_state: EXIT_ZOMBIE:进程已终止,它正等待其父进程收集关于它的一些统计信息。 EXIT_DEAD:最终状态。其父进程已经通过wait4()或waitpid()调用收集所有统计信息,为了防止其他执行线程对同一进程也执行wait()类系统调用。 2.添加TASK_WAKEKILL用于在接收到致命信号时唤醒进程: #defineTASK_KILLABLE(TASK_WAKEKILL|TASK_UNINTERRUPTIBLE) #defineTASK_STOPPED(TASK_WAKEKILL|__TASK_STOPPED) #defineTASK_TRACED(TASK_WAKEKILL|__TASK_TRACED) TASK_KILLABLE可以替代TASK_UNINTERRUPTIBLE在某些地方的应用。 进程状态转换图进程的内核堆栈再看进程的概念进程的管理进程可运行链表 内核把所有处于TASK_RUNNING状态的进程组织成一个可运行双向循环队列。 调度函数通过扫描整个可运行队列,取得最值得执行的进程投入执行。避免扫描所有进程,提高调度效率。 问题:可运行进程(n)越多,每次调度的开销越大。这是2.4的O(n)调度算法的缺点。Linux2.6新引入O(1)调度算法调度时机进程切换(processswitching)进程上下文硬件上下文在linux中,一个进程的上下文主要保存在thread_info和thread_struct,以及内核态堆栈中。 thread_info structthread_info{ structtask_struct*task;/*maintaskstructure*/ unsignedlongflags; structexec_domain*exec_domain;/*executiondomain*/ intpreempt_count;/*0=>preemptable,<0=>BUG*/ mm_segment_taddr_limit; structrestart_blockrestart_block; structpt_regs*regs; }; thread_struct structthread_struct{ unsignedlongksp;/*kernelstackpointer*/ unsignedlongusp;/*userstackpointer*/ unsignedlongsr;/*savedsta