Nanos note 1 : bootloader

Nanos是JYY大神为南大计算机系操作系统课程专门设计的实验用操作系统。出于对操作系统的好奇和对JYY大神的敬仰,我又再次踏上了DIY玩具内核的道路。和本科时候不同,这次希望能对操作系统有更深的理解,而不是仅仅局限于完成实验,也希望能留下一些笔记作为积淀。这是第一篇note,从分析Nanos的bootloader开始再好不过了。

Nanos的框架代码都可以在github上找到(点我),为了方便起见,一份打包的仅包含bootloader的代码在这里


正如之前提到的,在计算机的启动过程中当完成了POST之后,BIOS会从可启动磁盘中读出头512个字节(MBR)并将其载入内存地址0x7c00的位置并开始执行,MBR中的代码通常被称为bootloader,负责将操作系统内核载入到内存中。在Nanos中,bootloader极其简单,仅由MBR中的512字节组成(即仅包含stage 1),麻雀虽小五脏俱全,Nanos的bootloader完成了bootloader所需要做的所有基本任务:为操作系统内核设置运行环境、载入内核到内存、跳转到内核开始执行。

下面具体分析一下Nanos的bootloader是如何完成的。首先看一下bootloader的源文件目录结构:

继续阅读:

[译]主板芯片组和存储地址映射 – Motherboard Chipsets and the Memory Map

原文在此,翻译仅供参考。


我计划写一些关于计算机内部的文章来解释现代的操作系统内核是如何运行的。我希望这些文章会对那些对此类东西感兴趣而没有相关经验的程序猿有所帮助,我会集中关注Linux、Windows和Intel处理器。探究计算机的内部运行原理是我的爱好,我已经写了一些内核态的代码但是还没有怎么写过相关的文章。我的第一篇文章将会对现代Intel系列的主板构造、CPU存储访问、存储地址映射进行描述。

作为开始,我们先来看一下现在的Intel体系的计算机是如何连接起来的。下图中包含了主板中的主要部件:

主板示意图,北桥和南桥构成了芯片组

主板示意图,北桥和南桥构成了芯片组

当你在理解上图时,需要重点注意的一点是CPU并不知道它和什么东西连接在一起,它通过引脚(pins)和外部交流,但并不关心外部环境是什么:可能是主板,但也可能是烤面包机、路由器、植入大脑或者是CPU测试器。CPU主要通过三种方式与外部环境通信:存储地址空间、I/O地址空间和中断。现在我们只关注主板和存储。

继续阅读:

[译]计算机启动过程 – How Computers Boot Up

原文在此,如果英文阅读能力不差还是尽量读原文吧。


先前的文章描述了Intel系列计算机的主板和存储地址映射,在此基础上我们来看看计算机启动的初始阶段。计算机的启动是一个复杂、多阶段并且相当有趣的事情。下图描述了整个计算机启动的过程:

计算机启动过程

计算机启动过程

当你按下计算机的电源按钮时,启动过程就开始了。一旦主板电源接通,主板就会初始化主板上的固件——一些芯片组和周边——并且会尝试让CPU运行起来。如果在这一步失败了(比如CPU故障或者没有找到),一般来说除了风扇仍然可以转动,计算机的其他部分都无法工作。少数主板在未找到CPU或者发现CPU故障时会发出“哔哔”的警报音,但是基于我的经验,大部分的主板只会不断的转动风扇,没有其它任何反应。有时候USB或是其他设备都有可能会导致这种情况:如果你发现你的系统突然变成了这样,尝试拔掉所有非必须的设备可能会有帮助。你也可以一个一个的排除出可能导致问题发生的设备。

继续阅读:

OpenStack Havana(Ubuntu 13.10)安装笔记

安装配置OpenStack最好的资料是OpenStack的官方安装指南,我就是按照官方指南一步一步进行的,虽然基于的操作系统版本不同(指南中使用的是Ubuntu 12.04),所幸没有遇到什么诡异的问题,不废话了,整个过程记录如下。


安装环境

操作系统:Ubuntu 13.10
配置机器数:1(单点安装)
机器网卡数量:2
Hypervisor类型:KVM

继续阅读:

使用python模拟weibo登录

之前写过在python中使用weibo API的方法,见这里,但是因为weibo API有频率限制,不够目前需求使用,所以通过爬虫模拟登录weibo进行直接抓取还是很有必要的,第一步要做的事情就是模拟登录过程。

weibo的登录方法一直在变,不知道现在的方法还能使用多久。
目前登录使用的是RSA加密的方式,总体来看步骤分为三步:

  1. 访问预登录地址,获取servertime、nonce和RSA公钥
  2. 访问认证地址,发送编码后的用户名和RSA加密过的密码,获得跳转地址
  3. 访问获得的地址,获取到登录cookie,登录完成

