目录 1 概述 IA-32 体系结构内存地址映射 CPU 相关寄存器 系统寄存器 内存管理寄存器 保护模式的内存管理 位时页面机制地址映射 逻辑地址到线性地址的映射...9

Size: px
Start display at page:

Download "目录 1 概述 IA-32 体系结构内存地址映射 CPU 相关寄存器 系统寄存器 内存管理寄存器 保护模式的内存管理 位时页面机制地址映射 逻辑地址到线性地址的映射...9"

Transcription

1 Linux 内存地址映射

2 目录 1 概述 IA-32 体系结构内存地址映射 CPU 相关寄存器 系统寄存器 内存管理寄存器 保护模式的内存管理 位时页面机制地址映射 逻辑地址到线性地址的映射 线性地址到物理地址的映射 PAE 页面机制地址映射过程 PDPTE 寄存器 逻辑地址到线性地址的映射 线性地址到物理地址的映射 Linux 内核的地址映射过程 段式映射过程 页式映射过程 Linux 地址映射实验 gdtr 和 cr3 寄存器值的获取 读取物理内存上的数据 地址映射过程实验 段式映射过程 页式映射过程 PAE 机制下地址映射过程实验 段式映射过程 页式映射过程 常见问题及解答...28

3 1 概述 结果 : 在分析 Linux 内存地址映射前, 先来看一段简单的 C 程序代码在 32 位和 64 位系统上运行 #include <stdio.h> int main() { unsigned long tmp; tmp = 0x ; printf("tmp variable address:0x%08lx\n", &tmp); } return 0; [root@rhel6 C]#./addr tmp variable address:0xbff42dec [root@rhel6 C]# [root@rhel6-x64-1 C]#./addr tmp variable address:0x7fff138e0888 上面的程序功能非常简单, 就是打印出临时变量 tmp 的地址 程序运行后在 32 位系统中 tmp 地址为 0xBFF42DEC, 在 64 位系统中打印地址为 0x7FFF138E0888( 注意 : 每次运行的结果都可能不同 ) 那么这个地址对是逻辑地址, 还是线性地址? 物理地址? 临时变量 tmp 到底存放在物理内存的哪个位置上? 在 Intel 体系结构的 CPU 中, 现代操作系统如 Linux 都采用内存保护模式来管理内存 我 们看 Linux 内核中的内存管理相关内容时, 会遇到一个基本问题 : 普通用户程序中的地址是 如何转换到内存上的物理地址的?IA-32 架构的 CPU 规定地址映射过程是逻辑地址 线性地址 物理地址 Linux 既然能在 Intel 架构的 CPU 上运行, 就要遵守这个规定, 那 么 Linux 又是如何进行地址映射的? 本文以 RHEL5.8 i686 内核源码版本 ( 源码下载地址

4 ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5server/en/os/srpms/), 在 IA-32 架构 CPU 为基础, 分析 CPU 架构下的地址映射过程及 Linux 内核中的实现, 并给出一些工具 ( 附源码 ) 来验证整个地址映射过程 ( 包括 PAE 机制下的映射 ), 方便我们更直观和深入理解 Linux 在 x86 CPU 地址映射 对于 Linux 内核在 x64_64 CPU 中的地址映射过程, 会在另外一篇文章中单独介绍 2 IA-32 体系结构内存地址映射 2.1 CPU 相关寄存器 IA-32 架构中提供了 10 个 32 位和 6 个 16 位的寄存器 这些寄存器分为三大类 : 通用寄存器 控制寄存器 段寄存器 通用寄存器进而分为数据 指针和索引寄存器 通用寄存器包括 EAX EBX ECX EDX ESI EDI EBP ESP 数据寄存器有 EAX EBX ECX EDX, 索引寄存器是两个 :ESI(Source Index) EDI(Destination Index), 这两个寄存器都和字符串处理指令相关 指针寄存器也有两个 : ESP(Stack Pointer) 和 EBP(Base Pointer), 这两个寄存器主要来维护栈 我们知道程序运行和函数调用时, 都用到栈, 不同的程序以及程序中不同的函数, 都有各自的栈空间, 那么怎么来维护不同的栈? 寄存器 ESP 就是指向当前栈的栈顶, 而寄存器 EBP 指向当前栈的栈底 注意程序运行及函数调用时, 不同的栈,EBP 和 ESP 的值都不同

5 图 1 通用寄存器 段寄存器和控制寄存器控制寄存器有 2 个 :EIP 和 EFLAGS 处理器使用 EIP 来跟踪下一条要执行的指令, 也称为程序计数寄存器 段寄存器有 6 个 :CS ES DS FS GS SS 系统寄存器 为了初始化 CPU 和控制系统操作,IA-32 提供了 EFLAGS 寄存器和几个系统寄存器 EFLAGS 寄存器用来保存系统的一些状态标志 (1)EFLAGS 寄存器中的 IOPL 域, 控制任务和模式的切换 中断处理 指令跟踪和访问权限 ; (2) 控制寄存器 (CR0 CR2 CR3 和 CR4) 包含用来控制系统级别操作的数据和信息 ; 其他一些标志来只是 CPU 的特殊功能 ;CR3 寄存器, 对本文很重要, 后面会详细介绍它的功能以及如何获取 CR3 积存器的值 (3) 调试寄存器允许设置程序的断点, 以调试程序和系统软件 ; (4)GDTR LDTR 和 IDTR 寄存器 (5) 任务寄存器 (6) 型号相关的寄存器 图 2 系统寄存器 内存管理寄存器 处理器提供了 4 个内存管理寄存器 :GDTR LDTR IDTR 和 TR 这 4 个寄存器在前面 一小节 ( 系统寄存器 ) 中提到, 我们关心地址映射 ( 内存管理 ) 相关的寄存器, 故这里详细 介绍一下

6 图 3 内存管理寄存器 1. Global Descriptor Table Register(GDTR) GDTR 寄存器保存 GDT 的基址和表限 (table limit) 基址是 GDT 的第一个字节的地址, 表限 (table limit) 给出表的大小 指令 LGDT 和 SGDT 是分别用来设置和保存 GDTR 寄存器的值 上电或重启处理器后, 基址默认的值为 0, 表限 (table limit) 的值为 0FFFFH 在保护模式运行前, 作为处理器初始化的一部分, 必须在 GDTR 寄存器中设置新的基址 在后面的 Linux 地址映射过程中, 会用到 GDTR 寄存器 在此顺便介绍一下汇编指令 SGDT, 即获取 GDTR 寄存器的值 SGDT 指令的操作如下 : Operation IF instruction is IDTR THEN IF OperandSize 16 THEN DEST[0:15] IDTR(Limit); DEST[16:39] IDTR(Base); (* 24 bits of base address loaded; *) DEST[40:47] 0; ELSE (* 32-bit Operand Size *) FI; DEST[0:15] IDTR(Limit); DEST[16:47] IDTR(Base); (* full 32-bit base address loaded *) ELSE (* instruction is SGDT *) IF OperandSize 16 THEN DEST[0:15] GDTR(Limit); DEST[16:39] GDTR(Base); (* 24 bits of base address loaded; *) DEST[40:47] 0; ELSE (* 32-bit Operand Size *) FI; FI; DEST[0:15] GDTR(Limit); DEST[16:47] GDTR(Base); (* full 32-bit base address loaded *)

7 2. Local Descriptor Table Register(LDTR) LDTR 寄存器的值包括 :16 位的段选择码 基址 段限 (segment limit) 和 LDT 描述符属性 基址是 LDT 段的起始地址, 段限是段的大小 指令 LLDT 和 SLDT 是分别用来设置和保存 LDTR 寄存器的值 3. Interrupt Descriptor Table Register(IDTR) IDTR 寄存器的内容是 :IDT 的基址和大小 指令 LIDT 和 SIDT 是分别用来设置和保存 IDTR 寄存器的值 4. Task Register(TR) TR 寄存器的内容包括 :16 位的段选择码 基址 段限 (segment limit) 和描述符的属 性 由于 Linux 中没有使用 TR 寄存器, 这里不作详细介绍 介绍这些 CPU 寄存器时, 很多人一脸茫然 这 4 个内存管理寄存器的用途是什么? 何时 会用到? 这里只是简单介绍, 随着地址映射过程的逐步分析, 再回过头来看这部分内容, 就 会很容易明白其用途和何时用 2.2 保护模式的内存管理 在 IA-32 架构中, 内存管理分为两块 : 分段和分页 分段机制是将代码 数据和栈分开, 这样处理器上运行多个程序, 不会相互影响 分页是操作系统可以实现按需分页和虚拟内存功能 分页也可以用来隔离多个任务 当运行在保护模式时, 分段的基址是必须使用的, 不能关闭分段功能 ; 然而分页是可选的 在 Linux 系统中, 实际上是没有真正使用 IA-32 的分段机制, 仅使用分页机制 在分析地址映射过程之前, 先描述几个概念 : 逻辑地址 (Logical Addres) 线性地址 (Linear Address) 和物理地址 (Physical Address) 逻辑地址是在机器语言指令中, 来说明操作数和指令的地址 ; 每个逻辑地址包括两部分 : 段

