一直很好奇,操作系统是如何工作的?我们知道平时编程,是如何让代码跑起来的,但那些都是比较高层次的东西。越往后,你会越觉得,像是空中楼阁,或者说只是有人帮你铺平了许多道理,而你却对此一无所知。

1. 操作系统的困惑

  当然了,也不是真的一无所知。因为有很多的操作系统方面的书籍,教你了解操作系统是如何如何工作的,它的各种原理。但总有一种任督二脉不通的感觉。好像说的都知道一点,但好像知道这是什么,在哪里用,和为什么了。

  我曾经看过一系列关于一个如何自制操作系统的文章,非常棒。https://wiki.0xffffff.org/  里面完全展示了一个求知者的过程,硬件加载,软件接管,操作系统,内存,中断,驱动,线程等等方面的知道。可以说,是一个用于解惑,不可多得的文章了。应该说,很多关于操作系统的困惑,在这里找到答案,当然你得自己总结下才行。

  但是,我还是会有那么一种感觉,原理看得再多,还是很空虚的。上面那个demo虽然把所有的东西都讲了一遍,好像已经把所有问题都讲了,但还毕竟只是demo。也许实际情况并非如此呢?至少不会那么简单。这着实困扰着自己跳动的心。

  再后来,遇到了一篇讲关于epoll的文章: https://bbs.gameres.com/thread_842984_1_1.html  。 经过这篇文章的讲解,可以说把整个io的原理讲得非常之透彻了。而我本人的确也从这里出发,给团队内部做了一次分享。不知道他们感觉怎么样,反正我是感觉挺通透的。这关于io东西,可以说是操作系统中的一个小点。但我个人觉得,框架也许只需要你了解一次就好,但小点却是需要反复琢磨的。我们需要带着问题去找答案,这个问题往往是关于小点的多。

2. 敢不敢啃一啃操作系统的硬骨头?

  说实话,我是不敢的。原因是,它太复杂,太宏大,这是比较大方向的困难。其次是,我单就语言这一关,可能就难以过去,因为你至少汇编、C之类的语言要足够好才行,而自己却只算是皮毛。正所谓一生清贫怎敢入繁华,两袖清风怎敢误佳人。

  难道就这样得过且过么?但心里总是有一些疑问,不知道怎么去解决。一是问不了许多人,二是自己也不知道咋问,三是即使别人告诉了你你就能懂吗?(就像教书一样)

  所以,还是自己找答案吧。其实网上有太多零零散散的答案,好像都能看懂,但又好像都不是很明白。

  最好的文档,都在官方资料里。最好的答案,都在代码里。所以,去看看又何妨。

3. linux内核源码地址

  也许大家一般都是在github上去看这些源码。但在国内,github的速度实在是不敢恭维。

  gitee地址: https://gitee.com/mirrors/linux

  github地址: https://github.com/torvalds/linux

  至于阅读工具嘛,纯粹打酱油的,使用 sublime 之类的就可以了,如果想更好一点,就eclipse也行,当然可能还要设置其他好些环境问题。

4. linux框架结构

  关于阅读技巧,可参考文章:https://www.cnblogs.com/fanzhidongyzby/archive/2013/03/20/2970624.html

  整体目录结构如下:

关于linux的一点好奇心(一):linux启动过程-LMLPHP

  细节简略描述如下:

    arch——与体系结构相关的代码。 对应于每个支持的体系结构,有一个相应的目录如x86、 arm、alpha等。每个体系结构子目录下包含几个主要的子目录: kernel、mm、lib。
    Documentation——内核方面的相关文档。
    drivers——设备驱动代码。每类设备有相应的子目录,如char、 block、net等 fs 文件系统代码。每个支持文件系统有相应的子目录, 如ext2、proc等。
    fs——文件系统实现。如fat, ext4...
    include——内核头文件。 对每种支持的体系结构有相应的子目录,如asm-x86、 asm-arm、asm-alpha等。
    init——内核初始化代码。提供main.c,包含start_kernel函数。
    ipc——进程间通讯代码。
    kernel——内核管理代码。
    lib——与体系结构无关的内核库代码,特定体系结构的库代码保存在arch/*/lib目录下。
    mm——内存管理代码。
    net——内核的网络代码。
    samples——一些使用功能接口的样例,有点类似于单元测试。
    scripts——此目录包含了内核设置时用到的脚本。
    security——安全相关的实现。
    tools——一些附带工具类实现。

  其中,Documentation目录可能是源码不相关的目录,但对我们理解系统却是非常重要的地方。(因为我们多半只能看得懂文字的表面意思)

5. linux-86启动过程

  以x86的实现为例,其启动过程大致如下:以 header.S 开始,以main.c结束(我们自认为看得懂的地方)。

    /arch/x86/boot/header.S
        -> calll main    ->    /arch/x86/boot/main.c
        -> go_to_protected_mode()    ->    /arch/x86/boot/pmjump.S
        -> jmpl    *%eax    ->    /arch/x86/kernel/head_32.S
        -> .long i386_start_kernel    ->    /arch/x86/kernel/head32.c
        -> start_kernel()    ->    /init/main.c    (C语言入口)
01-03 21:50