📄 1127.html
字号:
#define PARAM_LFB_COLORS 0x26<br>
#define PARAM_VESAPM_SEG 0x2e<br>
#define PARAM_VESAPM_OFF 0x30<br>
#define PARAM_LFB_PAGES 0x32<br>
*/<br>
video()<br>
{<br>
FS = DS;<br>
DS = ES = CS;<br>
GS = 0;<br>
basic_detect();<br>
<br>
#ifdef CONFIG_VIDEO_SELECT<br>
if (FS:[0x1FA]!=ASK_VGA) {<br>
// ASK_VGA=0xFFFD, defined in asm-i386/boot.h<br>
mode_set();<br>
if (failed) {<br>
prtstr("You passed an undefined mode number.");<br>
}<br>
}<br>
else {<br>
mode_menu();<br>
}<br>
<br>
#ifdef CONFIG_VIDEO_RETAIN<br>
restore_screen();<br>
#endif<br>
<br>
#endif<br>
<br>
mode_params();<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
SIG1 = 0xAA55<br>
SIG2 = 0x5A5A<br>
{<br>
setup_sig1: .word SIG1<br>
setup_sig2: .word SIG2<br>
modelist:<br>
<br>
.text<br>
endtext:<br>
<br>
.data<br>
enddata:<br>
<br>
.bss<br>
endbss:<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// end of file<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
WSS(http://www.whitecell.org)<br>
一个非营利性民间技术组织<br>
致力于各种系统安全技术的研究<br>
坚持传统的hacker精神<br>
追求技术的精纯<br>
<br>
编辑 发贴时间2002/08/25 06:23pm 此 IP 为代理服务器IP: 已设置保密<br>
该用户目前不在线 e4gle <br>
帅哥 此人为版主<br>
头衔: 论坛版主 午马 天秤座<br>
<br>
<br>
<br>
级别: 精灵<br>
魅力: 2286<br>
经验: 1824<br>
金钱: 5165 幽妮石<br>
来自: WSS <br>
总发贴数: 232 篇<br>
注册日期: 2002/08/14<br>
消息 查看 搜索 好友 邮件 主页 复制 引用 回复贴子回复 <br>
<br>
[这个贴子最后由e4gle在 2002/08/25 06:30pm 编辑]<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// bootsect.txt<br>
////////////////////////////////////////////////////////////////////<br>
// Copyright(C) 2001, Feiyun Wang<br>
// analysis on linux/arch/i386/boot/bootsect.S (linux 2.2.17)<br>
////////////////////////////////////////////////////////////////////<br>
<br>
////////////////////////////////////////////////////////////////////<br>
#if 0<br>
int 3;// for debugger<br>
#endif<br>
<br>
_main()<br>
BOOTSEG = 0x07C0<br>
INITSEG = 0x9000<br>
{<br>
move BOOTSEG:0 to INITSEG:0 (512 bytes);<br>
goto INITSEG:go; // CS:IP = INITSEG:go<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// prepare disk parameter table<br>
go()<br>
INITSEG = 0x9000<br>
{<br>
set SS:SP to INITSEG:3FF4;// 0x4000-0x0C<br>
copy disk parameter table (pointer in 0:0078)<br>
to INITSEG:3FF4 (12 bytes);<br>
patch sector count to 36 (offset 4 in parameter table, 1 byte);<br>
set disk parameter table pointer (0:0078) to INITSEG:3FF4;<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// load the setup-sectors directly after the bootblock<br>
load_setup()<br>
setup_sects = SETUPSECS = 4<br>
INITSEG = 0x9000<br>
{<br>
for(;;) {<br>
int13h/AH=0(DL=0); // reset FDC<br>
try {<br>
// http://www.ctyme.com/intr/rb-0607.htm<br>
int13h/AH=02h(AL=setup_sects,<br>
ES:BX=INITSEG:0200,<br>
CX=2, DX=0);<br>
break;<br>
}<br>
catch (disk error) {<br>
print_nl();<br>
print_hex(SP);<br>
}<br>
}<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// get disk drive parameters, specifically sectors#/track<br>
ok_load_setup()<br>
global variables: disksizes, sectors<br>
{<br>
#if 0<br>
// get disk drive parameters<br>
// http://www.ctyme.com/intr/rb-0621.htm<br>
int13h/AH=08h(DL=0);<br>
CH = 0;<br>
// seems not completed yet<br>
#else<br>
// probe sectors with disksize[] = {36, 18, 15, 9}<br>
SI = &disksizes;<br>
for (;;) {<br>
sectors = DS:[SI++];<br>
if (SI>=disksizes+4) break;<br>
try {<br>
int13h/AH=02h(AL=1,<br>
ES:BX=INITSEG:((setup_sects+1)<<9),<br>
CX=sectors, DX=0);<br>
break;<br>
}<br>
catch {<br>
}<br>
}<br>
#endif<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// print out "Loading"<br>
// load the system image<br>
// set root_dev<br>
// jump to the setup-routine loaded directly after the bootblock<br>
got_sectors()<br>
INITSEG = 0x9000<br>
SYSSEG = 0x1000<br>
SETUPSEG = 0x9020<br>
global variable: root_dev<br>
{<br>
// int10h/AH=03h http://www.ctyme.com/intr/rb-0088.htm<br>
// int10h/AH=13h http://www.ctyme.com/intr/rb-0210.htm<br>
print out "Loading";<br>
<br>
read_it(ES=SYSSEG);<br>
kill_motor();<br>
print_nl();<br>
<br>
if (!root_dev) {<br>
switch (sectors) {<br>
case 15: root_dev = 0x0208;// /dev/ps0 - 1.2Mb<br>
break;<br>
case 18: root_dev = 0x021C;// /dev/PS0 - 1.44Mb<br>
break;<br>
case 36: root_dev = 0x0220;// /dev/fd0H2880 - 2.88Mb<br>
break;<br>
default: root_dev = 0x0200;// /dev/fd0 - autodetect<br>
break;<br>
}<br>
}<br>
<br>
goto SETUPSEG:0;<br>
// see linux/arch/i386/boot/setup.S<br>
}<br>
<br>
word sread = 0; // sectors read of current track<br>
word head = 0; // current head<br>
word track = 0; // current track<br>
////////////////////////////////////////////////////////////////////<br>
// load the system image<br>
read_it(ES)<br>
setup_sects = SETUPSECS = 4<br>
SYSSEG = 0x1000<br>
syssize = SYSSIZE = 0x7F00<br>
{<br>
sread = setup_sects + 1; // plus 1 bootsect<br>
if (ES & 0x0fff) halt; // not 64KB aligned<br>
BX = 0;<br>
<br>
for (;;) {<br>
rp_read:<br>
#ifdef __BIG_KERNEL__<br>
.word 0x1eff, 0x220;<br>
// call far * bootsect_kludge, see setup.S<br>
#else<br>
AX = ES - SYSSEG;<br>
#endif<br>
if (AX>syssize) return;<br>
<br>
ok1_read:<br>
// get proper AL (sectors to read),<br>
// not to across tracks or make BX overflow<br>
AX = sectors - sread;<br>
CX = BX + (AX << 9);<br>
// TODO: I think CX!=0 can be omitted<br>
if (CX overflow && CX!=0) {<br>
AX = (-BX) >> 9;<br>
}<br>
ok2_read:<br>
read_track(AL, ES:BX);<br>
CX = AX;<br>
AX += sread;<br>
if (AX==sectors) {<br>
if (head==1) track++;<br>
head = 1 - head;<br>
AX = 0;<br>
}<br>
ok3_read:<br>
sread = AX;<br>
BX += CX << 9;<br>
if (BX overflow) {<br>
ES += 0x1000;<br>
BX = 0;<br>
}<br>
}<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// read disk with (sread, track, head)<br>
read_track(AL, ES:BX)<br>
{<br>
for (;;) {<br>
printf(".");<br>
<br>
// set CX, DX according to (sread, track, head)<br>
DX = track;<br>
CX = sread + 1;<br>
CH = DL;<br>
<br>
DX = head;<br>
DH = DL;<br>
DX &= 0x0100;<br>
<br>
try {<br>
int13h/AH=02h(AL, ES:BX, CX, DX);<br>
return;<br>
}<br>
catch (disk error) {<br>
bad_rt:<br>
print_all();<br>
int13h/AH=0h(DL=0); // reset FDC<br>
}<br>
}<br>
}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// some small functions<br>
print_all() { /* ... print out error, AX, BX, CX, DX */ }<br>
print_nl() { /* ... print CR LF */ }<br>
print_hex() { /* ... print the word pointed by SS:BP in hex */ }<br>
kill_motor() { outportb(0x3F2, 0); /* turn off floppy drive motor */}<br>
<br>
////////////////////////////////////////////////////////////////////<br>
// global variables for bootsect.S<br>
{<br>
sectors:<br>
.word 0<br>
disksizes:<br>
.byte 36, 18, 15, 9<br>
msg1:<br>
.byte 13, 10<br>
.ascii "Loading"<br>
<br>
/*<br>
http://lxr.linux.no/source/Documentation/i386/boot.txt<br>
Offset/Size Proto Name Meaning<br>
01F1/1 ALL setup_sects The size of the setup in sectors<br>
01F2/2 ALL root_flags If set, the root is mounted readonly<br>
01F4/2 ALL syssize DO NOT USE - for bootsect.S use only<br>
01F6/2 ALL swap_dev DO NOT USE - obsolete<br>
01F8/2 ALL ram_size DO NOT USE - for bootsect.S use only<br>
01FA/2 ALL vid_mode Video mode control<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -