Intelligence without ambition is a bird without wings.

2015-03-20
计算机启动过程

  1. 开机或重启(CPU执行第一条指令,跳转到FFFF:0000H)

    Bochs模拟:

    Intel跳转指令:

  2. BIOS加电自检 (Power On Self Test)

  3. BIOS自检完毕后,执行int 19(自举服务),按照CMOS中存储的设备启动顺序,将介质中的MBR扇区载入到0000:7C00处,

    检查其哨兵(0000:7DFE字)是否为(0x55AA)

    • 若是,则跳转到MBR载入位置(0000:7C00);

    • 若不是则载入下一个启动介质的MBR,重复操作,

    • 若没有找到合法MBR,则报错Invalid partition tableoperating system not foundMissing operating system等类似错误,停机

  4. MBR首先将自己复制到0000:0600 处,然后继续执行

  5. 在主分区表中搜索标志为活动的分区 . 如果发现没有活动分区或有不止一个活动分区 , 则转停止

  6. 将活动分区的第一个扇区(叫做分区启动记录,Volume Boot Record, VBR)读入内存地址0000:7C00处

  7. 检查(WORD)0000:7DFE是否等于0xAA55, 若不等于则显示Missing Operating System,然后停止

  8. 跳转到0000 :7C00处继续执行bootloader stage 2,加载相应操作系统的启动程序

参考

  1. https://www.ibm.com/developerworks/cn/linux/l-linuxboot/
  2. 维基-主引导记录
  3. wiki-Master_boot_record
  4. http://en.wikipedia.org/wiki/Boot_sector
阅读此文

2015-03-20
MBR

MBR是什么

主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,位于硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)。

在BIOS完成加电自检后,将该扇区内容加载到内存中执行。

MBR组成

| 开始地址 | 结束地址 | 作用 | 字节数 |
|————+————+————————————+——–|
| 0x000(0) | 0x1bd(445) | MBR,bootloader第一阶段代码 | 446 |
| 0x1be(446) | 0x1fd(509) | DPT,记录磁盘分区信息 | 64 |
| 0x1fe(510) | 0x1ff(511) | MAGIC(0x55,0xAA),分区是否有效标志 | 2 |

DPT成员

  • 用来记录分区相关信息

  • DPT表项占用16B,所以最多4个成员,意味着最多4个主分区!

Note:

  • 分区最小颗粒为1柱面

硬盘分区结构信息:

| 偏移 | 长度(字节) | 意义 |
|——+————+——————————————————————————————————–|
| 00H | 1 | 分区状态:00–>非活动分区;80–> 活动分区,其它数值没有意义 |
| 01H | 1 | 分区起始磁头号(HEAD),用到全部8位 |
| 02H | 2 | 分区起始扇区号(SECTOR),占据02H的位0-5; 该分区的起始磁柱号(CYLINDER),占据 02H的位6-7和03H的全部8位 |
| 04H | 1 | 文件系统标志位 |
| 05H | 1 | 分区结束磁头号(HEAD),用到全部8位 |
| 06H | 2 | 分区结束扇区号(SECTOR),占据06H的位0-5; 该分区的终止磁柱号(CYLINDER),占据 06H的位6-7和07H的全部8位 |
| 08H | 4 | 分区起始逻辑扇区号,低位字节在前(小端模式),如0x41394006,实际为0x06403941 |
| 0CH | 4 | 分区总的扇区数 |

实例分析:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
0000000: eb 63 90 8e d8 8e d0 bc 00 7c 89 e6 06 57 8e c0
0000010: fb fc bf 00 06 b9 00 01 f3 a5 ea 1f 06 00 00 52
0000020: 52 b4 41 bb aa 55 31 c9 30 f6 f9 cd 13 72 13 81
0000030: fb 55 aa 75 0d d1 e9 73 09 66 c7 06 8d 06 b4 42
0000040: eb 15 5a b4 08 cd 13 83 e1 3f 51 0f b6 c6 40 f7
0000050: e1 52 50 66 31 c0 66 99 e8 66 00 80 01 00 00 00
0000060: 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70
0000070: 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc
0000080: 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 bb 17 04
0000090: 80 27 03 74 06 be 88 7d e8 17 01 be 05 7c b4 41
00000a0: bb aa 55 cd 13 5a 52 72 3d 81 fb 55 aa 75 37 83
00000b0: e1 01 74 32 31 c0 89 44 04 40 88 44 ff 89 44 02
00000c0: c7 04 10 00 66 8b 1e 5c 7c 66 89 5c 08 66 8b 1e
00000d0: 60 7c 66 89 5c 0c c7 44 06 00 70 b4 42 cd 13 72
00000e0: 05 bb 00 70 eb 76 b4 08 cd 13 73 0d f6 c2 80 0f
00000f0: 84 d0 00 be 93 7d e9 82 00 66 0f b6 c6 88 64 ff
0000100: 40 66 89 44 04 0f b6 d1 c1 e2 02 88 e8 88 f4 40
0000110: 89 44 08 0f b6 c2 c0 e8 02 66 89 04 66 a1 60 7c
0000120: 66 09 c0 75 4e 66 a1 5c 7c 66 31 d2 66 f7 34 88
0000130: d1 31 d2 66 f7 74 04 3b 44 08 7d 37 fe c1 88 c5
0000140: 30 c0 c1 e8 02 08 c1 88 d0 5a 88 c6 bb 00 70 8e
0000150: c3 31 db b8 01 02 cd 13 72 1e 8c c3 60 1e b9 00
0000160: 01 8e db 31 f6 bf 00 80 8e c6 fc f3 a5 1f 61 ff
0000170: 26 5a 7c be 8e 7d eb 03 be 9d 7d e8 34 00 be a2
0000180: 7d e8 2e 00 cd 18 eb fe 47 52 55 42 20 00 47 65
0000190: 6f 6d 00 48 61 72 64 20 44 69 73 6b 00 52 65 61
00001a0: 64 00 20 45 72 72 6f 72 0d 0a 00 bb 01 00 b4 0e
00001b0: cd 10 ac 3c 00 75 f4 c3 15 49 e4 03 00 00 80 01
00001c0: 01 00 07 fe ff ff 3f 00 00 00 41 39 40 06 00 fe
00001d0: ff ff 0f fe ff ff fe 3f 40 06 cc 08 f8 33 00 00
00001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa

