查看原文
其他

私密VIP群答疑

笨叔叔 奔跑吧Linux社区 2019-04-24

订阅了第一季旗舰篇的小伙伴都可以加入到笨叔叔的私密VIP群中讨论,笨叔为大家解答职场困惑,职场发展方向,技术问题等!下面几个常见有意思的问题。


Centos/RHEL 7的内核和社区的内核有什么区别?


国内使用Centos的厂商数不胜数,比如国内的绝大部分的互联网公司都采用Centos作为服务器的Linux发行版,包括BATJ等大公司。那有小伙伴问centos 7里采用的Linux内核和社区里的Linux内核有什么区别?


这是一个好问题,研究服务器的小伙伴一般都研究RHEL维护的内核。而centos是RHEL的开源发行版,所以很多不想买红帽服务的公司都采用centos,centos和RHEL的差别只有一点点,可以认为完全一样,所以很多公司把centos当中RHEL的免费替代品。目前RHEL 7.4版本使用的内核是 3.10,一定有小伙伴说,这个版本太低了,现在社区最新的都是4.15了,为何RHEL用这么低的版本呢?


其实RHEL作为一个产品,特别是服务器版本上的OS,必须保证稳定性和质量,所以不可能采用最新社区的Linux内核版本。RHEL每个版本的发布都经历过长时间的测试和性能优化。另外RHEL的内核版本会更新需求把社区的最新feature移植回这个版本,所以不能完全看内核版本号。红帽公司是这个星球上Linux内核技术最强的公司,所以大家都信任和采用RHEL/centos。


从linux内核社区里直接拿的内核版本,如果要做产品的话,还是需要做额外的测试和优化才能发产品,这也是为什么这么多大大小小的公司都需要建自己的内核团队。


centos 7.4内核源代码下载地址:

http://vault.centos.org/7.4.1708/os/Source/SPackages/kernel-3.10.0-693.el7.src.rpm


大家可以看笨叔的两期关于如何图形化单步调试centos 7内核的视频:


预告片:

https://v.qq.com/txp/iframe/player.html?vid=z05617hy9d3&width=500&height=375&auto=0


Centos/RHEL 7的内核和社区的内核有什么区别?


mmap/munmap接口是用户空间最常用的一个系统调用接口,无论是在用户程序中分配内存、读写大文件、链接动态库文件,还是多进程间共享内存,都可以看到mmap/munmap的身影。mmap/munmap函数声明如下:

 

#include<sys/mman.h>

void *mmap(void*addr, size_t length, int prot, int flags,

           intfd, off_t offset);

int munmap(void*addr, size_t length);

 

1.    addr:用于指定映射到进程地址空间的起始地址,为了应用程序的可移植性,一般设置为NULL,让内核来选择一个合适的地址。

2.    length:表示映射到进程地址空间的大小。

3.    prot:用于设置内存映射区域的读写属性等。

4.    flags:用于设置内存映射的属性,例如共享映射、私有映射等。

5.    fd:表示这个是一个文件映射,fd是打开文件的句柄。

6.    offset:在文件映射时,表示文件的偏移量。

 

参数fd可以看出mmap映射是否和文件相关联,因此在Linux内核中映射可以分成匿名映射和文件映射。

a.    匿名映射:没有映射对应的相关文件,这种映射的内存区域的内容会被初始化为0。

b.    文件映射:映射和实际文件相关联,通常是把文件的内容映射到进程地址空间,这样应用程序就可以像操作进程地址空间一样读写文件。

最后根据文件关联性和映射区域是否共享等属性,又可以分成如下4种情况。

                         表  mmap映射类型


映射类型

私有映射

共享映射

匿名映射

私有匿名映射–通常用于内存分配

共享匿名映射–通常用于进程间共享内存

文件映射

私有文件映射–通常用于加载动态库

共享文件映射–通常用于内存映射IO,进程间通讯


当然这里面还有一个例外,就是fd打开的是设备文件,那么mmap的内容通常不是page cache了,而是DMA buffer或者一段设备驱动使用的物理内存,比如framebuffer驱动。 


read()/write()是如何读取到磁盘内容的?


哈,这个问题相当复杂,但是也是很有意思的一个问题,用户空间的read()/write()函数读写一个普通文件(假设文件系统是ext4,存储介质是emmc),那在Linux内核里是怎么一步一步的实现把磁盘的文件内容读取出来的呢?

 

这里面涉及的模块很多,比如系统调用,VFS虚拟文件系统,page cache,ext4文件系统,block layer,block调度,mmc驱动,emmc驱动等。

 

笨叔在几年前画了一个图,希望对大家有帮助。



欢迎订阅第一季旗舰篇



           

                笨叔的微信公众号


迈向百w年薪,只差您一个拍打!


淘宝店地址:shop115683645.taobao.com

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存