8 (Segment) 和偏移量 (Offset) 线性地址也通常成为虚拟地址, 在 32 位系统中, 它是 32 位的无符号整型, 最大可以达到 4G 物理地址就是真正物理内存上的地址 图 5 是 IA-32 中的段页式模型 图 4 地址映射过程 图 5 IA-32 中的分段和分页 从图 5 可以看出, 地址映射过程是逻辑地址线性地址物理地址 也就是要经过两个映射过程 : 第一步是段式映射, 第二步是页式映射 当一条访问内存指令发出一个内存地址时 ( 大家思考一下, 此时 CPU 发出的地址类型是逻辑地址? 还是线性地址? 还是物理地址?)CPU 就按照段式映射和页式映射两个步骤来计算出实际上应该放在数据总线的地址, 大家也许会感到访问内存, 计算地址时这么麻烦! 在本文最后会给出工具和源码来查看

9 和验证整个地址映射过程, 大家有一个更为直观的认识 位时页面机制地址映射 逻辑地址到线性地址的映射 前面一节介绍了 IA-32 内存管理模型, 及段式映射过程 页式映射过程, 但只是一些概 要性的介绍 现在我们看一下更为详细的过程 图 6 逻辑地址到线性地址映射过程从逻辑地址到线性地址的映射过程如下 : (1) 根据指令的性质来确定应该使用哪一个段寄存器, 例如转移指令中的地址在代码段, 而取数据指令中的地址在数据段 ; (2) 根据段存器的内容, 找到相应的 地址段描述结构, 段描述结构都放在一个表中 (GDT 或 LDT TR IDT), 而表的起始地址保存在 GDTR LDTR IDTR TR 寄存器中 这就是 4 个内存管理寄存器 GDTR LDTR IDTR 和 TR 的用途 ; (3) 从地址段描述结构中找到基地址 ; (4) 将指令发出的地址作为位移, 与段描述结构中规定的段长度相比, 看看是否越界 ; (5) 根据指令的性质和段描述符中的访问权限来确定是否越权 ; (6) 将指令中发出的地址作为位移, 与基地址相加而得出线性地址 从逻辑地址到线性地址映射过程, 有几个细节地方需要关注两个问题 : a) 逻辑地址就是 CPU 指令发出的地址, 那么段选择码 (Segment Selector) 的值在哪 里? b) 知道段选择码后, 需要从描述符表 (Descriptor Table) 中找到相应的表项, 那怎

10 么知道描述符表在内存中哪个位置? 第一个问题的答案是段选择码在段寄存器中 ( 回忆一下 IA-32 中的 6 个段寄存器 ), 如 CS DS 等 第二个问题的答案是描述符表的基址在内存管理寄存器中 (GDTR LDTR IDTR TR) 当然每个地址只会对应一个段寄存器和内存管理寄存器 知道了从哪里取段选择码 (Segment Selector), 也知道了从内存的哪个位置取段描述符, 那么段选择码和段描述符的内容是怎样的? 图 7 段选择码 图 8 段描述符图 7 和图 8 分别是段选择码和段描述符的结构 段寄存器的高 13 位 ( 低 3 位另作他用 ) 用作访问段描述表中具体描述结构的下标 (index) GDTR 或 LDTR 中的段描述表指针和段寄存器中给出的下标结合在一起, 才决定了具体的段描述表项在内中的什么地方 从图 8 的段描述符结构中, 我们注意段基址 (Base Address 15:00 Base 23:16 Base 31:24) 和段限 (Segment Limit 15:00)

11 图 9 全局和局部描述符表 线性地址到物理地址的映射 上面是将逻辑地址映射为线性地址的过程, 此时还要将线性地址转换为物理地址, 才是真正要访问的内存地址 从线性地址到物理地址的映射过程为 : (1) 从 CR3 寄存器中获取页面目录 (Page Directory) 的基地址 ; (2) 以线性地址的 dir 位段为下标, 在目录中取得相应页面表 (Page Table) 的基地址 ; (3) 以线性地址中的 page 位段为下标, 在所得到的页面表中获得相应的页面描述项 ; (4) 将页面描述项中给出的页面基地址与线性地址中的 offset 位段相加得到物理地址 图 10 线性地址到物理地址的映射过程

12 图 11 32bit 页面机制时 CR3 寄存器和页面项对上面的步骤做一下补充说明 CR3 寄存器的值从哪里来的? 每个进程都会有自己的地址空间, 页面目录也在内存不同的位置上, 这样不同进程就有不同的 CR3 寄存器的值 CR3 寄存器的值一般都保存在进程控制块中, 如 linux 中的 task_struct 数据结构中 2.4 PAE 页面机制地址映射过程 PAE(Physical Address Extension) 是 IA-32 架构中物理地址扩展机制 在正常情况下,32 位系 统只能使用 4G 物理内存, 但使能 PAE 机制后使地址总线达到 36 根, 最大可以访问 64G 物理内存 必须设置 CR0 寄存器的第 31bit 为 0(CR0.PG=1), 打开页式映射机制 ; 设置 CR4 寄存器第 5bit 为 1(CR4.PAE=1) 和 IA32_EFER..LMW=0, 使能 PAE 机制 当逻辑处理器使用 PAE 页面机制时, 会将 32 位线性地址转换为 52 位物理地址 ( Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3A System Programming Guide, Part 1 May 2012 章节 4.4 PAE Paging) PDPTE 寄存器当使用 PAE 机制时,CR3 寄存器的值是指向 32 字节对齐页面目录指针表 (Page Directory Pointer Table) 表 1 PAE 机制下 CR3 寄存器的使用 页面目录指针表中共有 4 个 64bit 项, 称为 PDPTEs 每个 PDPTE 控制 1G 线性地址空间的访问 对应 PDPTE, 逻辑处理器维护 4 个架构无关的内部 PDPTE 寄存器, 分别为 PDPTE0 PDPTE1 PDPTE2 PDPTE3

13 表 2 PAE 机制下 PDPTE 格式 逻辑地址到线性地址的映射 PAE 机制仅与页面映射有关, 因此逻辑地址到线性地址映射过程一样 详细步骤请参考前面 非 PAE 机制下映射过程 线性地址到物理地址的映射 PAE 机制可以映射 4K 页面或者 2MB 页面, 在此我们仅考虑 4K 页面的映射过程, 如下图所示 图 12 PAE 机制下线性地址到物理地址的映射过程从线性地址到物理地址的映射过程为 : (1)PDPTE 值的来源线性地址的 30~31bit 用来选择 PDPTE 寄存器, 即 PDPTEi,i 的值就是 31:30 的值 因为线性

14 地址的 31:30 两个 bit 用来选择 PDPTE 寄存器, 因此只能控制访问 1GB 的线性地址空间 当 PDPTEi 寄存器的 P 标志位 (bit 0) 值为 0 时,CPU 就忽略 63:1, 表示该寄存器控制的 1GB 线性地址空间没有对应的映射 ( 即这段线性地址还没有分配相应的物理内存 ), 当访问这段线性地址时, 就会产生页面错误异常 (2) 页面目录表项当 PDPTEi 寄存器的 P 标志位为 1 时, 页面目录表 (Page Directory Table) 的地址在 PDPTEi 寄存器的 51:12( 相当于非 PAE 机制下 CR3 寄存器的值 ) 页面目录表由 512 个 64bit 页面目录项 (Page Directory Entry) 组成 具体目录项 (PDE) 物理地址计算方法 : Bits 51:12 来自 PDPTEi ( 页面目录表的地址 ) Bits 11:3 是线性地址的 bit29:21 ( 页面目录表内偏移 ) Bits 2:0 为 0 (3) 页面表项 PDE( 页面目录项 ) 的 51:12 是页面表的起始物理地址 具体的页面表 (PTE) 物理地址计算方法 : Bits 51:12 来自 PDE( 页面表的起始地址 ) Bits 11:3 是线性地址的 bit20:12 ( 页面表内偏移 ) Bits 2:0 为 0 (4) 最终物理地址的计算方法 Bits 51:12 来自 PTE( 页面的起始地址 ) Bits 11:0 是线性地址的 bit20:12 ( 页面内偏移 ) 图 13 PAE 页面机制时 CR3 寄存器和页面项

