12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 339|回复: 0

计算机的开机

[复制链接]

63

主题

63

帖子

136

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
136
发表于 2022-1-28 21:54:12 | 显示全部楼层 |阅读模式
盘算机的开机,说着简朴,但也有很多细节问题,大多数人并不是很清楚
不过,大概顺序就是如许:
BIOS程序运行 -> 查找启动区 -> 跳转到体系 -> ......
按顺序讲解, 只是简朴说说
1. 加载BIOS

起首, 按下开机键之后, 电源进行初始化, 以确保硬件的供电可靠, 准备好后, 主板上的硬件电路会将一些存在于各硬件ROM里的程序加载到RAM, 然后给CPU发复位(reset)信号
CPU在接到复位信号后, 开始执行, 但RAM内什么都没有, 但硬件工程师们肯定知道这种环境, 以是CPU会直接加载BIOS程序, 通常就在0xFFFF0处, 但这个位置只有16字节的空间, 以是常常只有一个JMP指令
也就是
jmp far f000:e05b ; 跳转到0xfe05b执行紧接着BIOS会执行开机自检, 以及一系列跟初始化有关的东西
参考
2. 加载启动区

如果一切完成, BIOS将会扫描每个硬盘设备(实在每个储存设备都行,包括硬盘,U盘,软盘,光盘,或者类似的东西)中0盘0道1扇区的内容,如果这一扇区的最后两字节是0x55 0xaa,BIOS就会认为它是启动区,并复制到内存0x7c00位置
复制完之后, BIOS将直接跳转到0x7c00, 也就是BIOS的任务终结了
为什么非要是 0x7c00 呢?BIOS开辟团队是如许定的,改了会不兼容。
3. 体系内核

