Linux内核源代码导读.ppt
Linux内核源代码导读
4.1 实模式setup阶段setup用于体系结构相关的硬件初始化工作,在arch目录中的各个系统结构的平台相关都有类似功能的代码。
在32位的x86平台中,setup的入口点是arch/x86/boot/header.S 中的_start。
代码片段 4.1.节自arch/x86/boot/header.S1 .code162 section ".bstext", "ax"34 .global bootsect_start5 bootsect_start:67 # Normalize the start address8 ljmp $BOOTSEG, $start2910 start2:11 movw %cs, %ax12 movw %ax, %ds13 movw %ax, %es14 movw %ax, %ss15 xorw %sp, %sp16 sti17 cld1819 movw $bugger_off_msg, %si2021 msg_loop:22 lodsb23 andb %al, %al24 jz bs_die25 movb $0xe, %ah26 movw $7, %bx27 int $0x1028 jmp msg_loop29 .......30 .section ".bsdata", "a"31 bugger_off_msg:32 .ascii "Direct booting from floppy is no longer supported\r\n"33 .ascii "Please use a boot loader program instead.\r\n"34 .ascii "\n"35 .ascii "Remove disk and press any key to reboot . . .\r\n"3738 .section ".header", "a"3940 .globl hdr41 hdr:42 setup_sects: .byte SETUPSECTS43 root_flags: .word ROOT_RDONLY44 syssize: .long SYSSIZE45 ram_size: .word RAMDISK46 vid_mode: .word SVGA_MODE47 root_dev: .word ROOT_DEV48 boot_flag: .word 0xAA554950 # offset 512, entry point51 .globl _start52 _start:53 # Explicitly enter this as bytes, or the assembler54 # tries to generate a 3-byte jump here, which causes55 # everything else to push off to the wrong offset.56 .byte 0xeb # short (2-byte) jump57 .byte start_of_setup-1f58 1:59 ......60 code32_start: # here loaders can put a different61 # start address for 32-bit code.62 #ifndef __BIG_KERNEL__63 .long 0x1000 # 0x1000 = default for zImage64 #else65 .long 0x100000 # 0x100000 = default for big kernel66 #endif从第48行可以看出,第一个引导扇区以0x55AA 结尾,现在的内核都需要由Boot Loader 来加载。
LINUX内核进程管理PPT幻灯片
❖ suid和sgid是根据POSIX标准引入的,在系统调用改变uid 和gid时,用于保留真正的uid和gid。
❖ fsuid和fsgid称为文件系统的uid和gid,用于对文件系统操
作时的合法性检查,是LINUX独特的标识类型。它们一般分
别和euid和egid一致,但在NFS文件系统中NFS服务器需要
SIGSTP、SIGTTIN 或SIGTTOU)的反应; 其二是受到父进程ptrace调用的控制,
而暂时将处理机交给控制进程。
35
◆ ZOMBIE: 僵尸状态。 表示进程结束但尚未消亡的一种状态。 此时进程已经结束运行并释放大部分资
源,但尚未释放进程控制块。
36
进程调度
调度程序(scheduler)用来实现进程状态 之间的转换。
0 1 //等待资源 2 4 //等待信号 8
29
◆ RUNNING: 正在运行,或者在就绪队列中等待运行
的进程。 也就是上面提到的运行态和就绪态进程
的综合。 一个进程处于RUNNING状态,并不代表
它一定在被执行。
31
由于在多任务系统中,各个就绪进程需 要并发执行,所以在某个特定时刻,这些处 于RUNNING状态的进程之中,只有一个能 够得到处理机,而其他进程必须在一个就绪 队列中等待。
4
2. 动态性
进程与程序的区别在于,程序只是一个静态的 指令集合,而进程是一个正在系统中活动的指令集 合。
在进程中加入了时间的概念。进程具有自己的 生命周期和各种不同的状态,这些概念在程序中都 是不具备的。
5
由于以上两个性质,又可以衍生出进程 的第三个重要特性,即并发性。
若干个进程可以在单处理机状态上并发 执行。注意并发性(concurrency)和多处理机 并行(parallel)是两个不同的概念。
Linux内核分析 ppt课件
线性地址 cr3
global dir middle dir table
offset
页
页中间
页表
页全局
目录
目录
+
+
++
cr3:cpu的控制寄存器
13
PPT课件
图2-12 虚拟内存区域及其操作集的结构
vm_area_struct vm_end
进程的虚拟内存
vm_start vm_flags
虚拟内存区域
第二章 Linux内核分析
2.1 Linux内核结构概述
Linux内核主要由五个子系统组成:进程调度、内存管理、虚拟 文件系统,网络接口、进程间通信。内存管理与其它子模块的关系如 图2-1所示:
内存管理
硬件无关
硬件相关
虚拟文件系统 逻辑文件系统 硬件驱动程序
进程调度
网络 网络协议 硬件驱动程序
PPT课件
slab描述符
slab描述符
Full slab
Empty slab
Partially full slab
2.3.3 虚拟内存管理器
系统调用接口
mmap mremap
mmap filemap
11
Page_io Swap_state
swap
swapfile swap
kswapd
Page_alloc memory
2.2.1 描述进程的数据结构 2.2.2 进程调度 2.2.3 创建进程
2 2.2.4 进程通信P机PT课制件
图2-2 进程可运行度量函数流程图
goodness() 开始
p->policy 分类
SCHED_OTHER
最新第二章-Linux内核及内核编程精品课件ppt
Linux内核及编程
Kconfig和MakeFile
在Linux内核中增加程序需要完成以下3项工作
• 将编写的源代码拷入Linux内核源代码的相应目录。 • 在目录的Kconfig文件中增加关于新源代码对应项目的配置选项 • 在目录的Makefile文件中增加对新源代码的编译条目。
FORLINX_linux-2.6.36.2.tar.gz 。 • 文件解压到/usr/src/linux目录,然后稍作修改。 mv linux linux-2.6.5;
ln -s linux-2.6.5 linux。(可选)
信息检索
Linux内核编译步骤
• 通常要运行的第一个命令是: cd /usr/src/linux 。 • make mrproper :该命令确保源代码目录下没有不正确的.ko文件以及
Makefile
• 定义Linux内核的编译规则,make工具可以实现自动编译和增量 编译,但必须告诉make源程序之间的依赖关系,描述这种关系 的就是Makefile文件。
信息检索
MakeFile文件分类
信息检索
MakeFile的作用
决定编译哪些文件 • 顶层Makefile决定内核根目录下哪些子目录将被编进内核(采
信息检索
Linux内核的组成
进程调度
信息检索
Linux内核的组成
内存管理
• 内存管理的主要作用是控制多个进程安全地共享主内存区域。 • Linux内存管理完成为每个进程进行虚拟内存到物理内存的转换。 • Linux的每个进程享有4GB的内存空间,0~3GB属于用户空间,
3~4GB属于内核空间,内核空间对常规内存、I/O设备内存以及高端 内存存在不同的处理方式。
第7课ARMLinux内核ppt课件
• ARM处理器中,MMU是作为协处理器CP15 来实现的
• MMU相关的最主要的寄存器有三个:
– 控制寄存器,控制MMU的开关、高速缓存的开 关、写缓冲区的开关等
– 地址转换表基地址寄存器 – 域访问控制寄存器
12
• 控制寄存器中有S位(表示System)和R位(表 示ROM),用于决定了CPU在当前运行状态下
– 用户状态(User) – 中断状态(IRQ, Imterrupt Request) (0x18) – 快中断状态(FIQ,Fast Imterrupt Request)(0x1c) – 监管状态(Supervisor) – 终止状态(Abort) – 无定义状态(Undefined) – 系统状态(System)
9
• 如果采用页面映射,“段映射表”就成了“首 层页面映射表”,映射的过程如下(假设每页大 小为2^12 =4KB):
– 以32位虚地址的高12位(bit20-bit31)作为访问首层映射表的下 标,从表中找到相应的表项,每个表项指向一个二层映射表。
– 以虚拟地址中的次8位(bit12-bit19)作为访问所得二层映射表 的下标,进一步从相应表项中取得20位的物理页面地址。
15
#define TASK_SIZE #define PAGE_OFFSET #define PHYS_OFFSET
(0xc0000000UL) (0xc0000000UL) (0xa0000000UL)
#define __virt_to_phys(x) #define __phys_to_virt(x)
– 最后,将20位的物理页面地址和虚拟地址中的最低12位拼接在 一起,就得到了32位的物理地址。
10
• 凡是支持虚存的CPU必须为有关的映射表提 供高速缓存,使地址映射的过程在不访问 内存的前提下完成,用于这个目的的高速 缓存称为TLB(Translation Lookaside Buffer)
最新linux内核源代码分析-中断处理程序与内核同步PPT课件
Tasklets机制
• Tasklet_action() 和tasklet_hi_action()做的工作:
– 禁止中断 – 将当前处理器上的该链表清空 – 允许中断 – 循环遍历链表上每一个待处理的tasklet – 若是多处理器系统,看是否RUN,若是下一个 – 若没有执行,设为RUN – 检查count是否为0,若不是,下一个 – 调用执行TASKLET,后清空相应的标志。 – 下一个
– 刷新操作 flush_scheduled_work(); cancel_ – 创建新的队列
选择推后任务的处理机制
» 上下文
• 软中断 中断 • Tasklet 中断 • 工作队列 进程
顺序执行保障
没有 同类型的不能同时执行 没有
加锁的问题
• 下半部之间 • 下半部与用户进程之间
有共享资源的地方要加锁
•}
工作队列机制
• 工作队列机制和上面两中机制不同,它将下半部功能 交由内核线程执行,有线程的上下文环境,可以睡眠。
• 工作队列机制的实现
– 提供创建worker threads的接口 – 提供默认的工作者线程处理排到队列里的下半部工作 – 提供把需要推后执行的任务排到队列里的接口
工作队列机制
• 表示线程的数据结构
系统调用和中断(回顾上节课内容)
• 系统调用原理
• INT 80H • 中断描述符(80H指向system_call) • 系统调用表(system_call_table) • 系统调用编号(系统调用在系统调用表中的位置)
• 中断
• 中断描述符 • 中断号 • 中断处理程序
中断处理程序的上、下半部机制
• 4、企业财务管理目标
• 在合法合规和承担社会责任的前提下,以股东财富的最大化为目标。 • 利益相关协调的逻辑:企业要生存和发展,必须取得收入;企业要取得收入,
嵌入式Linux内核开发教程之深入分析Linux内核源码-进程调度(1) 26页PPT文档
嵌入式Linux内核开发教程之1.2 时钟运作机制
RTC和OS时钟之间的关系通常也被称作操作系统的 时钟运作机制。一般来说,RTC是OS时钟的时间基 准,操作系统通过读取RTC来初始化OS时钟,此后
一块芯片,它靠电池供电,即使系统断电,也可以 维持日期和时间。由于它独立于操作系统,所以也 被称为硬件时钟,它为整个计算机提供一个计时标 准,是最原始最底层的时钟数据。
Linux只用RTC来获得时间和日期;然而,通 过作用于/dev/rtc设备文件,也允许进程对RTC编 程。通过执行/sbin/clock系统程序,系统管理员 可以配置时钟。
int tv_sec;
/* 秒 */
int tv_usec; (microsecond)*/
/* 微秒:百万分之一秒
};
struct timezone {
/* 时区 */
int tz_minuteswest; 时间往西方的时差 */
/* 格林尼治
int tz_dsttime; 式 */
嵌入式Linux内核开发教程之1.3 Linux时间基准
以上我们了解了RTC(实时时钟、硬件时钟)和OS 时钟(系统时钟、软时钟)。下面我们具体描述OS 时钟。OS时钟是由可编程定时/计数器产生的输出
脉冲触发中断而产生的。输出脉冲的周期叫做一个 “时钟滴答”。计算机中的时间是以时钟滴答为单位 的,每一次时钟滴答,系统时间就会加1。操作系
计算机最基本的时间单元是时钟周期,例如取指令、 执行指令、存取内存等。时间系统是计算机系统非 常重要的组成部分,特别是对于Unix类分时系统尤
Linux操作系统内核原理PPT课件
进程虚存空间 虚存区
虚存区
分页式内存管理
• Linux系统中使用了同时用于64位和32位系统 的通用分页模型。
• 模型中使用四级页表,32位系统只使用PGD和 PTE两项
线性地址 64位
页全局目录PGD 页上级目录PUD 页中级目录PMD 页表PTE
页内偏移
页框
cr3
第20页/共28页
Linux物理内存管理
• Linux内核为了适应不同的硬件架构,对不同性
能的内存分成不同的节点(Node),内存模型如下
图:
pg_data_t
内存节点 16M
ZONE_DMA
node_zones
zone
ZONE_NORMAL
896M
ZONE_DMA
ZONE_NORMAL ZONE_HIGHMEM
zone_mem_map
nopage swapin swaout
……
……
vm_area_struct vm_start vm_end …… vm_ops vm_next
vm_area_struct vm_start vm_end …… vm_ops vm_next
vm_area_struct vm_start vm_end …… vm_ops vm_next
进程1 进程2 进程3
进程n 用户态
…… ……
内核线程1
内核线程2
内核线程3
内 核
内核线程4
功 能
内核线程5
函
数
第3页/共28页
内核线程n
内核态 地址空间
进程和线程的区别
• 线程是系统最小的执行流单位,一个线程就是 一个执行过程,是任务调度的基本单位。
Linux内核模块编程PPT课件
“__init”和“__exit”都是宏,利用了gcc的扩展关键字,分 别要求编译器将所声明函数的目标代码放入“init.text”段和 “exit.text”段中(两个特殊的ELF段)。
所以module_init本质上是将一个函数指针变量放在了一名为".initcall6.init"
ELF节中。
.
10
Executable and Linking Format
.
11
模块卸载函数
模块卸载函数必须用宏“module_exit”指定,无返 回值。
当通过rmmod命令卸载某模块时,模块的卸载函数 会自动被内核执行,完成与模块装载函数相反的功 能。(注销一些内核数据结构,释放资源等)。
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void) {
// 这是模块加载函数
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void __exit hello_exit(void) {
Linux驱动程序就是一种特殊的内核模块。
.
5
内核模块与应用程序的不同
内核模块工作在内核空间(supervisor space),而应 用程序工作在用户空间(user space)
内核模块是一个由多个回调函数组成的“被动”代 码集合体,采用了“事件驱动模型”;而应用程序 总是从头至尾的执行单个任务。
Linux内核分析第四章PPT教学课件
17
宏_syscall0展开
static inline _syscall0(int,fork) static inline int fork(){}
static inline _syscall0(int,pause) static inline int pause(){}
static inline _syscall0(int, sync) static inline int sync (){}
Linux操作系统内核分析
2020/12/10
1
程序功能
➢ 读取系统参数 ➢ 初始化各个模块 ➢ 创建0、1进程
2020/12/10过BIOS中断调用获取了系统的各 个参数,并把这些参数保存在物理地址从 0x90000开始的内存中
➢ 参见P44的表3-3
2020/12/10
buffer_memory_end
内核
高速缓冲区
主内存
main_memory_start
memory_end
2020/12/10
7
程序功能
➢ 读取系统参数 ➢ 初始化各个模块 ➢ 创建0、1进程
2020/12/10
8
初始化各个模块
mem_init(main_memory_start,memory_end); trap_init(); blk_dev_init(); chr_dev_init(); tty_init(); time_init(); sched_init(); buffer_init(buffer_memory_end); hd_init(); floppy_init(); sti();
2020/12/10
13
程序功能
➢ 读取系统参数 ➢ 初始化各个模块 ➢ 创建0、1进程