Linux系统的引导过程和磁盘分区信息

作者:chinaitlab 佚名

2005-12-07 00:00

评论

分享

【IT168 服务器学院】 系统的引导过程和磁盘分区信息

在PC机上,最初的启动由BIOS完成。当开机自检(Power-On Self Test,POST)结束时, BIOS尝试读入磁盘的第一个扇区,把它看作引导扇区。由于大多数BIOS不提供SCSI支持,若要从SCSI磁盘启动,SCSI适配器要提供他自己的 BIOS。如果什么都找不到,老的BIOS会启动内置的ROM BASIC,或直接打印“NO ROM-BASIC”。

操作系统的启动分几步完成。由于引导扇区比较小,通常它主要任务是读入第二个loader,第二个loader再读入第三个loader,直到整个操作系统被完全读入。

硬盘的引导区:

代码:

OFFSET

0x000 JMP xx Near jump into the program code

0x003 Disk parameters

0x03E Program code loading the DOS kernel

0x1FE 0xAA55 Magic number for BIOS

可见,引导区的结构相对比较简单。它的长度总是512字节。重要的是引导区从0开始,以BIOS的0x1FE处的0xAA55结束。

从软盘启动比较简单,因为只有一个引导扇区:第一个扇区。硬盘则困难一些,它被分成很多分区。但是,BIOS根本不管分区信息,它象对待软盘一样对待硬盘,仍读入第一个分区,叫作:master boot record。(MBR)。所以MBR也应该和上面介绍的结构一样,在MBR的最后部分,有分区表。如下图:

代码:

OFFSET Length

0x000 0x1BE code loading and starting the boot sector of the active

partitian

0x1BE 0x010 partition1

0x1CE 0x010 partition2

0x1DE 0x010 partition3

0x1EE 0x010 partition4

0x1FE 0x0012 0xAA55 Disk parameters

从0x1BE处(即第462字节处)开始,是一个个主分区信息。每个分区信息占16字节,结构如下:

1 BOOT Boot flag: 0=not active ,0x80 active

1 HD Begin:head number

2 SEC CYL Begin:sector and cylinder number of boot sector

1 SYS System Code:0x83 linux , 0x82 linux swap etc。

1 HD End:head number

2 SEC CYL End: sector and cylinder number of boot sector

4 low byte high byte Relative sector number of start sector

4 low byte high byte Number of sectors in the partition

所以硬盘可以有4个主分区:primary prititions。假如它们不够用,可以设置所谓的扩展分区。扩展分区包含至少一个逻辑分区。扩展分区的第一个扇区结构类似MBR,它的分区表的第一表项对应第一个逻辑分区。如果存在第二个逻辑分区,那么分区表的第二个表项就包含了一个指针。这个指针指向第一个逻辑分区后面的一个地址,这个地址包含一个分区表,该分区表的第一表项对应第二个逻辑分区。这样就组成一个链表,从而扩展分区可以有任意多的逻辑分区。

每一个主分区和扩展区都包含一个引导扇区。系统只能从这几个地方之一启动。BOOT标志决定哪个区被引导。

MBR的代码要作以下的操作:

1:确定活动分区。

2:使用BIOS,将活跃分区的启动扇区读入。

3:跳到启动扇区的0位置。

MBR的空间足够完成这些工作。如上所述,每个分区理论上包含一个引导扇区,而且,存在的第二个硬盘也包含和第一个类似的结构。MBR完全可以容纳一个复杂的引导程序。即所谓的boot manager,动态的决定活动分区。Linux为我们提供了lilo及grub等工具来管理启动各启动项。

下面这段C程序可以用来检测磁盘分区信息以验证上述理论的正确性。

代码:

/* marco corvi

* @date     feb 2003

*

* \brief Read disk partition table

* modified by zhoulifa

* 周立发 Linux爱好者 Linux知识传播者 SOHO族 开发者

*/

