`
suoyihen
  • 浏览: 1356161 次
文章分类
社区版块
存档分类
最新评论

Linux0.11内核--启动代码分析setup.s 建立页目录和页表

 
阅读更多

head.s开始

pg_dir

....

....

....

....

.org 0x1000

pg0:

.org 0x2000

pg1:

.org 0x3000

pg2:

.org 0x4000

pg3:

.org 0x5000

后面是setup_paging代码

其中:

movl $pg0+7,pg_dir /* set present bit/user r/w */

movl $pg1+7,pg_dir+4 /* --------- " " --------- */

movl $pg2+7,pg_dir+8 /* --------- " " --------- */

movl $pg3+7,pg_dir+12 /* --------- " " --------- */

设置页目录表中的项

由于pg0的地址在0x1000位置,则$pg0+7表示的是0x00001007

第 1 个页表的属性标志 = 0x00001007 & 0x00000fff = 0x007,表示该页存在、用户可读写。(由于每个页大小为4K,用12 bit位表

示)

然后

movl $pg3+4092,%edi

movl $0xfff007,%eax /* 16Mb - 4096 + 7 (r/w user,p) */

std

1: stosl /* fill pages backwards - more efficient :-) */

subl $0x1000,%eax

jge 1b

填写4个也表的内容

由于每个页表有1024项*4个页表=4096项,4096*4K=16M,正好完全覆盖地址空间。

Linus是从后向前设置页表,最后一个页表的最后一项对应的地址为16M-4096,即0xFFF000,然后加上属性标志0x007,得0xFFF007

每写一项地址减0x1000,也就是减去4K,正好对应一个页。

这程序循环0xFFF+1次

最后:

设置页目录基址寄存器 cr3 的值,指向页目录表

设置启动使用分页处理(cr0 的 PG 标志,位 31)

使用ret指令,将main函数地址从栈中弹出至CS,跳转到main去执行。

分享到:
评论

相关推荐

    linux内核阅读心得

    读核感悟-Linux内核启动-setup辅助程序........................................6 读核感悟-Linux内核启动-内核解压缩...........................................8 读核感悟-Linux内核启动-开启页面映射............

    Linux内核阅读

    读核感悟-Linux内核启动-内核的生成...........................................2 读核感悟-Linux内核启动-从hello world说起...................................3 读核感悟-Linux内核启动-BIOS.....................

    代码页表代码代码页表代码代码页表代码代码页表代码代码页表代码代码页表代码

    代码页表代码代码页表代码代码页表代码代码页表代码

    操作系统实验4-请求分页存储管理模拟实验.doc

    操作系统实验4-请求分页存储管理模拟实验.doc

    《Rootkits--Windows内核的安全防护》.(Hoglund).[PDF]&ckook;

    3.3.5 页表项 3.3.6 重要表的只读访问 3.3.7 多个进程使用多个页目录 3.3.8 进程和线程 3.4 内存描述符表 3.4.1 令局描述符表 3.4.2 本地描述符表 3.4.3 代码段 3.4.4 调用门 3.5 中断描述符表 3.6 系统服务调度表 ...

    Linux编程--Linux内核

    Linux内核 ...第11章 Linux内核源代码 117 11.1 怎样得到Linux内核源码 117 11.2 内核源码的编排 117 11.3 从何处看起 118 第12章 Linux数据结构 120 附录A 有用的Web和FTP站点 138 附录B 词汇表 139

    Linux2.6内核标准教程(共计8-- 第1个)

    1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 12 第2章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1...

    深入分析Linux内核源码

    深入分析Linux内核源码 前言 第一章 走进linux 1.1 GNU与Linux的成长 1.2 Linux的开发模式和运作机制 1.3走进Linux内核 1.3.1 Linux内核的特征 1.3.2 Linux内核版本的变化 1.4 分析Linux内核的意义 ...

    ARM_Linux启动分析.pdf

    在“arch/i386/boot” 目录下,bootsect.S是生成引导扇区的汇编源码,它首先将自己拷贝到0x90000上,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核代码拷贝到0x100000。以上这些拷贝动作都是以...

    Linux2.6内核标准教程(共计8--第7个)

    1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 12 第2章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1...

    OS-6-7-操作系统.doc

    单选题6-1. LRU置换算法所基于的思想是( D )。... 首次适应和最佳适应 B. 固定分区和可变分区 C.首次适应和固定分区 D.最佳适应和可变分区 在请求分页管理中,已修改过的页面再次装入时应来自( B )。 磁盘文

    Linux 内存管理导读-三级页表-伙伴系统

    Linux 内存管理导读-三级页表-伙伴系统

    Linux2.6内核标准教程(共计8--第8个)

    1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 12 第2章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1...

    Linux2.6内核标准教程(共计8--第6个)

    1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 12 第2章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1...

    Linux2.6内核标准教程(共计8--第3个)

    1.3.2 Linux 2.6内核源代码目录树简介 5 1.3.3 Linux 2.6内核的新特性 8 1.4 如何阅读本书 9 1.4.1 内核探索工具 10 1.4.2 推荐阅读方法 12 第2章 引导过程分析 14 2.1 内核镜像的构建过程 15 2.1.1...

    页表的代码 页表的代码

    页表代码页表代码页表代码页表代码代码页表代码

    操作系统-实验报告-存储管理实验.doc

    为此,在为作业建立页表时,应说明哪些页" "已在主存,哪些页尚未装入主存,页表的格式为: " " " "页号 " "标志 " "主存块号 " "在磁盘上的位置 " " " " " " " " " " " " " " " "其中,标志——用来表示对应页是否...

    ARM-LINUX内存页表的建立

    linux操作系统内核技术-uestc课件

     6中断处理程序被分解为top half和bottom half的原因,介绍linux的softirq,tasklet,ksoftirqd和work queue,分析进程与top half,bottom half的竞争情形和同步。(4小时)  7掌握内核同步原理和方法:原子操作,...

    ARM Linux启动分析

    整个arm linux内核的启动可分为三个阶段:第一阶段主要是进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和外部...

Global site tag (gtag.js) - Google Analytics