15 3 Linux 内核的地址映射过程 Linux 内核要在 IA-32 架构上运行, 就要进行前面介绍的地址映射过程 很多人看地址映射内容, 感觉是云里雾里, 本身内容也比较抽象 现在开始结合 Linux 内核中的源码来分析我们写的普通应用程序的地址映射过程 在概述中, 我们给出了一个小程序, 程序运行后打印临时变量 tmp 的地址为 0xBFF42DEC 也许大家会有个疑问, 这个地址到底是逻辑地址? 线性地址? 物理地址? 事实上, 打印的结果只是逻辑地址, 而不是真正的物理地址 既然打印的结果 0xBFF42DEC 是逻辑地址, 那么我们就可以以此作为开始, 来逐步解析整个地址映射过程 3.1 段式映射过程 段式映射过程实际上就是从逻辑地址到线性地址的映射过程 临时变量 tmp 的逻辑地址为 0xBFF42DEC, 那么在段式映射过程中 ( 见图 6), 它就是 偏移量 (offset) 现在已经知道了偏移量, 但还不知道段选择码 临时变量 tmp 存放在栈 中,IA-32 提供了 SS(Stack Segment) 寄存器, 那就从 SS 寄存器中读取段选择码 内核在建立一个进程时都要将其段寄存器设置好, 有关代码在 include/asm/processor.h ( 注意 : 内核源码版本为 el5) 00531: 00532: #define start_thread(regs, new_eip, new_esp) do { \ 00533: asm ("movl %0,%%fs ; movl %0,%%gs": :"r" (0)); \ 00534: set_fs(user_ds); \ 00535: regs- >xds = USER_DS; \ 00536: regs- >xes = USER_DS; \ 00537: regs- >xss = USER_DS; \ 00538: regs- >xcs = USER_CS; \ 00539: regs- >eip = new_eip; \ 00540: regs- >esp = new_esp; \ 00541: preempt_disable(); \ 00542: load_user_cs_desc(smp_processor_id(), current- >mm); \ 00543: preempt_enable(); \ 00544: } while (0) IA-32 中有 6 个段寄存器 Linux 内核建立一个进程时把 DS ES SS 寄存器的值都设为 USER_DS,CS 寄存器的值设为 USER_CS, 而另外两个段寄存器 FS 和 GS 都设为 0 这样 Linux 中事实上只有只使用了两个段 : 代码段 (CS) 和数据段 (DS) 而且每个进程

16 的 6 个段寄存器值都相同, 只有 EIP 和 ESP 值不同 虽然 Linux 中进程只分两个段 ( 代码段和数据段 ), 但 IA-32 的处理器并不知道操作系统 把程序分为多少个段 接着前面临时变量 tmp 的逻辑地址转换到线性地址过程, 偏移量已经 知道为 0xBFF42DEC, 因为 tmp 在栈中, 那么就要从 SS 寄存器中读取段选择码 而 SS 寄存 器的值为 USER_DS, 其值定义在文件件 include/asm/segment.h 中 00053: 00054: #define GDT_ENTRY_DEFAULT_USER_CS : #define USER_CS (GDT_ENTRY_DEFAULT_USER_CS * 8 + 3) 00056: 00057: #define GDT_ENTRY_DEFAULT_USER_DS : #define USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3) USER_CS(14*8 +3 = 115) 的值展开二进制的结果为 : USER_DS(15*8 + 3 =123) 的值展开二进制的结果为 : 高 13 位为 index, 而第三个 bit 都为 0, 表示仅使用 GDT(Global Descriptor Table), 而 没有使用 LDT(Local Descriptor Table) 事实上,Linux 确实没有使用 LDT LDT 只是在 VM86 模式中运行 wine 以及其他在 Linux 上模拟运行 Windows 软件或 DOS 软件的程序中才使 用 现在确定了偏移量 (offset) 和段选择码中的 index, 也确定了是从 GDT 表中, 以 15(index) 为下标, 找到相应的段描述符 (segment descriptor), 从段描述符中找到段的基址是多少, 段限又是多少? GDT 表在内存中的位置, 是由 GDTR 寄存器保存的 IDT 表中的值是在操作系统启动时 设置好的, 在本文最后的实验内容中再给出如何读 GDTR 的值及段描述符 事实上, 全局描 述表中的表项值在文件 arch/i386/kernel/head.s 中, 先将该文件中的一段代码截取出来 00486: /* 00487: * The Global Descriptor Table contains 28 quadwords, per-cpu : */ 00489:.align L1_CACHE_BYTES 00490: ENTRY(cpu_gdt_table) 00491:.quad 0x /* NULL descriptor */ 00492:.quad 0x /* 0x0b reserved */ 00493:.quad 0x /* 0x13 reserved */ 00494:.quad 0x /* 0x1b reserved */ 00495:.quad 0x /* 0x20 unused */ 00496:.quad 0x /* 0x28 unused */

17 00497:.quad 0x /* 0x33 TLS entry 1 */ 00498:.quad 0x /* 0x3b TLS entry 2 */ 00499:.quad 0x /* 0x43 TLS entry 3 */ 00500:.quad 0x /* 0x4b reserved */ 00501:.quad 0x /* 0x53 reserved */ 00502:.quad 0x /* 0x5b reserved */ 00503: 00504:.quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x */ 00505:.quad 0x00cf ffff /* 0x68 kernel 4GB data at 0x */ 00506:.quad 0x00cffa000000ffff /* 0x73 user 4GB code at 0x */ 00507:.quad 0x00cff ffff /* 0x7b user 4GB data at 0x */ 00508: 00509:.quad 0x /* 0x80 TSS descriptor */ 00510:.quad 0x /* 0x88 LDT descriptor */ 00511: 因为我们得到的 index 为 15( 二进制为 1111), 那么就对应下面一项.quad 0x00cff ffff /* 0x7b user 4GB data at 0x */ 我们再来对照图 7 来确定段的基址和段限 (segment limit) 0~15,48~51bits 为 Segment Limit 而段的基址是 16~31,32~39,56~63bits 组成 所以段限的值为 0xfffff, 而段的基址值为 0(16~31,32~39,56~63bits 全为 0) 而 G 为都是 1, 段长为 4KB, 而上限为 0xfffff, 这样数据段就是从 0 地址开始的整个 4G 虚存空间, 逻辑地址到线性地址的映射保持不变 ( 因为段的基址为 0) 事实上, 代码段也是如此, 大家有兴趣可以自行分析一下 我们终于完成了逻辑地址到线性地址映射的过程, 段式映射结束后, 发现逻辑地址和虚 拟地址是一样的, 没有变化 临时变量 tmp 的逻辑地址为 0xBFF42DEC, 段式映射后的线 性地址也为 0xBFF42DEC 3.2 页式映射过程 页式映射过程就是将线性地址映射到物理地址的过程 临时变量 tmp 的逻辑地址为 0xBFF42DEC, 段式映射后的线性地址也 0xBFF42DEC, 现在将线性地址 0xBFF42DEC 映射到真正的物理地址, 就是放在地址总线上的地址

18 为了使 Linux 能在 32 位和 64 位 CPU 上运行, 就要采用统一的页面地址模型 从 内 核开始, 页面地址模型采用了 4 级页面, 如图 14 所示 图 14 Linux 页式地址模型在第二部分内容中, 我们描述了 IA-32 的页式映射过程 完成线性地址到物理地址的映射过程, 有一个寄存器很重要, 就是 CR3 寄存器 知道 CR3 寄存器的值, 我们就知道该进程的页面目录在内存中的位置, 根据 dir 位段, 找到相应的页面表, 再根据 Table 位段, 就可以找到 tmp 所在页面的起始地址 CR3 寄存器的值是从哪里设置的? 内核在创建进程时, 会分配页面目录, 页面目录的地址就保存在 task_struct 结构中,task_struct 结构中有个 mm_struct 结构类型的指针 mm, mm_struct 结构中有个字段 pgd( 见下面代码 429 行 ) 就是用来保存该进程的 CR3 寄存器的值 下面一段代码来自 kernel/fork.c, 创建进程时, 需要分配一个页面目录 00427: static inline int mm_alloc_pgd(struct mm_struct * mm) 00428: { 00429: mm- >pgd = pgd_alloc(mm); 00430: if (unlikely(! mm- >pgd)) 00431: return - ENOMEM; 00432: return 0; 00433: } 下面一段代码是切换进程时, 地址空间的切换过程 注意 41 行就是加载即将运行进程

