技术沉淀分享

Thinking will not overcome fear but action will.

linux系统下free命令内存计算逻辑

linux系统下free命令内存计算逻辑

本篇文章介绍下linux下free命令展示的内存相关计算逻辑。本文比较简单(是的,也比较水),主要是做一个抛砖引玉的作用,后续将系统介绍linux内核的内存管理模块。 free命令对应的源码是 https://gitlab.com/procps-ng/procps,其中free.c文件是free命令对应的源码部分。由于现有机器安装的都是3.3.10版本的procps,因此我们下载v3.3....

linux文件系统之page cache

linux文件系统之page cache

在上一篇分析了VFS的读过程,其中在函数generic_file_buffered_read()里有一段代码: struct address_space *mapping = filp->f_mapping; struct inode *inode = mapping->host; f_mapping对应的就是文件file在内存的信息,即page cache的数据结构。...

linux内核VFS之write

linux内核VFS之write

今天主要看下VFS的write()函数逻辑是怎么实现的,write()函数在内核里的定义入口文件在fs/read_write.c,具体如下: SYSCALL_DEFINE3(write, unsigned int, fd,const char __user *, buf, size_t,count) { returnksys_write(fd, b...

linux内核VFS之open

linux内核VFS之open

很久没有写文章了,这是2021年的第一篇文章,主题还是linux内核相关的,接着之前的VFS继续介绍open相关内容。内容比较简单,没有很详细&深入介绍每一个内容。 Linux的open也是通过系统调用进入到内核态,其中内核里的定义入口文件在fs/open.c,具体如下: SYSCALL_DEFINE3(open, const char __user *,filename, in...

linux内核的current

linux内核的current

Linux内核有个宏叫current,记录当前执行的进程信息。current定义在arch/x86/include/asm/current.h文件中。 从定义可以看出,current对应宏实现是get_current(),而get_current()函数返回的是task_struct结构的指针,即当前执行的进程描述符。 DEFINE_PER_CPU(struct task_struct...

linux内核VFS之read

linux内核VFS之read

今天我们看下read过程。从系统调用,到读取文件内容是怎么样的过程。 接下来看下如何根据fd获取files 接下来看下__fcheck_files函数逻辑: 从上面逻辑可以看到fcheck_files函数核心就是检查fd是否超出max_fds 根据fd找到file之后,接下来就是从file读取数据。即ret = vfs_read(f.file, buf, c...

linux内核VFS之系统篇

linux内核VFS之系统篇

对linux有了整体了解之后,接下来就是针对各个子系统逐个深入研究摸索了。^-^ 这次先从VFS入手, 其实很多子模块都和进程关联的,所以我们在分析子模块的时候可以从进程入手,从进程的什么地方开始呢?当时是数据结构task_struct。 首先看下task_struct结构里的files、fs和mount定义。fs_struct定义了和文件系统相关的数据结构,例如根目录、当前目录、所属...

聊聊进程的priority和nice

聊聊进程的priority和nice

在学习和实际工作中,经常会遇到进程的priority和nice,之前就一知半解,所以抽空又重新学习整理了下进程的priority和nice到底是什么意思,以及两者之间的关系。 首先要说起实时进程和非实时进程,系统(即内核)区分进程是不是实时进程是通过task_struct的policy进行区分,policy的取值如下: 其中,SCHED_NORMAL和SCHED_BATCH表示非实时进程...

linux虚拟化之KVM

linux虚拟化之KVM

本文主要介绍linux虚拟化中的kvm部分。也是linux虚拟化三部马车里的最后一部。 当qemu执行kvm_vcpu_ioctl()时,进入内核态函数。具体切换至内核态是通过ioctl系统调用执行的。 ioctl系统调用sys_ioctl->ksys_ioctl->do_vfs_ioctl->vfs_ioctl->unlocked_ioctl->kv...

聊聊kmalloc机制

聊聊kmalloc机制

本文主要分析linux内核内存分配方法kmalloc的实现逻辑,并且在CONFIG_SLUB条件下。 先看下kmalloc函数定义: 如果申请的大小超过KMALLOC_MAX_SIZE最大值,则返回NULL表示失败;如果申请大小小于192,且不为0,将通过size_index_elem宏转换为下标后,经size_index全局数组取得索引值,否则将直接通过fls()取得索引值;最后...