国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

从C语言源代码分析,神秘的Linux系统是如何记录

发布时间:2019/08/02标签:   进程    点击量:

原标题:从C语言源代码分析,神秘的Linux系统是如何记录
上一节扼要探讨了下Linux操纵体系中过程的观点,实在简略来讲,过程不过就是处于运转期的顺序及其相干资本的总和。这里读者应当留神“相干资本”一词,Linux 在内核中是怎样记载过程的资本的呢?Linux内核怎样记载过程的资本?起首应当清楚,Linux 内核多数是采纳C言语编写的,因而要弄清晰内核怎样记载过程资本,只要要检查相干的C言语代码便可以了。现实上,Linux 内核是应用 task_struct 构造体描写过程的资本的,它的C言语局部代码以下,请看:

从C语言源代码分析,神秘的Linux系统是如何记录和描述进程的?
task_struct 构造体很长task_struct 构造体很长,在我手中的 Linux 内核C言语源代码中,它占用了280行。固然了,这此中包括许多前提编译局部,在 32 位呆板上,task_struct 大概要占用 1.7 KB 的内存空间,不外斟酌到它能够治理完全的过程,1.7kB 实在并不算大了。鉴于 task_struct 构造体太长,这里弗成能将其成员逐一先容清晰。假如读者和我一样猎奇,大略的扫瞄 task_struct 构造体,应当可能发觉一些比拟使人熟习的成员,比方:
从C语言源代码分析,神秘的Linux系统是如何记录和描述进程的?
task_struct 构造体使人熟习的成员经过C言语解释以及成员的变量名,可能看到 task_struct 构造体包括了文件体系,线程构造体,以及过程翻开的文件等信息,这就与上一节文章的内容对应上了。其余成员在我以后的文章中会波及到,这里暂不赘述。在创立过程时,Linux 经过 slab 调配器调配 task_struct 构造,如许能够幸免静态调配和开释带来的开支,进步内存的应用效力。那末创立 task_struct 构造后,内核怎样拜访它呢?依据我手上的内核C言语源代码,Linux 中另有一个构造体 thread_info,它的此中一个成员 task 指针恰好合适用于索引 task_struct 构造体,在X86_64平台上,thread_info 的相干C言语代码以下,请看:
从C语言源代码分析,神秘的Linux系统是如何记录和描述进程的?
task 指针Linux 平日会在内核栈底或许栈顶保存 thread_info 构造,而内核栈平日巨细都是可知的,因而每个过程都能便利的从本人的栈中找到 thread_info 构造,进而找到 task_struct 构造。查找以后过程的 thread_info 构造,能够挪用 current_thread_info() 函数,它的C言语代码以下,请看:staticinlinestructthread_info*current_thread_info(void){registerunsignedlongspasm("sp");return(structthread_info*)(sp&~(THREAD_SIZE-1));}

版权信息Copyright © IT技术教程 版权所有    ICP备案编号:鲁ICP备09013610号