#include     // printf

#include    // exit

#include

#include

#include

#include

#include

int

main(int argc, char ** argv )

{

int fd;

unsigned char mbs[512]; // master boot sector

unsigned char * pp;       // partition pointer

int head, sect, cyl;

unsigned int sector;

int n;

if (argc <= 1) {

fprintf(stderr, "Usage: %s \n", argv[0] );

exit(1);

}

fd = open( argv[1], O_RDONLY );

if ( fd < 0 ) {

fprintf(stderr, "Error: unable to open device %s\n", argv[1] );

perror("");

exit(1);

}

n = read( fd, mbs, 512);

close(fd);

if ( n < 512 ) {

fprintf(stderr, "Error: short read %d\n", n );

exit(1);

}

pp = mbs + 0x1BE;

for (n=0; n<4; n++) {

printf("PARTITION %d\n", n );

printf("Boot flag    %2x\n", pp[0] );

printf("System flag %2x\n", pp[4] );

// C/H/S as 10+8+6

if(argc == 3)  {

head = pp[1];

sect = pp[2]; sect = (sect<<2) | (pp[3]>>6);

cyl   = pp[3] & 0x3f;

/*

cyl = pp[1] >> 2;

head = ((pp[1] & 0x03)<<6) | (pp[2]>>2);

sect = pp[2] & 0x03;

sect = (sect << 8) | pp[3];

head = pp[1];

sect = pp[3]>>6;

sect = (sect<<8) | pp[2];

cyl   = pp[3] & 0x3f;

*/

printf("Start Cylinder %d Head %d Sector %d \n", cyl, head, sect );

head = pp[5];

sect = pp[6]; sect = (sect<<2) | (pp[7]>>6);

cyl   = pp[7] & 0x3f;

cyl = pp[5];

printf("End   Cylinder %d Head %d Sector %d \n", cyl, head, sect );

}

sector = pp[8] + (1<<8)*pp[9] + (1<<16)*pp[10] + (1<<24)*pp[11];

printf("Sector number %u\n", sector);

sector = pp[12] + (1<<8)*pp[13] + (1<<16)*pp[14] + (1<<24)*pp[15];

printf("Number of sectors %u\n", sector);

pp += 0x10;

}

}

编译此程序后可以直接运行,如果没有任何参数,会从/dev/partitions文件里读取相应信息。如果有参数,则第一个参数指明要查看的设备。

参考了 http://www.linuxdby.com/articlesdisplay.php?newsid=75 及 marco_corvi的“Linux kernel programming by example”,并在Red Hat Linux 7.2系统上验证通过。

0