分区1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                                                   00 01
00001b0: 80 01
02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
00001c0: 01 00 07 fe ff ff 3f 00 00 00 41 39 40 06

0x1be
00H 1 80->活动分区
01H 1 分区起始磁头号,1
02H 2 分区起始扇区号,占用02H的低6位,1
分区起始柱面号,占用02H的高2位和03H的8位,0
04H 1 文件系统标志位,NTFS(07H)
05H 1 分区结束磁头号,ff(254)
06H 2 分区结束扇区号,占用06H的低6位,63
分区结束柱面号,占用06H的高2位和07H的8位,113f(1477)
08H 4 分区起始逻辑扇区号,0000003f(63)
0cH 4 分区总扇区数,06403941(104872257)

使用fdisk查看DPT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fdisk -l

Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x03e44915

Device Boot Start End Blocks Id System
/dev/sda1 * 63 104872319 52436128+ 7 HPFS/NTFS/exFAT
/dev/sda2 104873982 976767177 435946598 f W95 Ext'd (LBA)
/dev/sda5 104873984 207273983 51200000 7 HPFS/NTFS/exFAT
/dev/sda6 207276032 317071359 54897664 83 Linux
/dev/sda7 * 317073408 317464575 195584 83 Linux
/dev/sda8 317466624 321370111 1951744 82 Linux swap / Solaris
/dev/sda9 321372160 341852159 10240000 83 Linux
/dev/sda10 * 341854208 362334207 10240000 83 Linux
/dev/sda11 362334271 419473214 28569472 83 Linux
/dev/sda12 419473278 976767177 278646950 7 HPFS/NTFS/exFAT

参考

  1. 维基-加电自检
  2. 维基-MBR
阅读此文

2015-03-19
ubuntu下编译syslinux

  • 下载源代码官网

  • 安装编译工具

    sudo apt-get install mingw32 nasm uuid-dev
    
  • 提取源代码到extN分区

  • 进入源代码目录

    make bios
    
阅读此文

2015-03-19
wmic常用命令

  • 查看分区信息

    wmic volume list brief
    
  • 查看磁盘列表

    wmic diskdrive list
    
阅读此文

2015-03-19
C优秀书籍列表

  • C语言接口与实现:创建可重用软件的技术
阅读此文

2015-03-18
优秀个人博客

阅读此文

2015-03-18
redis-学习资源

阅读此文

2015-03-18
windows双击安装apk

阅读此文

2015-03-17
vim-学习资源

阅读此文

2015-03-17
vim-执行外部程序

windows

版本1

1
exe '!cmd'

优点

  • 达到初步要求

缺点

  • vim被阻塞

  • 当文件名包含非ASCII字符,且vim内部编码(utf-8)与shell编码(gbk)不一致时,报错:找不到该文件

  • 不支持参数化,不能方便复用

  • 不支持传入参数

版本2

1
exe printf('!"%s"', filename)

优点

  • 参数化

版本3

1
2
3
4
5
exe iconv(printf('%s "%s" "%s"',
\ g:cmd_runner,
\ b:interpreter,
\ b:exec_filename,)
\ 'utf-8', 'chinese')

优点

  • 支持中文

版本4

1
exe '!start cmd'

优点

  • 非阻塞执行

缺点

  • 执行控制台一闪而过,无法看见程序输出

版本5

1
2
3
4
5
exe iconv(printf('%s "%s" "%s"',
\ g:cmd_runner,
\ b:interpreter,
\ b:exec_filename,)
\ 'utf-8', 'chinese')

优点

  • 控制台显示

缺点

  • 显示了命令字符串

版本6

1
2
3
4
5
6
exe iconv(printf('%s "%s" "%s" %s',
\ g:cmd_runner,
\ b:interpreter,
\ b:exec_filename,
\ b:args),
\ 'utf-8', 'chinese')

#说明

前置代码

  • .vimrc
1
2
3
4
5
6
7
8
9
fun! IsWin()
return has("win32") || has("win64")
endf

if IsWin()
let g:cmd_runner = '!start E:/OS/Windows/bin/cb_console_runner.exe'
else
let g:cmd_runner = '!gnome-terminal -x bash -c'
endif
  • ftplugin/python.vim
1
2
3
4
5
6
7
8
let b:python_version = '27-32'
let b:args = ''
let b:exec_filename = expand("%:p")
if IsWin()
let b:interpreter = printf('c:/python%s/python.exe', b:python_version)
else
let b:interpreter = 'python2 -B'
endif
阅读此文