獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五.

Slides:



Advertisements
Similar presentations
第 13 章 基于 proc 的 Linux 进程控制块 信息读取 山东科技大学操作系统教研组. 理解 proc 伪文件系统的基本概念和功能,掌握常见操作命令。 了解 Linux 进程控制块 task_strcut ,并理解其重要成员变量的含义。 理解基于 seq_file 机制的 proc 伪文件操作机制.
Advertisements

烘焙丙級麵包產品 數位學習 紅豆餡甜麵包 高雄應用科技大學 觀光管理系觀光與餐旅管理碩士班 林庭榛.
第八章 给产品定价 学习目标: 理解三种定价的基本方法,重点掌握损益平衡法; 掌握定价策略; 了解价格调整。
CHAPTER 9 虛擬記憶體管理 9.2 分頁需求 9.3 寫入時複製 9.4 分頁替換 9.5 欄的配置法則 9.6 輾轉現象
目 錄.
門神 在傳統觀念中,門是居住環境中與外界相通的出入口,具有重要的屏障作用。門神顧名思義就是護宅守門的神仙,每逢過年,上至天子百官下至普通百姓,家家戶戶必在門上張貼門神,以保一家平安。 門神種類主要有宅第大門上將軍武門神、內室門戶上祈福文門神,還有童子門神、仙子門神等,形象豐富多樣,皇家貴戚還往往在畫上瀝粉貼金,十分吉祥喜慶。
中小学校舍建设管理 《地县教育局基建专干培训班》 克拉玛依 2015年11月 校舍建设管理与现存问题对策 1.
第2节 ext2文件系统 索引文件的的代表 索引文件 文件使用三部曲 文件共享 文件保护 举例.
第五课 让挫折丰富我们的人生 挫折面前也从容.
第一章 计算机基础知识 计算机的发展简史 1 计算机软件系统 6 计算机的定义和分类 2 微型计算机的组成 7 计算机的特点和用途 3
第三节 渐开线圆柱齿轮精度等级及应用.
中央广播电视大学开放教育试点课程 计算机操作系统.
如何打造学习型团队 主讲:詹琼然 选送单位:重庆市长寿区妇幼保健院 0903NX《中国医院内训师高级研修班》学员.
你喝的水健康嗎? 探討飲用水的功效 製作人:孫定達.
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
Chapter 6 時序.
可愛的魚.
UNIX系統與資料庫安裝 Why UNIX 常用的工具程式介紹 資料庫的安裝.
第16章 編譯與升級Kernel系統核心 課前指引
Linux Further.
Linux.
作業系統 第十三章 檔案系統實例.
配置编译内核.
Timer & KEYPAD 11/24.
第3章 ARM体系结构.
5 Computer Organization (計算機組織).
編譯環境介紹.
電腦基本概念 張森 高階 適合程度 初學.
助教:胡光能,解定宝 编译原理讲师:戴新宇
第二章 LINUX存储管理 LINUX的分页管理机制.
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
CH.8 硬體管理.
網路資源的建立--LINUX系統 國立東華大學電算中心 陳鴻彬.
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
What’s wrong? public int listen() { lock.acquire();
操作系统实验 lab1-系统引导
程式設計 博碩文化出版發行.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
Ch9 Communicating with Hardware
如何生成设备节点 广州创龙电子科技有限公司
TinyOS开发环境安装 基于Ubuntu14.04.
Linux核心編譯與模組管理 2013/01/19.
第3章 認識處理元.
组员:吴迪&王柳杨&金虎&陈武荣&谭金柏
Chapter 13 MMAP與DMA.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
Holtek C Compiler V3--advanced
Introduction to C Programming
第9章 虛擬記憶體 (virtual memory)
作業系統 Operating System 第四單元 檔案系統
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
Chapter 7 掌控記憶體.
熟能生巧、每日一练: 五分钟打字练习.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
报告人:曾婷轩 实验物理中心数据获取组 2015年08月19日
第二章 Java语法基础.
Chapter 7 掌控記憶體.
实验一:编译运行Linux内核并使用gdb进行调试
#include <iostream.h>
C 程式設計— 檔案處理 台大資訊工程學系 資訊系統訓練班.
实验二:添加Linux系统调用及熟悉常见系统调用
第十二章 位运算.
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
中国科学技术大学计算机系 陈香兰(0551- ) Spring 2009
第6章 嵌入式软件开发基础.
獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五.
Presentation transcript:

獨孤派作業系統 main memory 中正大學 作業系統實驗室 指導教授:羅習五

負責助教 作業目標: 懶人包: 了解Linux的paging機制 了解x86的paging機制 https://goo.gl/cSD93g https://goo.gl/Fy3cXR 和上一次作業相同

設定核心 make menuconfig 進入kernel hacking,並選擇下面二個選項 再次確認 <*> Export kernel pagetable layout to userspace via debugfs [*] Dump the EFI pagetable 這二個選項預設不會打開,因為打開以後可能會造成系統漏洞 再次確認 > cat .config | grep CONFIG_X86_PTDUMP CONFIG_X86_PTDUMP_CORE=y CONFIG_X86_PTDUMP=y

預備編譯核心的環境 $ sudo apt install git flex bison bc libssl-dev gawk libudev-dev ocl-icd-opencl-dev libpci-dev libelf- dev python2.7 libncurses-dev fakeroot kernel-wedge binfmt-support ksh lsscsi binfmt-support libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libsepol1-dev libattr1-dev libblkid-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev uuid-dev debugedit libarchive13 libdw1 liblua5.2-0 liblzo2-2 libnspr4 libnss3 librpm8 librpmbuild8 librpmio8 librpmsign8 rpm rpm-common rpm2cpio spl-dkms kernel-package

編譯核心 sudo update-alternatives --config gcc /*如果編譯kernel 4.0,請選擇gcc 4.8*/ make -j8 /*-j8代表產生8個task讓系統平行化編譯核心*/ /*一般來說,4核心就選8或16編譯的整體速度較快*/ /*如果使用QEMU,下面三個步驟不用做*/ make modules sudo make modules_install sudo make install

核心記憶體 如果是kernel 4.0請使用 右方的指令 pgd是512GB的映射 pud是1GB的映射 pmd是2MB的映射 cat /sys/kernel/debug/kernel_page_tables ---[ User Space ]--- 0x0000000000000000-0xffff800000000000 16777088T pgd ---[ Kernel Space ]--- 0xffff800000000000-0xffff880000000000 8T pgd ---[ Low Kernel Mapping ]--- 0xffff880000000000-0xffff880000099000 612K RW GLB NX pte 0xffff880000099000-0xffff88000009a000 4K ro GLB NX pte 0xffff88000009a000-0xffff88000009b000 4K ro GLB x pte 0xffff88000009b000-0xffff880000200000 1428K RW GLB NX pte 0xffff880000200000-0xffff880001000000 14M RW PSE GLB NX pmd 0xffff880001000000-0xffff880001c00000 12M ro PSE GLB NX pmd 0xffff880001c00000-0xffff880001d12000 1096K ro GLB NX pte 0xffff880001d12000-0xffff880001e00000 952K RW GLB NX pte 0xffff880001e00000-0xffff880002000000 2M ro PSE GLB NX pmd 0xffff880002000000-0xffff8800021d2000 1864K ro GLB NX pte 0xffff8800021d2000-0xffff880002600000 4280K RW GLB NX pte 0xffff880002600000-0xffff88000fc00000 214M RW PSE GLB NX pmd 0xffff88000fc00000-0xffff88000ffe0000 3968K RW GLB NX pte 0xffff88000ffe0000-0xffff880010000000 128K pte 0xffff880010000000-0xffff880040000000 768M pmd 0xffff880040000000-0xffff888000000000 511G pud 0xffff888000000000-0xffffc90000000000 66048G pgd /*後面有些被截斷*/ 核心記憶體 如果是kernel 4.0請使用 右方的指令 pgd是512GB的映射 pud是1GB的映射 pmd是2MB的映射 pte是4KB的映射

核心記憶體 如果是kernel 4.19請使 用右方的指令 pud是1GB的映射 pmd是2MB的映射 pte是4KB的映射 cat /sys/kernel/debug/page_tables/kernel ---[ User Space ]--- 0x0000000000000000-0xffff800000000000 16777088T pgd ---[ Kernel Space ]--- 0xffff800000000000-0xffff880000000000 8T pgd ---[ Low Kernel Mapping ]--- 0xffff880000000000-0xffff880000099000 612K RW GLB NX pte 0xffff880000099000-0xffff88000009a000 4K ro GLB NX pte 0xffff88000009a000-0xffff88000009b000 4K ro GLB x pte 0xffff88000009b000-0xffff880000200000 1428K RW GLB NX pte 0xffff880000200000-0xffff880001000000 14M RW PSE GLB NX pmd 0xffff880001000000-0xffff880001c00000 12M ro PSE GLB NX pmd 0xffff880001c00000-0xffff880001d12000 1096K ro GLB NX pte 0xffff880001d12000-0xffff880001e00000 952K RW GLB NX pte 0xffff880001e00000-0xffff880002000000 2M ro PSE GLB NX pmd 0xffff880002000000-0xffff8800021d2000 1864K ro GLB NX pte 0xffff8800021d2000-0xffff880002600000 4280K RW GLB NX pte 0xffff880002600000-0xffff88000fc00000 214M RW PSE GLB NX pmd 0xffff88000fc00000-0xffff88000ffe0000 3968K RW GLB NX pte 0xffff88000ffe0000-0xffff880010000000 128K pte 0xffff880010000000-0xffff880040000000 768M pmd 0xffff880040000000-0xffff888000000000 511G pud 0xffff888000000000-0xffffc90000000000 66048G pgd /*後面有些被截斷*/ 核心記憶體 如果是kernel 4.19請使 用右方的指令 pud是1GB的映射 pmd是2MB的映射 pte是4KB的映射

paging with multiple page size: x86-Linux,pte page pgd_offset, 9 bits pud_offset, 9 bits pmd_offset, 9 bits pte_offset, 9 bits offset, 12 bits 4k data page cr3 task_struct->mm->pgd

paging with multiple page size: x86-Linux,pmd page pgd_offset, 9 bits pud_offset, 9 bits pmd_offset, 9 bits offset, 12+9 = 21 bits 2M data page cr3 task_struct->mm->pgd

paging with multiple page size: x86-Linux,pud page pgd_offset, 9 bits pud_offset, 9 bits offset, 12+9+9 = 30 bits 1GB data page cr3 task_struct->mm->pgd

paging with multiple page size: x86-Linux ,pgd page (軟體上存在,硬體上沒有) pgd_offset, 9 bits offset, 12+9+9+9 = 39 bits 512 GB data page cr3 task_struct->mm->pgd

Linux如何印出kernel page table 程式碼在 /arch/x86/mm/dump_pagetables.c 以下投影片全部都用kernel 4.10舉例 4.19的程式碼註解比較清楚 但4.10是我們可以直接拿來用QEMU除錯的核心,因此用4.10舉例

dump_pagetables.c的初始化 /arch/x86/mm/dump_pagetables.c static int __init pt_dump_init(void) { //PAGE_OFFSET就是核心的開始位址,注意是virtual address     address_markers[LOW_KERNEL_NR].start_address = PAGE_OFFSET;     address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;     address_markers[VMEMMAP_START_NR].start_address = VMEMMAP_START; } //告訴核心,使用pt_dump_init這個函數初始化這個「功能模組」 __initcall(pt_dump_init);

註冊檔案操作 /arch/x86/mm/debug_pagetables.c static const struct file_operations ptdump_fops = {     .owner      = THIS_MODULE,     .open       = ptdump_open, /*當有人要打開這個檔案,就呼叫ptdump_open*/     .read       = seq_read, /*當要read*/     .llseek     = seq_lseek, /*當要lseek*/     .release    = single_release, /*不需要這個檔案時,例如:close*/ /*沒有.write,表示這個檔案不支援寫入*/ }; static int __init pt_dump_debug_init(void){ /*告訴核心當有人要打開kernel_page_tables這個檔案時應該呼叫哪些函數,函數定義在ptdump_fops*/ pe = debugfs_create_file("kernel_page_tables", S_IRUSR, NULL, NULL,                  &ptdump_fops); } module_init(pt_dump_debug_init);

(gdb) b ptdump_show (QEMU) $ cat /sys/kernel/debug/kernel_page_tables

附錄:記憶體位址轉換 //for kernel mapping only phys_addr = virt_to_phys(virt_addr); virt_addr = phys_to_virt(phys_addr); bus_addr = virt_to_bus(virt_addr); virt_addr = bus_to_virt(bus_addr); #define virt_to_bus virt_to_phys #define bus_to_virt phys_to_virt void *phys_to_virt(phys_addr_t address) { return __va(address); } #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) phys_addr_t virt_to_phys(volatile void *address) { return __pa(address);} #define __pa(x) __phys_addr((unsigned long)(x))

cr2 = read_cr2(); cr3 = read_cr3(); https://elixir.bootlin.com/linux/v4.0/source/arch/x86/mm/dump_pagetables.c

control registers https://en.wikipedia.org/wiki/Control_register 我們只用到CR2與CR3

與MMU相關的暫存器 - CR2與CR3

4KB page

2MB page

1GB page

CR3 & PTE

format of 4KB page table entry

關於x86-64的paging機制 更詳細的資料請參考Intel技術手 冊 Volume 3, Chapter 4.5 https://goo.gl/4w8qxr 閱讀文件時,請注意一下日期, 如右圖紅色的標示

Default fault handlers do_anonymous_page: no page and no file do_linear_fault: vm_ops registered? do_swap_page: page backed by swap do_nonlinear_fault: page backed by file do_wp_page: write protected page (CoW)