继续阅读:

架设简单git服务器

看到标题,最容易想到的问题就是:“为什么不用github?”。
确实github十分好用,但在如下一些情况下你确实需要一个自己的git服务器:

  1. 自己的代码太丑,羞于放在github上…
  2. 我很自私,不想开源,又很穷,买不起github付费服务…
  3. 开发环境不能连接外网(这是真实存在的)…
  4. 我就是想玩一下…

假设现在已经有了需求,其实实际操作的过程还是很简单,参照《Pro Git》所述即可。

继续阅读:

通过python SDK使用weibo API

之前做JAVA课大作业的时候曾经用过weibo的API,weibo的API采用OAuth2的认证方法进行认证,也就是避免开发者知晓用户密码的一种手段。不过这样对于开发一些简单使用的客户端程序就不太友好了,可以通过程序模拟授权过程来跳过这一步骤。之前是用JAVA做的,现在用Python再做一次…

继续阅读:

通过VNC连接Linux远程桌面

因为特殊的需求关系,琢磨了一下如何在本地连接远程Linux主机的桌面环境。翻了不少网上的相关文章,大部分都只讲了步骤没有说为什么这么做,我就简单再复述一遍吧,加深一下印象。
环境如下:

基本原理其实很简单,要连接服务器的远程桌面环境,首先需要在服务器准备好桌面环境,然后通过远程桌面的协议实现远程访问。

继续阅读:

再见,百度

2013年1月21号,在大厦办理离职,结束了我在百度为期半年多实习。走出大厦的一刻,有种难以表述的感觉,有轻松,也有失落,总的来说更多的还是对这半年百度生活的怀念。

翻看邮件,找出当时收到的邮件Offer,日期是2012年5月12日,五味杂陈。仍清楚的记得收到邮件的时候的那种激动自豪的心情,记得那种对公司憧憬和向往的感觉。也记得在2012年7月11日入职当天,第一次踏入百度大厦,在五福签下卖身契的那一刻,那种对未来的无限可能的幻想。半年之后,这种感觉却好像昨天一样。耐心从头教我的导师俊杰、高富帅肖总、冷冷的辉总、坑我鸡翅的永宽、靠谱的学长臧志、乐观的真男人刚哥,还有一起实习的兄弟朝斌、陈扬,还有好多好多人…回忆这段实习生活,满满的都是对你们的感激。

我一向不是个爱写东西的人,离职几天一直没下定决心写点什么。前几日看到网上爆火的《李彦宏的“罪己诏”》《慎言多思》两篇文章,才发现有写点东西的必要了。Lox的这两篇文写的还是比较实在的,只是可能带入了自己过多的情感因素,只写出了坏的方面,对好的方面只字未提。不过我作为一个已经离职的半调子实习生,也没有水平来做什么深入的分析,这些事情还是留给高管什么的去操心吧。对我来说最为触动的反而是Lox最后不经意的一句“谨以此文,纪念我那九个月‘不合格’的百度岁月”。我想,我也该趁这段记忆还热乎,赶紧留些文字纪念一下这更不合格的半年百度岁月。

继续阅读:

[译]理解timsort, 第一部分:适应性归并排序(Adaptive Mergesort)

Python2.3中开始使用的timsort应该说算是声名在外了,不管是在稳定性还是在速度上都十分的惊人。
前一段刚刚看了《Python CookBook》中的一些章节,对timsort产生了一些兴趣。于是在网上看到了这边文章,讲的相当清楚明了,于是产生了翻译的念头,也于是有了这篇文章。

这应该算是我翻译的第一篇技术文章,真正做一次才明白能看懂和能翻译出来还是有蛮大的差距的。翻译质量不可谓不差,诸位如果英文阅读无障碍,强烈建议移步原文:Understanding timsort, Part 1: Adaptive Mergesort,如果你不幸看了下面的坑爹译文,欢迎留下各种吐槽!闲话少说,上主菜:


Python的timsort常常被认为是很复杂、可怕的。这是可以理解的,因为其中包含了太多的细节。但是,如果你真正的了解它,你会发现它其实只是对归并排序进行了一系列的改进。其中有一些是很聪明的,而也有一些是相当简单直接的。这些大大小小的改进聚集起来使得算法的效率变得十分的吸引人。

我将会通过一些例子告诉你如何从一个最基本的归并排序开始逐步得到timsort。在本文中我会讲述如何得到timsort的“核心”:基本的适应性归并排序。后续的文章会在此基础上讲述timsort中使用的其他特别的优化。
继续阅读: