http://blog.sina.com.cn/cnlas[订阅]
个人资料
分类
    内容读取中…
评论
读取中...
访客
读取中...
好友
读取中...
博文
果然还是过了2月没更新了。。。囧rz。。。
这篇也是刚好学校论坛上有人在讨论grub然后写的。。。就放这里算备份一下吧。。。-ω-
 
声明:以下内容部分整理部分我扯。。。出了问题我不负责。。。=v=b CNLAS 07.08.18
 
以下所说的过程和代码以grub0.97版为例。。。grub2和1的启动过程有点区别。。。后面再说。。。给出的路径大部分是指源代码包的
 
1、BIOS启动sc80t说了。。。但是注意一点BIOS是参与内存编址的。。。所以不存在读入物理内存这个概念
 
2、BIOS将0头0道1扇区也就是MBR读入内存地址0x7c00处。。。然后检查0x7dfe是否等于0xaa55(WORD)确认是有效MBR后开始执行
 
3、Grub安装好后0头0道1扇区就是stage1(/stage1/stage1.s)。。。其实stage1的任务非常的单纯。。。去读取0头0道2扇区然后闪人。。。XD
0头0道2扇区的内容就是源代码里\stage2\start.s编译后也是一个512字节。。。stage1将start.s读入内存地址0x8000然后跳过去执行
 
4、start.s就是stage1.5 or stage2的入口。。。一般情况下stage2还是放在需
 RT。。。总是写写停停。。。
唉。。。最近研究perl shell sed和awk有点心得。。。过两天写点东西。。。
过两天。。。没准就过俩月了。。。囧。。。=v=b
 
 
四月就接了这一个片子。。。结果让我崩溃啊。。。= =
先是第一放映的和歌山电视台画质堪比老化了的VHS录像带。。。音质堪比卡壳外加搅带了的磁带机。。。= =
然后是监督开始秀外语。。。日英法德意。。。这是动画还是外语教学啊。。。口胡~~~
 大家是一边翻一边骂啊。。。不过nana的op和田村姐的ed都很不错。。。
继续期待ed的CD。。。

另外D-TVS的片源还行。。。不过动态画面有点虚=v=b。。。就是出的太晚了。。。也很难找。。。囧。。。


让我们一同高呼和歌山电视台万岁。。。魔炮少女抒情菜叶强袭攻万岁。。。1s

下面这张图。。。很赞的。。。
http://static16.photo.sina.com.cn/orignal/4c1810e0df5abde8d0e2f
还是跳了(2007-04-28 15:20)
到了最后的最后。。。桃华还是跳了。。。。
动画倒着放。。。如果游戏还是倒着玩的会让人崩溃的。。。= =
http://static2.photo.sina.com.cn/orignal/4c1810e0e0d2d02816681

到底要不要订一套豪华。。。。目前还在考虑中。。。= =
311分。。。全北京顺位633。。。
虽然离期望值差了点。。。但是还行吧。。。= =b
 
本来预期的计划中该准备准备Jtest的。。。
但是要学的东西太多了。。。能抽出来时间再说吧。。。= =
 
虽说X沟挤挤总会有的。。。但是太过分了会变形的。。。=v=b

标题:Grub中实现实模式和保护模式切换部分的代码分析
作者:CNLAS
说明:都是些个人愚见。。。出错勿怪。。。还请各位大牛指出。。。= =
/*  */中为原文件的注释
/*= =*/中为我加的注释
源文件位于\stage2\asm.S 版本为grub-0.97
提示:对win32asm爱好者一点小提示,grub的asm部分编译是由gcc中的gas来完成的。。。gas采用的asm是延续UNIX的AT&T格式。。。不太了解的同学可以先google学习一下。。。XD


/*
  These next two routines, 'real_to_prot' and 'prot_to_real' are structured
  in a very specific way.  Be very careful when changing them.
 *
  NOTE:  Use of either one messes up %eax and %ebp.
 */
ENTRY(real_to_prot)
 .code16
/*=在Grub这个保护模式过程中。。。只加载了GDT。。。没有设定IDT。。。所以这个保护模式要在关闭可屏蔽中断的情况下运行=*/
 cli
 /* load the GDT register */
/*=向gdtr寄存器中写入GDT=注1=*/
 DATA32 ADDR32 lgdt g

