夜间模式暗黑模式
字体
阴影
滤镜
圆角
thumbnail
Linux学习日记 Day_1
目前为止个人很推荐鸟哥写的Linux入门指南,有繁体中文版全文可供检索。 http://linux.vbird.org/new_linux.php 在序章详细讲述了很多关于Linux的历史,在使用Ubuntu的过程中一些看不懂的缩写词,在其中也得到答案(看看以往的历史发展也是一件很有趣的事情) 开机流程的检测程序 这更多是计算机概论的知识。我们都知道BIOS是写入到主板上的一个固件(固件就是写入到硬件上的一个软件程序),BIOS在开机的时候是计算机系统会主动执行的一个程序。这还不是我们熟知的操作系统阶段。接下来BIOS会去分析计算机里有哪些存储设备。以硬盘为例,BIOS会根据使用者的设置去取得能够开机的硬盘,并且到硬盘里读取第一个扇区中的MBR位置。 什么是MBR呢? 主引导记录(MBR,Main Boot Record)是位于磁盘最前边的一段引导(Loader)代码。它负责磁盘操作系统(DOS - Disk Operation System)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由DOS在对硬盘进行初始化时产生的。 MBR这个仅有446Bytes的硬盘容量里会放置最基本的开机管理程序,此时BIOS做完了它该做的事情,接下来就是MBR内的开机管理程序的工作了。 开机管理程序目的是在载入核心文件,这是在安装操作系统时候提供的,所以它会认识硬盘里面的文件系统格式,因此就能够读取系统核心文件。此时Loader的工作也做完,接下来就是我们熟知的操作系统的工作啦。 总结一下开机到操作系统的流程: BIOS:开机主动执行的固件,识别第一个可开机的设备;MBR:第一个可开机设备中第一个扇区内主要开机记录块,内置Loader;Loader:一个可读取核心文件来执行的软件;核心文件:开始使用操作系统; 我们可以在一个电脑里实现多系统,在开机时可以选择系统进入。这是因为MBR也可以有将开机管理功能转交给其他Loader负责,开机管理程序除了可以安装在MBR之外,还可以安装在每个分区的开机扇区(Boot sector)中。这个特色造就了“多重开机”的功能。 如果要在个人电脑里安装Linux和Windows双系统,建议是先安装Windows再安装Linux,这是为什么呢?Windows在安装的时候,它的安装程序会主动覆盖掉MBR以及自己所在分区的开机扇区,安装过程中它是没有供我们选择的选项。而Linux则不同,Linux的Loader可以手动设置菜单,所以可以在Linux的Boot Loader里面加入Windows的开机选项。 UEFI BIOS搭配GPT的开机流程 解释一下名词,看不懂缩写不应该成为阻碍学习进程的障碍。 什么是GPT? GUID磁盘分区表(GUIDPartition Table,缩写:GPT)是一个实体硬盘的分区表的结构布局的标准。它是可扩展固件接口(EFI)标准(被Intel用于替代个人计算机的BIOS)的一部分,被用于替代BIOS系统中的一个扇区来存储逻辑块地址和大小信息的主开机纪录(MBR)分区表。对于那些扇区为512字节的磁盘,MBR分区表不支持容量大于1TB(1 × 10^12字节)的分区,然而,一些硬盘制造商(诸如希捷和西部数据)注意到了这个局限性,并且将他们的容量较大的磁盘升级到了4KB的扇区,这意味着MBR的有效容量上限提升到了16 TB。 这个看似“正确的”解决方案,在临时地降低了人们对改进磁盘分配表的需求的同时,也给市场带来了关于在有较大的块(block)的设备上从BIOS启动时,如何最佳的划分磁盘分区的困惑。GPT分配64bits给逻辑块地址,因而使得最大分区大小在2^64-1个扇区成为了可能。对于每个扇区大小为512字节的磁盘,那意味着可以有9.4ZB(9.4 x 10^21字节)或18 E 个512字节(9,444,732,965,739,290,426,880字节 或 18,446,744,073,709,551,615(2^64-1)个扇区 x 512(=2^9)字节每扇区)。https://baike.baidu.com/item/GPT/15413476 前面讲到的MBR也是一种磁盘分区表格式,GPT和MBR之间的简单差别就是MBR“太小了”,GPT“能提供更大的”。因为一开始BIOS和MBR是一对好兄弟,但是BIOS不认识GPT了,所以为了要认识GPT,就有了UEFI。 什么是UEFI呢? 新型UEFI,全称“统一的可扩展固件接口”(Unified Extensible Firmware Interface), 是一种详细描述类型接口的标准。这种接口用于操作系统自动从预启动的操作环境,加载到一种操作系统上。可扩展固件接口(Extensible Firmware Interface,EFI)是 Intel 为 PC 固件的体系结构、接口和服务提出的建议标准。其主要目的是为了提供一组在 OS 加载之前(启动前)在所有平台上一致的、正确指定的启动服务,被看做是有近20多年历史的 BIOS 的继任者。 https://baike.baidu.com/item/UEFI/3556240 简而言之,UEFI要取代BIOS。而UEFI甚至可以被看成是一个小型的操作系统。为什么呢?UEFI使用C语言编程,比起使用组合语言的传统BIOS更容易开发。只要开发者够厉害,可以在UEFI阶段就可以实现上网,从而根本不用进入操作系统!
thumbnail
UVa 202 – Repeating Decimals
如何判定两个自然数除得有理小数的循环节及其长度?我们可以通过模拟人工笔算除法的过程发现其内在的规律。对于一般的除数m,除法运算后所得余数情况至多有m-1种。根据抽屉原理,必然会有循环节的出现。我们要做的就是记录每一步的运算情况,就像自己手算除法一样,并从中判断余数重复,进而问题得解。 //cpp #include "pch.h" #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #define MAXLEN 3003 using namespace std; int ans[MAXLEN], sign[MAXLEN], remain[MAXLEN]; int main() { int n, m, temp; while (cin >> n >> m) // n为被除数,m为除数 { // 初始化 temp = n; memset(ans, 0, sizeof(ans)); memset(sign, 0, sizeof(sign)); int count = 0; // 整数部分除法运算 ans[count++] = n / m; n %= m; // 小数部分除法运算 // ans数组用来存储每一位商 // sign数组用来标记m-1种余数的出现情况 // s数组用来记录每一步的余数 // 若余数没有重复(!sign[n])并且没有将n除尽,则继续除法运算 while (!sign[n] && n) { sign[n] = count; remain[count] = n; ans[count++] = 10 * n / m; n = 10 * n % m; } // 输出整数部分 printf("%d/%d = %d", temp, m, ans[0]); printf("."); for (int i = 1; i < count && i <= 50; ++i) { // 判断何时开始循环 输出括号 if (n && remain[i] == n) printf("("); printf("%d", ans[i]); } // 除尽特判 if (!n) printf("(0"); if (count > 50) printf("..."); printf(")\n"); printf(" %d = number of digits in repeating cycle\n\n", !n ? 1 : count - sign[n]); } return 0; }