19 的页面目录地址到 CR3 寄存器中 下面一段代码摘自 include\asm\mmu_context.h 00025: static inline void switch_mm(struct mm_struct *prev, 00026: struct mm_struct *next, 00027: struct task_struct *tsk) 00028: { 00029: int cpu = smp_processor_id(); 00030: 00031: if (likely(prev!= next)) { 00032: /* stop flush ipis for the previous mm */ 00033: cpu_clear(cpu, prev- >cpu_vm_mask); 00034: #ifdef CONFIG_SMP 00035: per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK; 00036: per_cpu(cpu_tlbstate, cpu).active_mm = next; 00037: #endif 00038: cpu_set(cpu, next- >cpu_vm_mask); 00039: 00040: /* Re-load page tables */ 00041: load_cr3(next- >pgd); 00042: 00043: /* 00044: * load the LDT, if the LDT is different: 00045: */ 00046: if (unlikely(prev- >context.ldt! = next- >context.ldt)) 00047: load_ldt_nolock(&next- >context, cpu); 00048: } 00049: #ifdef CONFIG_SMP 00050: else { 00051: per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK; 00052: BUG_ON(per_cpu(cpu_tlbstate, cpu).active_mm! = next); 00053: 00054: if (! cpu_test_and_set(cpu, next- >cpu_vm_mask)) { 00055: /* We were in lazy tlb mode and leave_mm disabled 00056: * tlb flush IPI delivery. We must reload %cr : */ 00058: load_cr3(next- >pgd); 00059: load_ldt_nolock(&next- >context, cpu); 00060: } 00061: } 00062: #endif 00063: }? end switch_mm? 后面我们会在实验中实际观察和验证地址映射过程 4 Linux 地址映射实验 理论和架构的介绍是枯燥的, 现在我们可以做一些实验, 以更直观验证地址映射过程 要想验证一下这个过程, 需要首先解决两个问题 :

20 (1) 需要知道 GDTR 和 CR3 寄存器的值 ; 验证 x86 段式映射时, 需要知道 Global Descriptor Table 的地址 而该表的地址保存在 GDTR 寄存器中 页式映射时, 需要知道页面目录表和 PDPTE 的物理地址, 这两个地址与控制寄存器 CR3 密切相关 (2) 要能查看所有物理内存的内容 验证地址映射, 必然涉及到物理内存 那么我们要解决如何访问指定物理地址存 储的数据问题 这两点普通用户程序肯定是没法做到的, 就需要内核编程, 然后结合用户编程 这里说明一下, 以下编程环境和实验都在操作系统为 32 位 RHEL5.8, 内核版本为 el5 和 el5PAE 在使用以下代码前, 请确认环境,64 位系统中和其他内核版本 ( 如 系列 ) 会有所差别 4.1 gdtr 和 cr3 寄存器值的获取 在用户空间的程序中, 是无法直接获取 gdtr 和 cr3 寄存器的值, 因为访问这两个寄存器的值需要特权指令 不过我们可以绕道达到获取这两个寄存器的值, 就是在 /proc 文件系统下创建一个文件, 通过该文件来获取用户程序的 cr3 寄存器和 gdtr 寄存器的值 这需要内核编程 读取 cr3 寄存器的值, 可以借助内核 asm/system.h 中提供的 API 来实现 gdtr 寄存器的值, 可以通过 sgdt 指令来读取 示例代码如下 : struct gdtr_struct{ short limit; unsigned long address attribute ((packed)); }; static unsigned int cr0,cr3,cr4; static struct gdtr_struct gdtr; cr0 = read_cr0();

21 cr3 = read_cr3(); cr4 = read_cr4(); asm(" sgdt gdtr"); 代码编译后, 就可以通过命令 insmod 加载模块 可以通过 /proc 文件系统来查看我们感兴趣的寄存器值, 那么在用户程序中就可以方便 的获取当前进程的相关寄存器的值了, 读 /proc/sys_reg 文件即可 4.2 读取物理内存上的数据 前面一节可以获取到 gdtr 和 cr3 两个寄存器的值, 但页面目录 页面表都保存在物理内存中 有些数据在内核空间中, 如 GDT; 但有些在用户空间中, 如 PGD 和 PTE 用户空间是不能访问所有内存空间的, 但内核进程可以访问所有的物理内存 显然, 我们仍可以通过内核编程和用户编程相结合查看所有的内存数据 Linux 用户程序如何访问物理内存, 详细内容看参考 物理内存访问模块编译并加载到内核后, 在通过命令 mknod 在 /dev 目录下建议一个设备文件 #mknod /dev/phy_mem c 85 0 用户程序访问设备 phy_mem, 就可以访问内存上所有数据了 这和用户程序获得一些寄存器值的方式一样 4.3 地址映射过程实验 为了方便验证地址映射, 我们编写一个简单的应用程序 该程序始终不退出 ( 因为一旦退出, 所对应的物理内存就会变化 ), 且可以读取自身进程的 CR3 GDTR 寄存器的值, 代码如下 : #define REGISTERINFO "/proc/sys_reg" #define BUFSIZE 4096

22 static char buf[bufsize]; static unsigned long addr; #define FILE_TO_BUF(filename, fd) do{ \ static int local_n; \ if (fd == - 1 && (fd = open(filename, O_RDONLY)) == - 1) { \ fprintf(stderr, "Open /proc/register file failed! \n"); \ fflush(null); \ _exit(102); \ } \ lseek(fd, 0L, SEEK_SET); \ if ((local_n = read(fd, buf, sizeof buf - 1)) < 0) { \ perror(filename); \ fflush(null); \ _exit(103); \ } \ buf [local_n] = 0; \ }while(0) int main() { unsigned long tmp; tmp = 0x ; static int cr_fd = - 1; asm("movl %ebp, %ebx\n movl %ebx, addr"); printf("\n%%ebp:0x%08lx\n", addr); printf("tmp address:0x%08lx\n", &tmp); FILE_TO_BUF(REGISTERINFO, cr_fd); printf("%s", buf ); } while(1); return 0; 将上面源码编译并执行 执行步骤 : (1) 加载 dram.ko 驱动 ;( 以访问所有物理内存 ) (2) 加载 sys_reg.ko 驱动 ;( 读取系统寄存器 ) (3) 运行./mem_map 程序 (4) 使用 fileview 查看物理内存内容

23 我们得到 gdtr 寄存器的值中地址是 0xC , 至于 gdtr 寄存器的数据格式, 请参照第二部分内容 gdtr 寄存器给出的值, 仍是线性地址 其物理地址是 0x C PAGE_OFFSET, 而 - PAGE_OFFSET 的值是 0xC , 所以 GDT(Global Descriptor Table) 所在内存的物理地址是 0x 段式映射过程 临时变量 tmp 的地址为 0xBFD8E9A0, 这是个逻辑地址, 要将映射为物理地址, 首先是 段式映射 gdtr 寄存器的值已经知道为 0x , 通过 fileview 程序查看该地址处的内容 大家看到 GDT 中 index 为 15 的值确实为.quad 0x00cff ffff /* 0x7b user 4GB data at 0x */ 对照段式映射过程, 段式映射的结果是逻辑地址和线性地址是一样的, 即线性地址也是 0xBFD8E9A0

24 4.3.2 页式映射过程 程序给出临时变量 tmp 的地址是 0xBFD8E9A0, 将其以二进制表示为 ( 高 10bit 中间 10bit 最后 12bit) 也就是 dir( 高 10 位 ) 为 0x2ff, 由于每个数据项为 4 字节, 而 cr3 寄存器的值为 0x35B0F000, 所以该页面表的起始地址 ( 即 Page Directory Entry) 为 0x35B0F000+0x2FF*4= 0x35B0FBFC 我们来看物理地址 0x35B0FBFC 地址中的内容 得到的数据内容为 0x68F64067, 由于页面目录中的每一项都指向一个页面表, 页面表 的起始地址肯定是页面大小的整数倍, 所以页面目录中每个数据项的低 12 位可作它用 见 图 15 所以指向的页面表起始地址为 0x68F P P P PAGE-TABLE BASE ADDRESS AVAIL G 0 A C W U W P S D T LEGEND P = Present (1=yes, 0=no) W = Writable (1 = yes, 0 = no) U = User (1 = yes, 0 = no) A = Accessed (1 = yes, 0 = no) G = Global (1 = yes, 0 = no) PS = Page-Size (0=4KB, 1 = 4MB) PWT = Page Write-Through (1=yes, 0 = no) PCD = Page Cache-Disable (1 = yes, 0 = no) 图 15 页面目录数据项格式内存 0x68F64000 处的是页面表的起始地址, 页面表内的偏移为 b, 即 0x18E, 所以临时变量 tmp 所在的页面起始地址保存在 0x68F x18E*4= 0x68F64638 处, 我们来看看物理地址 0x68F64638 处内存的数据, 该处的数据就是 tmp 变量所在的物理页面起始地址

25 我们可以看到 0x68F64638 处内存的数据为 0x699D7067 图 16 是页面表项数据格式, 低 12bit 是一些属性 因此 tmp 变量所在的物理页面起始地址为 0x699D P P PAGE-FRAME BASE ADDRESS AVAIL G 0 D A C W U W P D T LEGEND P = Present (1=yes, 0=no) W = Writable (1 = yes, 0 = no) U = User (1 = yes, 0 = no) A = Accessed (1 = yes, 0 = no) D = Dirty (1 = yes, 0 = no) G = Global (1 = yes, 0 = no) PWT = Page Write-Through (1=yes, 0 = no) PCD = Page Cache-Disable (1 = yes, 0 = no) 图 16 页面表数据项格式 tmp 变量所在页面偏移量为 b, 即 0x9A0 因此 tmp 变量所对应的物理地址为 :0x699D x9A0 = 0x699D79A0 我们来看一下物理地址 0x699D79A0 存储的数据是什么 通过我们的查看物理内存程序, 看到物理地址 0x699D79A0 存储的数据确实为 0x 终于找到程序中临时变量 tmp 在物理内存上的位置了, 即 tmp address:0xbfd8e9a0 对应的物理地址为 0x699D79A0 为此我们完整地验证了非 PAE 机制下地址映射的全过程

26 4.4 PAE 机制下地址映射过程实验 在前面一节, 我们的实验是验证最简单地址映射过程 但没有打开 PAE 时,32 位 Linux 内核只能使用 4G 物理内存 打开 PAE 机制后, 最大可以使用 64G 物理内存,PAE 机制下的地址映射稍有不同 本小节我们来验证 PAE 机制下地址映射过程 下图是在 PAE 机制下, 运行结果 段式映射过程 临时变量 tmp 的地址为 0xBF820B90, 这是个逻辑地址, 要将映射为物理地址, 首先是 段式映射 gdtr 寄存器的值已经知道为 0x , 通过 fileview 程序查看该地址处的内容 大家看到 GDT 中 index 为 15 的值确实为.quad 0x00cff ffff /* 0x7b user 4GB data at 0x */ 对照段式映射过程, 段式映射的结果是逻辑地址和线性地址是一样的, 即线性地址也是 0xBF820B90

27 4.4.2 页式映射过程 程序给出临时变量 tmp 的地址是 0xBF820B90, 将其以二进制表示为 ( 高 2bit 中间 9bit 中间 9bit 最后 12bit) 高 2bit 用来选择 PDPTEi 寄存器,PDPTEi 寄存器的内容是存放在内存中的 共有 4 个 PDPTE 寄存器, 组成 PDPTE 表, 物理起始地址在 CR3 寄存器中 CR3 寄存器值为 0x021C PDPTEi 寄存器的值 因此 PDPTE2 的值为 0x AED 页面目录表的起始地址 PDPTE2 的值为 0x AED001, 因此页面目录表的起始物理物理为 0x35AED 页面表的地址 0x35AED b*8 = 0x35AEDFE0, 即页面表的物理地址存放在 0x35AEDFE0 地址处 页面表项的物理地址为 0x6716B000

28 4. 页面表项值页面表项的值就是 tmp 变量所在物理页面的起始地址 我们来看一下页面表项的值 0x6716B b*8 = 0x6716B100 该物理地址处的内容为 0x C9EC 物理页面地址和 tmp 变量物理地址计算 tmp 变量所在物理页面起始地址为 0x7C9EC000 因此 tmp 变量所在物理地址为 : 0x7C9EC b = 0x7C9ECB90 我们来验证一下物理地址 0x7C9ECB90 存放的数据是什么 物理地址 0x7C9ECB90 存放的数据确实是 0x , 和我们代码中赋值一致 至此, 我们完整地验证了 32 位系统中 PAE 机制下的地址映射过程 5 常见问题及解答 1 每个用户现在进行地址转换的的时候, 查询的那个页目录表和页表, 是存在内核空间还是用户空间? 这些表是所有用户进程共享的, 还是独立的? 答 : 页面目录表和页表都是存放在物理内存中的, 在内核空间才能访问, 不在用户空间 用户进程的页面表是独立的

29 2 页面表的映射关系, 是在装载器 loader 文件到内存的时候动态分配的吗? 答 : 页面表是进程创建时, 内核就会分配相应的页面表 当进程访问物理内存时, 内 核填充相应的页面表项 3 页面映射关系表只有用户线程才有吧, 内核线程也有这个表吗, 还是直接 -pageoffset 就算出来了? 答 : 不管是内核还是用户态, 都要必须遵守 CPU 架构的地址映射模型 内核进程寻址也是完整地进行了段页式地址转换的, 不过最终转换的结果刚好就是 -page_offset 附实验源码下载地址 : /files/memory_address_mapping.tar.bz2

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11 .. 软件综合实验之操作系统 进入保护模式 陈香兰 中国科学技术大学计算机学院 July 1, 2016 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 1 / 11 提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 2 / 11 实验准备 实验环境准备

More information

1 CPU interrupt INT trap CPU exception

1 CPU interrupt INT trap CPU exception 1 CPU interrupt INT trap CPU exception 2 X86 CPU gate 64 16 1 2 5 8 16 16 P DPL 00101 TSS 101 DPL P 1 64 16 1 2 1 1 3 3 5 16 16 16 P DPL 0 D 000 16 110 111 100 D 1=32 0=16 DPL P 1 INT DPL1>=CPL>=DPL CPU

More information

Linux kernel exploit研究和探索

Linux kernel exploit研究和探索 Linux kernel exploit DOC alert7 PPT e4gle 2002-12-2 1 2002-12-2 2 Linux kernel exploit kernel exploit exploit exploit exploit (Kernel Buffer Overflow) (Kernel

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

<4D F736F F F696E74202D DB5DAB6FECAAEB6FEBDB22DCEA2D0CDBCC6CBE3BBFACFC8BDF8BCBCCAF5CAB5C0FDA3A8D2BBA3A92E >

<4D F736F F F696E74202D DB5DAB6FECAAEB6FEBDB22DCEA2D0CDBCC6CBE3BBFACFC8BDF8BCBCCAF5CAB5C0FDA3A8D2BBA3A92E > 第二十二讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 实模式回顾 二 虚拟存储机制 三 保护模式 四 64 位模式 五 多线程技术 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 15 章 80x86/Pentium 保护模式原理与结构 1 主要内容 一 实模式回顾 二 虚拟存储机制 三 保护模式 四 64 位模式 五 多线程技术 2 回顾 : 三种工作模式之间的转换

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt MINIX ( 730000) ( 730000) MINIX MINIX2.0 MINIX : MINIX TP3 1 MINIX UNIX Tanenbaum UNIX MINIX LINUX MINIX MINIX MINIX1.0 UNIX V7 MINIX2.0[3] POSIX MINIX3 MINIX Gabriel A. Wainer 1994-1995 [5] 1998 I/O 2002

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

36 asm ("mov %%fs,%%ax":"=a" ( res):); \ 37 res;}) 38 // 以下定义了一些函数原型 39 void page_exception(void); // 页异常 实际是 page_fault(mm/page.s,14) void divi

36 asm (mov %%fs,%%ax:=a ( res):); \ 37 res;}) 38 // 以下定义了一些函数原型 39 void page_exception(void); // 页异常 实际是 page_fault(mm/page.s,14) void divi 程序 8-2 linux/kernel/traps.c 1 /* 2 * linux/kernel/traps.c 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 7 /* 8 * 'Traps.c' handles hardware traps and faults after we have saved some 9 * state in 'asm.s'. Currently