转自linuxsir.org
作者:mrbanana

[转]系统启动——Grub篇(一)

6  GRUB Kernel模块分析
由于我分析的是GRUB2的源代码,从GRUB2开始,从Start模块载入的是Grub的整个kernel。从官方的说明可以看到,与Grub相比,最大的差异在于GRUB2将Stage1.5以及Stage2的功能归并为GRUB2的kernel,并提高了压缩性能;编译生成的kernel──core.img只有24KB左右,即使对于最普遍的CHS读写模式所支持的0面0道的64个扇区(折合32K左右)而言,空间是足够放置GRUB2的kernel的,Grub的每个Stage1.5都至少在11K左右,而stage2则为110K左右。

6.1 Asm.s 文件分析
在分析了Start模块以后,发现如果没有设置Stage1_5参数,那么系统已经把Grub kernel从磁盘完全装载到了起始地址为0x8200开始的内存中。于是我便在源代码中寻找起始地址从0x8200开始执行的代码。发现Asm.s文件就是这样一个符合条件的模块。
首先在这个文件的开始,仍然定义了这样一个宏:
#ifdef STAGE1_5
# define ABS(x) ((x) - EXT_C(mai

转自linuxsir.org
作者:mrbanana
 
GRUB整体分析
总体上我们可以把GRUB看成一个微型的操作系统,他有Shell,支持Script,有文件系统……我们可以把Stage1和Stage1.5看成一个引导程序,而Stage2则是一个操作系统,只不过这个操作系统是专门用来引导其他操作系统的操作系统,为此,Stage2支持像kernel,initrd,chainloader等等为此目的而设置的内部“命令”。
3.1  GRUB引导操作系统的两种方式
3.1.1 直接引导方式
GRUB同时支持 Linux, FreeBSD, NetBSD 和OpenBSD。如果想要启动其他的操作系统,你必须使用链式启动方式来启动他们[6]。

通常,GRUB直接引导操作系统的步骤如下:

(1) 通过'root'指令来设置GRUB的主设备指向操作系统映像文件所存储的地方。

(2) 通过'kernel'命令来载入该操作系统的核心映像。

(3) 如果需要模块,通过'module'命令来加载模块。

(4) 运行命令'boot'。

Linux, FreeBSD, NetBSD 和 OpenBSD使用相同的方式启动。你可以通过'kernel'命令来装载核心映像,然后运行'boot'命令。如果核心需要一些参数的话,只要
这是一段对windows启动代码的中文分析

说明:硬盘主引导记录独立于操作系统,但又和操作系统息息相关――很多时候它又是由
; 操作系统所提供的工具所生成(例外的情况是您使用了其他的分区工具,不过它又运行在
; 什么操作系统中呢?;()。
;
; 如果您安装了Windows 98(我现在暂时不能接触95下的主引导记录,总不能用95重装我的
; 系统吧?)操作系统,那您机器上的主引导记录已经与以前的大有不同了,通过下面的分析
; 您一定能对Windows 98为什么要更改主引导记录有所了解――它已经开始支持扩展Int13h
; 了!并且这个主引导记录的编程技巧更是我们应该学习的。
;
; 主引导记录包括代码、数据两部分。它在被BIOS中断Int19h装入内存后获得控制权。数据
; 部分最重要的当然是分区表了!彻底熟悉主引导记录,可以帮助我们了解系统的引导过程,
; 处理因主引导记录损坏所造成的无法引导故障,消除引导型计算机病毒,更使我们能通过
; 修改主引导记录完成我们希望的工作:如多重引导,系统加软锁等.
在asm.yeah.net上找到的关于参数传递和栈结构的文章。。。整个过程解释的非常清楚。。。

 

Parameter Passing and Stack Frames

In this article, I hope to show how parameters are passed to function in assembly language, as well as how they are addressed from inside the function. I will also describe stack frames, local stack variables, and how to use them. Finally, I will show how all this info is useless, as your assembler can do it for you all automatically :)

Parameter Passing Conventions

A parameter passing convention defines how arguments are passed to a function. In the Win32 API, two different conventions are used: stdcall and C. Stdcall is used for every API function, except for wsprintf, which uses the C calling convention.

Sdtcall calling convention

In the sdtcall convention, function arguments are passed from right to left. From an assembly language standpoint, this means that the parameters are pushed onto the stack in