颠末之前的积极, 终于进入了内核, 不过如果你聪明, 肯定知道启动区里绝对是要跳转的, 因为现代OS肯定大于512字节, 然后就是OS的代码了
OS的操作这里不提, 大概就是 设置中断,GDT,开掩护模式,分页,然后规划内存, 然后启动体系各个历程
这里附Linux0.11的启动区bootsert.s (给自己挪个位, 输出Loading system ..., 加载磁盘中剩下的代码)
;; SYS_SIZE is the number of clicks (16 bytes) to be loaded.; 0x3000 is 0x30000 bytes = 196kB, more than enough for current; versions of linux;SYSSIZE = 0x3000;;        bootsect.s                (C) 1991 Linus Torvalds;; bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves; iself out of the way to address 0x90000, and jumps there.;; It then loads 'setup' directly after itself (0x90200), and the system; at 0x10000, using BIOS interrupts. ;; NOTE; currently system is at most 8*65536 bytes long. This should be no; problem, even in the future. I want to keep it simple. This 512 kB; kernel size should be enough, especially as this doesn't contain the; buffer cache as in minix;; The loader has been made as simple as possible, and continuos; read errors will result in a unbreakable loop. Reboot by hand. It; loads pretty fast by getting whole sectors at a time whenever possible..globl begtext, begdata, begbss, endtext, enddata, endbss.textbegtext:.databegdata:.bssbegbss:.textSETUPLEN = 4                                ; nr of setup-sectorsBOOTSEG  = 0x07c0                        ; original address of boot-sectorINITSEG  = 0x9000                        ; we move boot here - out of the waySETUPSEG = 0x9020                        ; setup starts hereSYSSEG   = 0x1000                        ; system loaded at 0x10000 (65536).ENDSEG   = SYSSEG + SYSSIZE                ; where to stop loading; ROOT_DEV:        0x000 - same type of floppy as boot.;                0x301 - first partition on first drive etcROOT_DEV = 0x306entry startstart:        mov        ax,#BOOTSEG        mov        ds,ax        mov        ax,#INITSEG        mov        es,ax        mov        cx,#256        sub        si,si        sub        di,di        rep        movw        jmpi        go,INITSEGgo:        mov        ax,cs        mov        ds,ax        mov        es,ax; put stack at 0x9ff00.        mov        ss,ax        mov        sp,#0xFF00                ; arbitrary value >>512; load the setup-sectors directly after the bootblock.; Note that 'es' is already set up.load_setup:        mov        dx,#0x0000                ; drive 0, head 0        mov        cx,#0x0002                ; sector 2, track 0        mov        bx,#0x0200                ; address = 512, in INITSEG        mov        ax,#0x0200+SETUPLEN        ; service 2, nr of sectors        int        0x13                        ; read it ; BIOS留的中断, 读文件        jnc        ok_load_setup                ; ok - continue        mov        dx,#0x0000        mov        ax,#0x0000                ; reset the diskette        int        0x13        j        load_setupok_load_setup:; Get disk drive parameters, specifically nr of sectors/track        mov        dl,#0x00        mov        ax,#0x0800                ; AH=8 is get drive parameters        int        0x13        mov        ch,#0x00        seg cs        mov        sectors,cx        mov        ax,#INITSEG        mov        es,ax; Print some inane message        mov        ah,#0x03                ; read cursor pos        xor        bh,bh        int        0x10        mov        cx,#24        mov        bx,#0x0007                ; page 0, attribute 7 (normal)        mov        bp,#msg1        mov        ax,#0x1301                ; write string, move cursor        int        0x10; ok, we've written the message, now; we want to load the system (at 0x10000)        mov        ax,#SYSSEG        mov        es,ax                ; segment of 0x010000        call        read_it        call        kill_motor; After that we check which root-device to use. If the device is; defined (!= 0), nothing is done and the given device is used.; Otherwise, either /dev/PS0 (2,28) or /dev/at0 (2,8), depending; on the number of sectors that the BIOS reports currently.        seg cs        mov        ax,root_dev        cmp        ax,#0        jne        root_defined        seg cs        mov        bx,sectors        mov        ax,#0x0208                ; /dev/ps0 - 1.2Mb        cmp        bx,#15        je        root_defined        mov        ax,#0x021c                ; /dev/PS0 - 1.44Mb        cmp        bx,#18        je        root_definedundef_root:        jmp undef_rootroot_defined:        seg cs        mov        root_dev,ax; after that (everyting loaded), we jump to; the setup-routine loaded directly after; the bootblock:        jmpi        0,SETUPSEG; This routine loads the system at address 0x10000, making sure; no 64kB boundaries are crossed. We try to load it as fast as; possible, loading whole tracks whenever we can.;; in:        es - starting address segment (normally 0x1000);sread:        .word 1+SETUPLEN        ; sectors read of current trackhead:        .word 0                        ; current headtrack:        .word 0                        ; current trackread_it:        mov ax,es        test ax,#0x0fffdie:        jne die                        ; es must be at 64kB boundary        xor bx,bx                ; bx is starting address within segmentrp_read:        mov ax,es        cmp ax,#ENDSEG                ; have we loaded all yet?        jb ok1_read        retok1_read:        seg cs        mov ax,sectors        sub ax,sread        mov cx,ax        shl cx,#9        add cx,bx        jnc ok2_read        je ok2_read        xor ax,ax        sub ax,bx        shr ax,#9ok2_read:        call read_track        mov cx,ax        add ax,sread        seg cs        cmp ax,sectors        jne ok3_read        mov ax,#1        sub ax,head        jne ok4_read        inc trackok4_read:        mov head,ax        xor ax,axok3_read:        mov sread,ax        shl cx,#9        add bx,cx        jnc rp_read        mov ax,es        add ax,#0x1000        mov es,ax        xor bx,bx        jmp rp_readread_track:        push ax        push bx        push cx        push dx        mov dx,track        mov cx,sread        inc cx        mov ch,dl        mov dx,head        mov dh,dl        mov dl,#0        and dx,#0x0100        mov ah,#2        int 0x13        jc bad_rt        pop dx        pop cx        pop bx        pop ax        retbad_rt:        mov ax,#0        mov dx,#0        int 0x13        pop dx        pop cx        pop bx        pop ax        jmp read_track/* * This procedure turns off the floppy drive motor, so * that we enter the kernel in a known state, and * don't have to worry about it later. */kill_motor:        push dx        mov dx,#0x3f2        mov al,#0        outb        pop dx        retsectors:        .word 0msg1:        .byte 13,10        .ascii "Loading system ..."        .byte 13,10,13,10.org 508root_dev:        .word ROOT_DEVboot_flag:        .word 0xAA55 ; 看看这里, 是不是以0xaa55结束?.textendtext:.dataenddata:.bssendbss:完

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-4-26 21:11 , Processed in 0.109375 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表