More information

Microsoft Word - 观察Linux内核.doc

Microsoft Word - 观察Linux内核.doc 观察 Linux 内核 BG6RDF 随着 Linux 系统的发展, 越来越多的应用系统被移植到 Linux 系统中来 对 Linux 系统运行状态进行监控并进行优化的需求日益突出, 为此我们需要深入到内核中去了解 Linux 的运转情况 下面我们就从观察 i386 平台的 Linux 内核开始 一. 问题既然要观察 Linux 内核, 就必须能够访问 Linux 内核空间, 但是我们知道一般的用户进程是无法访问内核空间的,

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

浙江大学本科论文模板

浙江大学本科论文模板 本 科 生 毕 业 设 计 报 告 项 目 名 称 微 型 操 作 系 统 的 设 计 与 实 现 姓 名 与 学 号 曲 国 铖 3063027053 指 导 老 师 王 新 宇 专 业 计 算 机 科 学 与 技 术 学 院 计 算 机 学 院 A Dissertation Submitted to Zhejiang University for the Degree of Bachelor of

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

Microsoft PowerPoint - os_4.ppt

Microsoft PowerPoint - os_4.ppt 行 程 資 科 系 林 偉 川 行 程 概 念 行 程 與 程 式 主 要 的 不 同 點 : 程 式 是 被 放 在 外 部 的 儲 存 裝 置 如 磁 碟 上, 而 行 程 則 被 放 在 記 憶 體 中 程 式 在 儲 存 裝 置 中 是 靜 態 的, 而 行 程 在 記 憶 體 中 是 動 態 的, 它 會 隨 著 一 些 事 件 的 發 生 而 產 生 相 對 的 改 變 行 程, 就 是

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

