1 / 12

作业参考答案

作业参考答案. 嵌入式操作系统. 1 ,为什么三级分页机制中页面大小为 8k ,而不是象二级分页机制中的 4k 页面大小?. 三级分页机制主要是用于 64 位处理器的内存管理和寻址操作。虽然三级分页机制中只使用了虚拟地址中的低 43 位,但操作系统仍然使用了 64 位的虚拟地址。因此,保存一个虚拟地址需要 64 位即 8 个字节。如果仍然保持各种页表(包括页目录表,页中表和页表)中的表项数目为 1024 ,那么一个页表就需要占用 8k 字节。因此使用 8k 大小的页面可以保持一个页表刚好保存在一个页面中,有利于页表管理,也可减小系统其它方面开销。.

Download Presentation

作业参考答案

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 作业参考答案 嵌入式操作系统

  2. 1,为什么三级分页机制中页面大小为8k,而不是象二级分页机制中的4k页面大小?1,为什么三级分页机制中页面大小为8k,而不是象二级分页机制中的4k页面大小? 三级分页机制主要是用于64位处理器的内存管理和寻址操作。虽然三级分页机制中只使用了虚拟地址中的低43位,但操作系统仍然使用了64位的虚拟地址。因此,保存一个虚拟地址需要64位即8个字节。如果仍然保持各种页表(包括页目录表,页中表和页表)中的表项数目为1024,那么一个页表就需要占用8k字节。因此使用8k大小的页面可以保持一个页表刚好保存在一个页面中,有利于页表管理,也可减小系统其它方面开销。

  3. 2,页表pg0的初始化是如何实现的? 页表的初始化分2个阶段进行。页表pg0的初始化在第一个阶段,此时系统尚运行于实模式下,即系统尚未启动分页机制,仍然使用物理地址进行存储器寻址。 对于32位系统,第一个页目录表和页表是在内核编译阶段和内核刚刚启动且尚未启动分页机制前创建的。pg0是针对第一个4M字节空间的页表。 这些初始化过程的代码主要是汇编代码。以i386体系结构为例,初始化过程在如下汇编源代码中: arch/i386/kernel/head.S

  4. /* * This is initialized to create an identity-mapping at 0-8M (for bootup * purposes) and another mapping of the 0-8M area at virtual address * PAGE_OFFSET. */ .org 0x1000 ENTRY(swapper_pg_dir) .long 0x00102007 .long 0x00103007 .fill BOOT_USER_PGD_PTRS-2,4,0 /* default: 766 entries */ .long 0x00102007 .long 0x00103007 /* default: 254 entries */ .fill BOOT_KERNEL_PGD_PTRS-2,4,0 /* * The page tables are initialized to only 8MB here - the final page * tables are set up later depending on memory size. */ .org 0x2000 ENTRY(pg0) .org 0x3000 ENTRY(pg1) swapper_pg_dir是一个临时的页目录表,它被放在内存起始地址4k的地方。它的4个表项分别被初始化成页表pg0和pg1的地址: 表项0和766指向页表pg0 表项1和767指向页表pg1 其它表项均为0 (4k) (8k) 页表pg0被放在内存起始地址8k的地方,但尚未初始化。 (12k)

  5. /* * Initialize page tables */ movl $pg0-__PAGE_OFFSET, %edi /* initialize page tables */ movl $007,%eax /* "007" doesn't mean with right to kill, but PRESENT+RW+USER */ 2: stosl add $0x1000,%eax cmp $empty_zero_page-__PAGE_OFFSET, %edi jne 2b /* * Enable paging */ 3: movl $swapper_pg_dir-__PAGE_OFFSET,%eax movl %eax, %cr3 /* set the page table pointer.. */ movl %cr0, %eax orl $0x80000000, %eax movl %eax, %cr0 /* ..and set paging (PG) bit */ ... 初始化页表pg0。pg0中的每个表项都指向内核空间的一个页面。pg0可用来寻址内核空间的第一个4M空间。 只有页目录表swapper_pg_dir和页表pg0初始化完成后,才可启动分页机制。

  6. 3,编译并运行如下程序,对结果进行说明。 4,多次运行这个程序,对运行结果进行说明。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(void) { pid_t pid; pid = fork(); if(pid == 0) { printf("Hello from the child process!\n"); } else if(pid != -1) { printf("Hello from the parent. I have forked process %d.\n", pid); } else { printf("There was an error with forking.\n"); } }

  7. 这个程序使用了fork()系统调用。 运行结果是if分支语句的两种条件下的打印语句都得到了运行,即pid=0和pid为正数的条件表面上都得到了满足。从程序语言角度看,这是不可能的。 实际情况是,当fork()系统调用执行成功后,原来的进程已经创建了一个新的子进程。对于这个例子,两个进程执行同样的代码,并使用同样的输入输出文件。但对于父进程和子进程,fork()系统调用的返回值是不一样的。在父进程中, fork()返回子进程的pid值;而在子进程中, fork()返回值为0。我们看到的输出结果实际上分别来自两个进程,即父进程和子进程。因为两个进程仍然使用同样的输出文件,因此我们看到在同一个输出端得到两个进程的输出。 通常情况下新创建的子进程首先得到运行时间,但有时因为调度的原因,父进程首先得到运行,因此输出结果的先后顺序可能不同。

  8. 5,运行如下命令后可建立一个基于文件的ext2文件系统。5,运行如下命令后可建立一个基于文件的ext2文件系统。 $ dd if=/dev/zero of=myfile bs=1K count=4K $ $ mke2fs myfile -b 4096 -m 0 -L mylable -F 使用tune2fs命令,我们可以得到关于这个文件系统的如下信息: tune2fs 1.32 (09-Nov-2002) Filesystem volume name: mylable ... Inode count: 1024 Block count: 1024 ... Free blocks: 983 Free inodes: 1013 First block: 0 Block size: 4096 Fragment size: 4096 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 1024 Inode blocks per group: 32 ... First inode: 11 Inode size: 128 文件系统的卷标为 mylable 文件系统上的索引节点总数为 1024 块总数为 1024 文件系统上当前的空闲块为 983 空闲索引节点为 1013 第一个块为 0 号的块 文件系统上的块大小为 4096 字节 碎片大小为 4096 字节 每个块组可容纳的块数目:32k 每个块组可容纳的碎片数目:32k 一个块组中的索引节点数为 1024 块组中索引节点占用的块数为 32 第一个可用的索引节点的节点号为 11 索引节点大小为 128 字节

  9. 从前面的数据中我们得到,在这个文件系统上:从前面的数据中我们得到,在这个文件系统上: • 总共有1024个块 • 目前还有983个可用的空闲块 • 总共有1024个索引节点,但目前只有1013个可用的索引节点 • 当前已被使用的数据块共有1024-983=41块,它们分别是: • 超级块:1块 • 块组描述符表:1块 • 块位图:1块 • 索引节点位图:1块 • 索引节点表:32块 • 根目录:1块 • lost_found目录:4块

  10. 使用od命令直接读取myfile文件的内容 $ od -x -a myfile ... 0002000 0400 00000400 0000 0000 0000 03d7 0000 ... 总索引节点数,总块数,0x00000400 = 1024 • 第一个4k的块的结构如下: • 第一个1k的空间用于引导块,因为我们这个例子中的文件系统不是引导系统,所以引导块的内容为空。 • 第二个1k的空间用作超级块,记录了文件系统的一些基本参数。 • 剩余的2k空间为空。 接下来,块组描述附表占用一个4k的块。(内容不多,略)

  11. 随后的两个4k的块分别用于块位图和索引节点位图。随后的两个4k的块分别用于块位图和索引节点位图。 已被使用的块 ... 0020000 ffffffff 01ff 0000 0000 0000 0000 0000 0020020 0000 0000 0000 0000 0000 0000 0000 0000 0020040 0000 0000 0000 0000 0000 0000 0000 0000 0020060 0000 0000 0000 0000 0000 0000 0000 0000 0020100 0000 0000 0000 0000 0000 0000 0000 0000 0020120 0000 0000 0000 0000 0000 0000 0000 0000 0020140 0000 0000 0000 0000 0000 0000 0000 0000 0020160 0000 0000 0000 0000 0000 0000 0000 0000 0020200 ffff ffff ffff ffff ffff ffff ffff ffff ... ... 0030000 07ff 0000 0000 0000 0000 0000 0000 0000 0030020 0000 0000 0000 0000 0000 0000 0000 0000 0030040 0000 0000 0000 0000 0000 0000 0000 0000 0030060 0000 0000 0000 0000 0000 0000 0000 0000 0030100 0000 0000 0000 0000 0000 0000 0000 0000 0030120 0000 0000 0000 0000 0000 0000 0000 0000 0030140 0000 0000 0000 0000 0000 0000 0000 0000 0030160 0000 0000 0000 0000 0000 0000 0000 0000 0030200 ffff ffff ffff ffff ffff ffff ffff ffff ... 空闲的块 已被使用的索引节点 可用的索引节点

  12. 随后是32个4k的块用于保存索引节点表。其中,11个索引节点已被使用。随后是32个4k的块用于保存索引节点表。其中,11个索引节点已被使用。 (注:11个索引节点用于记录哪些内容尚未仔细分析) 索引节点表之后的第一个数据块是根目录。之后的4个数据块被lost+found 目录使用。 ... 0440000 0002 0000 000c 0201 002e 0000 0002 0000 stx nul nul nul ff nul soh stx . nul nul nul stx nul nul nul 0440020 000c 0202 2e2e 0000 000b 0000 0fe8 020a ff nul stx stx . . nul nul vt nul nul nul h si nl stx 0440040 6f6c 7473 662b 756f 646e 0000 0000 0000 l o s t + f o u n d nul nul nul nul nul nul ... 由于整个文件系统只有4M字节大小,所以只有一个块组。

More Related