内核之最

  真后悔开了这个内核专场,linux内核里面每个函数和结构体都是变态的,正如fudan_abc大虾说的那样,写内核的那些人没有哪个不是变态的。我为什么要趟这趟浑水呢?可能是开《龙门镖局》看多了,被他们同化了,变成了一个脑残,俺信了你的邪呀!有时间看内核还不如多撸几局LOL,提高一下操作水平,以后还可以去打职业竞争呢。

  我本来看内核就有三个原则,第一:万不得已的情况下绝不接触内核内存管理机制;第二:打死我也不看文件系统的底层实现;第三:挨千刀也不纠结kobject和kset那一套。

  为什么我会有这三个原则,因为我都曾经被他们无情地蹂躏过,所以在我脆弱的心灵里留下了不可磨灭的伤痕,过去的事情我不愿再谈,说多了都是眼泪。

  以下内容都是个人的一些看法,有不同意见的人千万别开骂!

  第一最:同行的人都认为内核里面最复杂的机制便是内存管理机制,有多复杂?复杂到我都不知道她到底有多复杂。。。。不过有一些比较基本的概念可以告诉大家,一个物理页是4K(这是地球人都知道的),为什么是4K,这和MMU的机制有很大的关系,不知道什么是MMU的去问搜索界的神雕侠侣(谷哥和度娘),在物理页的基础上内核使用了伙伴算法去管理安排这些物理页,伙伴算法在物理页的基础上建立了块的概念,一个块可以由1个或者2个或者4个或者8个物理页组成,这个数字必须是2的多少次方。在块的基础上内核又使用了slab机制,slab机制要比伙伴算法复杂的多,为什么会有slab机制的产生,某个哲学家曾经说过:存在则合理。为什么呢?不管你知不知道,反正我是不知道的。说好了不纠结这些,我是不会违背自己的原则的。我只把我知道的告诉你,。假如你想获得一个字节的内存,内核如果给你分配一个物理页(4K字节),这样太不合理了吧,内核才不会这么傻,实话告诉你,内核很抠门的。slab机制其中一个用途就是可以在一个物理页的基础上再创造一个内存池,她把4K字节再分成很多很小的内存块,最小的好像只有32个字节,所以如果你用kmalloc去分配几个字节的内存话,内核就是在这个内存池里面给你分配的。记住,这只是slab机制的存在的其中一个理由。

  第二最:文件系统的代码量是内核里面最大的,虽然她的复杂度无法与内存管理比拟,但是。。。。没有但是,我不能违背自己的原则。

  第三最:usb驱动是内核所有驱动里面最复杂的。内核的usb代码主要涉及到了三块,一个是usb设备驱动,一个是usb core,一个是usb控制器驱动,关于这三者的关系,最好自己找相关的资料纠结一下吧。

  第四最:task_strust结构体是内核里面最长的结构体,今天我数了一下,一共有384行,内核里面可能还有比这更变态的结构体,但是我目前为止发现她是最长的。

  至于kobject和kset这一套我觉得深入研究一下还是挺不错的,最讨厌的是这东西是和sys文件系统挂勾的,这令我很纠结,文件系统什么的最讨厌了。

  下一步该纠结什么好,我今天思量了一下,决定从一个函数开始说起,这个函数就是do_page_fault(),这个函数很复杂。。所以呢,我也不保证我能把她说的明白,有时间再扯,明天要早起上班。。。。

原文地址:https://www.cnblogs.com/Blue-Moon/p/3332299.html