Microsoft Word - AN3259C

Microsoft Word - AN3259C www.maxim-ic.com.cn 应用笔记 3259 DS31256 Envoy - 寄存器转储列程 概述本应用笔记提供了将 DS31256 的寄存器 排队程序 描述符和 FIFO RAM 的内容转储到一个文件的程序代码 这些数据在 DS31256 无法正常工作时非常关键, 为进一步的研究和调试提供了重要信息 例如, 寄存器数据经过转储后可以显示每个 DS31256 寄存器的设置 为了保证正确地设置器件,

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de

程序 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #de 程序 14-24 linux/include/linux/math_emu.h 1 /* 2 * linux/include/linux/math_emu.h 3 * 4 * (C) 1991 Linus Torvalds 5 */ 6 #ifndef _LINUX_MATH_EMU_H 7 #define _LINUX_MATH_EMU_H 8 9 #include

More information

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched.

Kernel Kernel Kernel Kernel load estimator runqueue kernel/sched. Linux Kernel 2.6 20321131 Kernel 2.4...3 Kernel 2.4...3 Kernel 2.4...3 Kernel 2.6...3...3 1....3 2....4 3. load estimator...4 4....4 5....4...4 1....4 2. runqueue kernel/sched.c...4 3. task_struct(include/linux/sched.h)...6...9

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

《计算机应用基础》学习材料(讲义)

《计算机应用基础》学习材料(讲义) 计 算 机 应 用 基 础 学 习 材 料 ( 讲 义 ) Fundamentals of Computer Application 2014-3-22 JIANGSU OPEN UNIVERSITY 第 二 学 习 周 计 算 机 基 础 知 识 ( 一 ) 导 学 在 本 学 习 周, 我 们 主 要 的 任 务 是 认 识 计 算 机 你 将 知 道 计 算 机 是 什 么 时 候 产 生 的,

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

ROP_bamboofox.key

ROP_bamboofox.key ROP Return Oriented Programming Lays @ BambooFox Who Am I Lays / L4ys / 累死 - l4ys.tw Reverse Engineering BambooFox / HITCON Outline Buffer Overflow ret2libc / ret2text Return Oriented Programming Payload

More information

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx 第五讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 4 章寻址方式与指令系统 1 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 2 指令的组成 指令由操作码和操作数两部分组成 操作码操作数 MOV AX, 8726H ADD AX,

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

untitled

untitled 1 DBF (READDBF.C)... 1 2 (filetest.c)...2 3 (mousetes.c)...3 4 (painttes.c)...5 5 (dirtest.c)...9 6 (list.c)...9 1 dbf (readdbf.c) /* dbf */ #include int rf,k,reclen,addr,*p1; long brec,erec,i,j,recnum,*p2;

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

提纲 1 2 OS Examples for 3

提纲 1 2 OS Examples for 3 第 4 章 Threads2( 线程 2) 中国科学技术大学计算机学院 October 28, 2009 提纲 1 2 OS Examples for 3 Outline 1 2 OS Examples for 3 Windows XP Threads I An Windows XP application runs as a seperate process, and each process may

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E ===================== 吾爱破解论坛 [LCG] [LSG] 立足软件安全和病毒分析最前端, 丰富的技术版块交相辉映, 由无数加密解密及反病毒爱好者共同维护, 留给世界一抹值得百年回眸的惊 艳, 沉淀百年来计算机应用之精华与优雅, 信息线条与生活质感淡定交融, 任岁月流转, 低调而奢华的技术交流与研究却是亘古不变 标题 : 一个感染样本的简单分析 作者 :ximo 今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单,

More information