linux服务器引导分区,Linux系统的引导过程和磁盘分区信息相关推荐

  1. 如何在计算机中增加硬盘分区,win10系统电脑下增加新磁盘分区的操作方法

    有关win10系统电脑下增加新磁盘分区的操作方法想必大家有所耳闻.但是能够对win10系统电脑下增加新磁盘分区进行实际操作的人却不多.其实解决win10系统电脑下增加新磁盘分区的问题也不是难事,小编这 ...

  2. xp系统打开计算机硬盘分区,xp系统如何使用自带磁盘分区安装方法

    很部分用户来问小编我磁盘分区的方法有什么,其实想要让电脑的磁盘分区是非常简单的,如果大家想要了解的话,小编当然会分享给大家磁盘分区的方法!下面就给大家带来磁盘分区图文教程吧. 你知道电脑里有自带的磁盘 ...

  3. 高性能Linux服务器运维实战(系统基础运维)

    第1章 Linux基础命令的使用 1.1 Linux命令行与shell 1.1.1命令是Linux的精髓 X-window运行在命令行下的一个应用程序 1.1.2用户和操作系统内核之间通信的桥梁she ...

  4. linux 新分区使用1%,linux下使用fdisk结合partprobe命令不重启系统添加一块新的磁盘分区...

    主机自带硬盘超过300GB,目前只划分使用了3个主分区,不到70GB,如 下: [root@db2 ~]# df -h Filesystem Size Used Avail Use% Mounted ...

  5. partprobe使用方法_教程方法;linux下使用fdisk结合partprobe命令不重启系统添加一块新的磁盘分区电脑技巧-琪琪词资源网...

    琪琪词资源网-教程方法;linux下使用fdisk结合partprobe命令不重启系统添加一块新的磁盘分区电脑技巧,以下是给大家带来的教程方法;linux下使用fdisk结合partprobe命令不重 ...

  6. 【CentOS Linux 7】实验3【用户组群管理、磁盘分区及文件系统管理】

    Linux系统及应用---调研报告 [CentOS Linux 7]实验1[VMware安装.新建虚拟机:63个基础命令运行结果图] [CentOS Linux 7]实验2[Shell编程及应用] [ ...

  7. Linux 探索之旅 | 第一部分第四课:磁盘分区 + 完成 Ubuntu 安装

    -- 作者 谢恩铭 转载请注明出处 内容简介 第一部分第四课:磁盘分区+完成Ubuntu安装 第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区+完成Ubuntu安装 上一课Linux探索之 ...

  8. thinkpad重装系统不引导_thinkpad重装系统不引导_联想电脑重装系统无法引导原因及解决方法...

    1.bios设置的是uefi引导,而系统所在的硬盘为mbr分区,导致引导和分区类型不匹配. 2.bios设置的是legacy引导,而系统所在的硬盘为guid分区(gpt),导致引导和分区类型不匹配. ...

  9. linux服务器历险之linux性能监控

    linux服务器历险之linux性能监控 1.uptime uptime命令用于查看服务器运行了多长时间以及有多少个用户登录,快速获知服务器的负荷情况. uptime的输出包含一项内容是load av ...

最新文章

  1. 沈向洋出任董事长李笛任CEO,「微软」小冰变身「中国」小冰
  2. Linux系统中查看图片信息
  3. boost::function_types::has_property_tag用法的测试程序
  4. enable 华为交换机ntdp_关于华为交换机bpdu enable. ntdp enable. ndp enable解析
  5. 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue
  6. flask学习笔记之flask-migrate
  7. 修改mongodb最大查询数_WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除
  8. jzoj3519-灵能矩阵【LCM,树形dp】
  9. 【LeetCode笔记】1. 两数之和(JAVA、哈希表)
  10. 微服务架构下的轻量级定时任务解决方案
  11. Mac Xdebug安装时遇到了Zend Engine API 不一致的问题
  12. 【网易云课堂---轻松读书:番茄工作法】
  13. 小甲鱼解密系列调试篇——OD使用教程笔记(持续更新中)
  14. 小福利,制作词云图的第三种方法---stylecloud库,两行代码制作词云图
  15. 链家网爬取深圳租房分析
  16. 漫画:PHP女程序员自救的技巧
  17. 【iOS逆向与安全】iOS插件开发光速入门
  18. 怎么用python画世界地图_用Python画世界地图
  19. 2020年第三季度BEC商业邮件攻击暴增155%
  20. 什么是梯度?为什么梯度的方向总是指向函数值增大的方向?

热门文章

  1. 浅谈Masonry的使用技巧
  2. 当前目录不对导致的错误
  3. 【奇奇怪怪bug】Flink 1.10 on yarn ,application 在yarn 显示Running ,webui 显示Failed
  4. Android Base64的加密与解密
  5. perl mysql 数据推拉_Perl Mysql数据库操作实现代码
  6. 摇一摇语音报时(序)
  7. 我啊,程序员啊程序员
  8. Google Earth Engine(GEE)——全球影像数据正确下载方式和注意事项
  9. 计算机系统集成要开增值税税率,关于调整增值税税率的通知 2018年5月1日起执行...
  10. androidstudio简单页面设计