How to Debug Tuxedo Server printf( Input data is: %s, inputstr); fprintf(stdout, Input data is %s, inputstr); fprintf(stderr, Input data is %s, inputstr); printf( Return data is: %s, outputstr); tpreturn(tpsuccess,

More information

bingdian001.com

bingdian001.com TSM12M TSM12 STM8L152C6, STM8L152R8 MSP430F5325 whym1987@126.com! /******************************************************************************* * : TSM12.c * : * : 2013/10/21 * : TSM12, STM8L f(sysclk)

More information

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO

W. Richard Stevens UNIX Sockets API echo Sockets TCP OOB IO C struct C/C++ UNIX fork() select(2)/poll(2)/epoll(4) IO IO CPU 100% libevent UNIX CPU IO Linux muduo C++ (giantchen@gmail.com) 2012-09-30 C++ TCP C++ x86-64 Linux TCP one loop per thread Linux native muduo C++ IT 5 C++ muduo 2 C++ C++ Primer 4 W. Richard Stevens UNIX Sockets API echo Sockets

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def

static struct file_operations gpio_ctl_fops={ ioctl: gpio_ctl_ioctl, open : gpio_open, release: gpio_release, ; #defineled1_on() (GPBDAT &= ~0x1) #def Kaise s 2410 Board setting [1]. Device Driver Device Driver Linux s Kernel ARM s kernel s3c2410_kernel2.4.18_r1.1_change.tar.bz2 /usr/src (1) #cd /usr/src (2) #tar xfj s3c2410_kernel2.4.18_r1.1_change.tar.bz2

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

an153f

an153f 153 2016 1 Linduino Michael Jones (PSM) LTpowerPlay (BMC) PSM PSM PMBus PMBus SMBus SMBus I2C PSM BMC Linduino (API) PSM Linduino PSM BMC BMC Robust PMBus System Software for the LTC3880) I 2 C / SMBus

More information

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 -> 目录 1 大概思路... 1 2 创建 WebAPI... 1 3 创建 CrossMainController 并编写... 1 4 Nuget 安装 microsoft.aspnet.webapi.cors... 4 5 跨域设置路由... 4 6 编写 Jquery EasyUI 界面... 5 7 运行效果... 7 8 总结... 7 1 1 大概思路 创建 WebAPI 创建 CrossMainController

More information

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony

Ioncube Php Encoder 8 3 Crack 4. llamaba octobre traslado General Search colony Ioncube Php Encoder 8 3 Crack 4 ->>->>->> DOWNLOAD 1 / 5 2 / 5 Press..the..General..Tools..category4Encrypt..and..protect..files..with..PHP..encoding,..encryption,..ob fuscation..and..licensing... 2016

More information

Microsoft Word - 201110.doc

Microsoft Word - 201110.doc 2011 年 10 月 信 徒 交 通 月 刊 目 錄 一 本 期 目 錄 編 輯 室 1 二 牧 者 的 話 教 會 轉 化 -- 得 到 更 新 皮 袋 衣 立 凡 2 三 講 章 精 華 清 潔 的 心 思 -- 除 去 論 斷 講 員 衣 立 凡 / 賴 美 如 整 理 4 清 潔 的 心 思 -- 除 去 情 慾 講 員 葉 志 偉 / 林 慶 如 整 理 9 四 精 選 文 章 等 候

More information

目录

目录 ALTERA_CPLD... 3 11SY_03091... 3 12SY_03091...4....5 21 5 22...8 23..10 24..12 25..13..17 3 1EPM7128SLC.......17 3 2EPM7032SLC.......18 33HT46R47......19..20 41..20 42. 43..26..27 5151DEMO I/O...27 52A/D89C51...28

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

《嵌入式系统设计》教学大纲

《嵌入式系统设计》教学大纲 多 核 架 构 及 编 程 技 术 教 学 大 纲 课 程 代 码 :20062022071 课 程 负 责 人 : 杨 剑 锋 课 程 中 文 名 称 : 多 核 架 构 及 编 程 技 术 课 程 英 文 名 称 :Multi-Core Architecture and Programming Technologies 课 程 类 别 : 专 业 必 修 课 程 学 分 数 :3 课 程 学 时

More information

untitled

untitled 1 5 IBM Intel 1. IBM 第 1/175 页 第 2/175 页 第 3/175 页 80 第 4/175 页 2. IBM 第 5/175 页 3. (1) 第 6/175 页 第 7/175 页 第 8/175 页 = = 第 9/175 页 = = = = = 第 10/175 页 = = = = = = = = 3. (2) 第 11/175 页 第 12/175 页 第 13/175

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

2 12

2 12 SHENZHEN BRILLIANT CRYSTAL TECHNOLOGIC CO.,LTD. The specification for the following models Graphic LCM serial communication control board CB001 PROPOSED BY APPROVED Design Approved TEL:+86-755-29995238

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.07.doc 2 5 8 11 0 1. 13 2. 15 3. 18 1 1. 22 2. 25 3. 27 2 1. 35 2. 38 3. 41 4. 43 5. 48 6. 50 3 1. 56 2. 59 3. 63 4. 65 5. 69 13 22 35 56 6. 74 7. 82 8. 84 9. 87 10. 97 11. 102 12. 107 13. 111 4 114 1. 114 2.

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

A Preliminary Implementation of Linux Kernel Virus and Process Hiding

A Preliminary Implementation of Linux Kernel Virus and Process Hiding 邵 俊 儒 翁 健 吉 妍 年 月 日 学 号 学 号 学 号 摘 要 结 合 课 堂 知 识 我 们 设 计 了 一 个 内 核 病 毒 该 病 毒 同 时 具 有 木 马 的 自 动 性 的 隐 蔽 性 和 蠕 虫 的 感 染 能 力 该 病 毒 获 得 权 限 后 会 自 动 将 自 身 加 入 内 核 模 块 中 劫 持 的 系 统 调 用 并 通 过 简 单 的 方 法 实 现 自 身 的

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

ARM JTAG实时仿真器安装使用指南

ARM JTAG实时仿真器安装使用指南 ARM JTAG Version 1.31 2003. 11. 12 ARM JTAG ARM JTAG.3 ARM 2.1.4 2.2.4 ARM JTAG 3.1 18 3.2 18 3.2.1 Multi-ICE Server.18 3.2.2 ADS..21 ARM JTAG 4.1 Multi-ICE Server 33 4.1.1 Multi-ICE Server..... 33 4.1.2

More information

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 C C trio@seu.edu.cn C C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 Week3 C Week5 Week5 Memory & Pointer

More information

Microsoft PowerPoint - 3章例题.ppt

Microsoft PowerPoint - 3章例题.ppt 例 设有一个采用地址直接映像方式的 Cache, 其存储容量为 8KB, 要求在每个存储块内存放 16B( 字节 ) 主存的存储容量是 512KB, 求 : 1) 该 Cache 地址机构是如何组成和具体分配的? 2) 主存的地址机构是如何组成和具体分配的? 3) 主存第 513 信息块存放在主存内的区号为多少? 将其调入 Cache 后被存放的对应信息块号为多少? 4) 在上一步 3) 的基础上,CPU

More information

IA-32 Processor Architecture

IA-32 Processor Architecture Assembly Language Course Ref. Irvine, Assembly Language For INTEL-based Computers, 5e, Pearson. 三個基本操作模式 保護模式 (Protected Mode) 實體位址模式 (Real-address Mode) 系統管理模式 (System Management Mode; SMM) 預設模式 所有指令與功能皆可使用

More information

RAID RAID 0 RAID 1 RAID 5 RAID * ( -1)* ( /2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( )

RAID RAID 0 RAID 1 RAID 5 RAID * ( -1)* ( /2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( ) RAID RAID 0 RAID 1 RAID 5 RAID 10 2 2 3 4 * (-1)* (/2)* No Yes Yes Yes A. B. BIOS SATA C. RAID BIOS RAID ( ) D. SATA RAID/AHCI ( ) SATA M.2 SSD ( ) ( ) ( ) Windows USB 1 SATA A. SATASATAIntel SATA (SATA3

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS

C H A P T E R 7 Windows Vista Windows Vista Windows Vista FAT16 FAT32 NTFS NTFS New Technology File System NTFS C H P T E R 7 Windows Vista Windows Vista Windows VistaFT16 FT32NTFS NTFSNew Technology File System NTFS 247 6 7-1 Windows VistaTransactional NTFS TxFTxF Windows Vista MicrosoftTxF CIDatomicity - Consistency

More information

ebook15-C

ebook15-C C 1 1.1 l s ( 1 ) - i i 4. 14 - d $ l s -ldi /etc/. /etc/.. - i i 3077 drwxr-sr-x 7 bin 2048 Aug 5 20:12 /etc/./ 2 drwxr-xr-x 13 root 512 Aug 5 20:11 /etc/../ $ls -ldi /. /..... i 2 2 drwxr-xr-x 13 root

More information

Microsoft Word - 实用案例.doc

Microsoft Word - 实用案例.doc 计 算 机 系 统 应 用 2009 年 第 12 期 嵌 入 式 Linux 下 温 湿 度 传 感 器 的 设 计 与 实 现 1 Design and Implementation of Temperature and Humidity Sensor Based on Embedded Linux 陈 博 刘 锦 高 ( 华 东 师 范 大 学 电 子 科 学 技 术 系 上 海 200241)

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

概述

概述 OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3

More information

第一章 概论

第一章  概论 1 2 3 4 5 6 7 8 Linux 7.1 7.1.1 1 1 2 3 2 3 1 2 3 3 1 2 3 7.1.2 1 2 1 2 3 4 5 7.1.3 1 1 2 3 2 7.1 3 7.1.4 1 1 PCB 2 3 2 PCB PCB PCB PCB PCB 4 1 2 PSW 3 CPU CPU 4 PCB PCB CPU PCB PCB PCB PCB PCB PCB PCB

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

数据库系统概论

数据库系统概论 所谓寻址方式, 就是指令中用于说明操 作数所在地或者所在地地址的方法 8088/8086 的寻址方式分为两类 : 关于寻找数据的寻址方式 关于寻找转移地址的寻址方式 下面讲关于数据的寻址方式时, 均以数 据传送指令 MOV 为例讲解 MOV 指令格式如下 : MOV DST, SRC 助记符 目的操作数 指令完成的功能 : (DST) 源操作数 (SRC) 一. 关于寻找数据的寻址方式 ( 共 8

More information

一 汇编语言计算机基础 从事计算机科学方面的工作, 汇编语言是我们必不可少缺的基础 我们的工作平台 研究对象都是机器, 而汇编语言是人和计算机沟通的最直接方式, 它描述了机器最终所要执行的指令序列 学习汇编语言可以让你充分获得底层编程的体验, 深刻理解机器运行程序的机理 二 基础知识 1. 汇编语言

一 汇编语言计算机基础 从事计算机科学方面的工作, 汇编语言是我们必不可少缺的基础 我们的工作平台 研究对象都是机器, 而汇编语言是人和计算机沟通的最直接方式, 它描述了机器最终所要执行的指令序列 学习汇编语言可以让你充分获得底层编程的体验, 深刻理解机器运行程序的机理 二 基础知识 1. 汇编语言 ABeen 汇编语言 学习摘要 ABeen 学习记录 --- 汇编语言篇 QQ: 155235900 1 / 8 一 汇编语言计算机基础 从事计算机科学方面的工作, 汇编语言是我们必不可少缺的基础 我们的工作平台 研究对象都是机器, 而汇编语言是人和计算机沟通的最直接方式, 它描述了机器最终所要执行的指令序列 学习汇编语言可以让你充分获得底层编程的体验, 深刻理解机器运行程序的机理 二 基础知识 1.

More information

Abstract arm linux tool-chain root NET-Start! 2

Abstract arm linux tool-chain root NET-Start! 2 Lab III - Embedding Linux 1 Abstract arm linux tool-chain root NET-Start! 2 Part 1.4 Step1. tool-chain 4 Step2. PATH 4 Part 2 kernel 5 Step1. 5 Step2... 6 Step3...8 Part 3 root. 8 Step1. 8 Step2. 8 Part

More information

Microsoft Word - MAN2011A_CH_RTT.doc

Microsoft Word - MAN2011A_CH_RTT.doc 基于 SAM7X EK 和 IAR EWARM 文档编号 文档版本 Rev. A 文档摘要 基于 AT91SAM7X EK 开发板的代码解读,RTT 代码解读 关键词 AT91SAM7X256 SAM7X EK IAR EWARM J LINK RTT 创建日期 2010 06 08 创建人员 Cust126 审核人员 Robin 文档类型 公开发布 / 开发板配套文件 版权信息 Mcuzone 原创文档,

More information

DVK530/531扩展板

DVK530/531扩展板 DVK720 扩展板 驱动移植手册 2014.04.03 V1.0 版权声明 本手册所有权由深圳市微雪电子有限公司独家持有 未经本公司的书 面许可, 不得以任何方式或形式进行修改 分发或复制本文档的任何 部分, 否则一切后果由违者自负 版本更新记录 版本日期说明 V1.0 2014.04.03 初始发布 深圳市微雪电子有限公司 www.waveshare.net I 目录 版权声明... I 版本更新记录...

More information

ebook

ebook 3 3 3.1 3.1.1 ( ) 90 3 1966 B e r n s t e i n P ( i ) R ( i ) W ( i P ( i P ( j ) 1) R( i) W( j)=φ 2) W( i) R( j)=φ 3) W( i) W( j)=φ 3.1.2 ( p r o c e s s ) 91 Wi n d o w s Process Control Bl o c k P C

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc

Microsoft Word - 在VMWare-5.5+RedHat-9下建立本机QTopia-2.1.1虚拟平台a.doc 在 VMWare-5.5+RedHat-9 下建立 本机 QTopia-2.1.1 虚拟平台 张大海 2008-5-9 一 资源下载 1. 需要以下安装包 : tmake-1.13.tar.gz qtopia-free-source-2.1.1.tar.gz qt-embedded-2.3.10-free.tar.gz qt-x11-2.3.2.tar.gz qt-x11-free-3.3.4.tar.gz

More information

格式化字符串 Weifeng Sun School of Software, DLUT

格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串 Weifeng Sun School of Software, DLUT 格式化字符串漏洞 格式化字符串, 也是一种比较常见的漏洞类型 会触发该漏洞的函数很有限 主要就是 printf 还有 sprintf,fprintf 等等 c 库中 print 家族的函数 >int printf(const char* format,...) 2 / 42 3 / 42 A B 字符串指针 char

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

L10 Virtual Memory

L10 Virtual Memory Lecture 5: Virtual Memory II 简单分区 (Partitioning) 主存分配 : 操作系统 : 固定 用户区 : 分区 简单分区方案 : 使用长度不等的固定长分区 (fixed-size partition) 当一个进程调入主存时, 分配给它一个能容纳它的最小的分区 对于需 96K 的进程可分配 256K 的分区 简单分区方式的缺点 : 因为是固定长度的分区, 故可能会浪费主存空间

More information

觀 音 佛 祖 送 給 衣 宸 的 話 005 自 序 007 Part 1 修 行 心 體 驗 一 篇 看 見 佛 祖 012 二 篇 在 家 修 行 039 三 篇 世 界 的 創 造 者 054 四 篇 大 慈 悲 079 五 篇 最 珍 貴 的 禮 物 095 六 篇 自 救 法 力 練 習

觀 音 佛 祖 送 給 衣 宸 的 話 005 自 序 007 Part 1 修 行 心 體 驗 一 篇 看 見 佛 祖 012 二 篇 在 家 修 行 039 三 篇 世 界 的 創 造 者 054 四 篇 大 慈 悲 079 五 篇 最 珍 貴 的 禮 物 095 六 篇 自 救 法 力 練 習 觀 音 佛 祖 送 給 衣 宸 的 話 005 自 序 007 Part 1 修 行 心 體 驗 一 篇 看 見 佛 祖 012 二 篇 在 家 修 行 039 三 篇 世 界 的 創 造 者 054 四 篇 大 慈 悲 079 五 篇 最 珍 貴 的 禮 物 095 六 篇 自 救 法 力 練 習 110 七 篇 以 至 善 心 創 作 133 八 篇 智 慧 善 法 151 九 篇 我 的 修

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 1 2 1 2 3 4 5 6 7 8 9 10 3 1 150 2 150 1 1 1.1 1.1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.4 1.4.1 CPU 1.4.2 I/O 1.4.3 I/O 1.5 1.5.1 CISC RISC 1.5.2 1.5.3 1.6 1.6.1 1.6.2 N 1.6.3 2 2.1 2.1.1 2.1.2 2.1.3

More information

untitled

untitled www.mcudriver.cn 1.1 / 1) WinAVR20070525 2) Source Insight 3) ISP 4) PonyProg ISP 5) USB 6) 1.2. MCU ATMEGA16 1.3. AVR8 1.4 LED0~LED7 1 1.5 #include // Program 1.1 LED.C #define uchar unsigned

More information

Microsoft Word - MSP430 Launchpad 指导书.docx

Microsoft Word - MSP430 Launchpad 指导书.docx Contents 3... 9... 14 MSP430 LAUNCHPAD 指导书 3 第一部分第一个工程 New Project File > New > CCS Project Project name: ButtonLED Device>Family: MSP430 Variant: MSP430G2553 Project templates and examples : Empty Project

More information

Microsoft Word - Introduction to Big Real Mode _CHT_.doc

Microsoft Word - Introduction to Big Real Mode _CHT_.doc Merck Hung , 洪豪謙 應朋友的要求, 希望我花一點時間整理一下 x86 Big Real Mode 的文章. 另外也發現, 身邊似乎有一些朋友也準備要開始從事 BIOS 方面之工作了. 感謝你們偶而會來逛一下我的 Blog. 雖然網路上已經有蠻多資料了, 不過今天我打算從 Intel 64 and IA32 Architecture Software

More information

第 7 章 下 一 代 网 际 协 议 IPv6 141 足 的 措 施 只 能 是 权 宜 之 计 (3) 路 由 表 膨 胀 早 期 IPv4 的 地 址 结 构 也 造 成 了 路 由 表 的 容 量 过 大 IPv4 地 址 早 期 为 网 络 号 + 主 机 号 结 构, 后 来 引 入

第 7 章 下 一 代 网 际 协 议 IPv6 141 足 的 措 施 只 能 是 权 宜 之 计 (3) 路 由 表 膨 胀 早 期 IPv4 的 地 址 结 构 也 造 成 了 路 由 表 的 容 量 过 大 IPv4 地 址 早 期 为 网 络 号 + 主 机 号 结 构, 后 来 引 入 第 7 章 下 一 代 网 际 协 议 IPv6 本 章 是 有 关 下 一 代 网 际 协 议 IPv6 的 描 述, 重 点 介 绍 IPv6 的 产 生 原 因 IPv6 的 地 址 与 IPv6 首 部 格 式 等 通 过 本 章 的 学 习, 读 者 应 重 点 掌 握 和 理 解 以 下 内 容 : IPv4 向 IPv6 发 展 的 必 然 性 IPv6 的 新 特 性 IPv6 地

More information

2 = ( O C) =? C 112 + 120 100% = 18. 08% 1051 + 232 p ( 1 p) / n 100% 0. 1808( 1 0. 1808) / 1283 100% = 1. 07% 328 + 294 100% = 17. 9% 3469 0. 179( 1 0179. ) / 3469 = 0. 65% { m-sn m-w w-sn sn3 w m

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

Windows 2000 Server for T100

Windows 2000 Server for T100 2 1 Windows 95/98 Windows 2000 3.5 Windows NT Server 4.0 2 Windows DOS 3.5 T200 2002 RAID RAID RAID 5.1 Windows 2000 Server T200 2002 Windows 2000 Server Windows 2000 Server Windows 2000 Server 3.5 for

More information

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p

NOWOER.OM m/n m/=n m/n m%=n m%n m%=n m%n m/=n 4. enum string x1, x2, x3=10, x4, x5, x; 函数外部问 x 等于什么? 随机值 5. unsigned char *p1; unsigned long *p NOWOER.OM /++ 程师能 评估. 单项选择题 1. 下 描述正确的是 int *p1 = new int[10]; int *p2 = new int[10](); p1 和 p2 申请的空间 的值都是随机值 p1 和 p2 申请的空间 的值都已经初始化 p1 申请的空间 的值是随机值,p2 申请的空间 的值已经初始化 p1 申请的空间 的值已经初始化,p2 申请的空间 的值是随机值 2.

More information

ebook 132-6

ebook 132-6 6 SQL Server Windows NT Windows 2000 6.1 Enterprise Manager SQL Server Enterprise Manager( ) (Microsoft Management C o n s o l e M M C ) Enterprise Manager SQL Server Enterprise Manager 6.1.1 Enterprise

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information