- 博客(30)
- 资源 (15)
- 收藏
- 关注

原创 内核进程(四) —— 撤销
内核进程实现本文章基于 Linux 2.6.11 编写每个进程都有生命周期,对于用户态进程,当程序从 main() 函数中返回或直接调用 exit() ,由或者进程接收到了不能处理、忽视的信号时,进程就会被终止。当这些进程“死”了后,内核必须能够回收他们的资源,比如内存、打开的文件等等。内核提供了两种终止进程的方式,系统调用 exit_group() 终止整个线程组,由内核函数 do_exit_group() 实现,标准库函数 exit() 就是以此实现;系统调用 exit() 终止线程组中的单个
2020-09-02 19:25:44
626

原创 内核进程(三) —— 创建
内核进程实现本文章基于 Linux 2.6.11 编写创建进程通过上一篇的讲解,我们已经明确了,所有进程都是有 0 号进程或其子孙进程 克隆 而来。传统的 Unix 操作系统以统一的方式创建子进程:子进程复制父进程的所有资源,这种方式效率低下,而且大部分时候新创建的子进程会立即执行 execve() ,将从父进程拷贝而来的进程空间全部替换。现代的 Unix 操作系统以下面机制来提高创建效率和丰富使用方式:写时复制技术,当某个进程创建新的子进程后,父子进程以只读的方式共享整个进程空间,当任
2020-08-31 11:35:35
998

原创 内核进程(二) —— 0号与1号进程初始化
内核进程实现本文章基于 Linux 2.6.11 编写内核栈每个进程的执行流都需要一个栈空间来保存代码执行时所有上下文,包括变量地址和上层函数地址等,在内核态,这个栈就是内核栈。Linux的进程切换还需要使用汇编手动的将一些寄存器值存放在内核栈中,内核栈由以下结构体定义给出。#define THREAD_SIZE (8192)union thread_union { struct thread_info thread_info; unsigned long stack[THREAD_SI
2020-08-12 18:36:16
585

原创 内核进程(一) —— 基本组织结构
内核进程实现本文章基于 Linux 2.6.11 编写进程与线程任何操作系统都离不开进程这个基本概念,它是程序执行时的一个实例,包含了描述程序执行到何种程度的数据结构的汇集,并且有生命周期,他们能被其他的进程创造出来,然后运行(存活)、退出(死亡)。从内核来看进程是分配系统资源(CPU时间、内存等)的实体。一般情况,当一个进程被创建时(通过 fork() 系统调用),他几乎与其父进程相同,是父进程的一个拷贝,并从 fork() 下一条语句开始执行。尽管父子进程共享正文段,但数据段是独立的(堆栈数
2020-07-17 18:36:48
436

原创 内核中断与异常详解
内核中断以32位的2.6.11版本来讲解处理中断的代码其实不是一个函数,为了区分开,文章用 中断例程 表示中断定义中断被定义为一个事件,该事件可以改变CPU指令的执行顺序。这个事件与CPU内部产生的电信号相对应。中断可分为:同步中断(异常)由CPU指令产生,只能发生在一条指令执行之后。它通常由程序错误产生,通常通过内核发出Unix信号来处理,比如除0;或者由内核必须处理的异常产生,比如缺页和系统调用。异步中断(中断)由物理设备产生,随时可能发生在每条指令执行之间。通常由外部硬件产生,用
2020-06-30 18:42:38
1537

原创 内核物理页管理 —— 伙伴系统
内核物理页管理 —— 伙伴系统在阅读此文章之前,你必须了解内核的页与页表的概念,而且最好能了解虚地址的分布。内存管理模型的抽象这部分内容在 内核页表的初始化 已经介绍过。伙伴系统依附于 节点描述符,换句话说每个节点都有一个页分配器入口。下面先从相关数据结构的初始化开始介绍,然后再是伙伴系统的算法介绍。节点描述符初始化内核在完成页表的初始化后,就可以初始化节点描述符了,应该这部分虚地...
2020-03-25 12:28:44
726

原创 内核页表初始化
内核内存初始化暂时用 2.6.11 x86 平台的内核来做讲解。从 bois 中获取各种配置信息,我也不懂,所以仅介绍结果该篇文章已假设你了解了内核的内存总体的分布,如果没有请参考我的这篇文章物理内存分布首先可用的物理内存(地址)不是连续分布的,有很多空洞。因为这些空洞要么不可用,要么被其他外设占用,所以在内核初始化时,必须从bois中获取可用于物理内存。另外由于内存只识别 4K...
2020-03-21 13:04:15
704

原创 内核缺页原理简介
页管理与缺页零页是操作系统镜像中一块不可写的静态内存区域,其虚拟地址是页对齐的。所有进程都使用这个页,因为进程在没有写数据时,读出的数据是不定的,指向同一个页,节约了物理内存概念缺页是操作系统为进程的虚拟内存动态的提供物理内存的一种方式。当CPU访问虚拟地址时,通过页表映射物理内存的过程中,如果发现页表匹配当前的操作,但没有实际的物理内存,就可以动态的为进程调配一页物理内存;当...
2019-02-16 12:23:10
2042

原创 内核内存回收原理简介
页框回收与交换概念内核在为进程服务的过程中会分配大量的页,但是这些页对应的虚拟地址在进程的生命周期里一直会被断断续续的访问,所以当内核同时为大量进程服务时,内存终究会耗尽。所有页框回收就是在内核未耗尽内存之前(因为回收与交换也会使用内存),将在使用过程标记未访问不频繁的部分内存换出到磁盘,释放所占用的内存补给系统,以维持内核的正常运转,待被换出的页对应的虚拟地址再次被访问时,内核又通过缺页系统...
2019-02-16 12:22:35
1396
2

原创 Linux内核API手册——简略版
Kernel API寻址页表与页TLBNODE、CPU与寄存器寄存器操作CPU特性PerCPU变量操作CPU位掩码NODE操作内核同步内核抢占原子操作位锁内存屏障自旋锁位图操作顺序锁信号量PerCPU 读写信号量完成变量中断操作工作队列等待队列内存管理物理页管理非整页内存管理非连续内存管理时间管理节拍软定时器...
2019-02-15 14:41:37
9836
1

原创 flex与bison
flex与bisonflex与bison简介词法分析与语法分析flex用作词法分析,而bison用作语法分析。词法分析把输入分解成一个个有意义的词块,称作token;语法分析则确定这些词块彼此之间如何关联(使用语法树表达)。比如:A = B + C;flex将其分解成A、=、B、+、C和;;接着bison将其确定为一个表达式,并对其建模成表达式树,简化如下 ...
2019-02-15 14:20:22
14335
原创 内核内存分配器 —— SLUB分配器
内核内存分配器源码将以 2.6.24 版本来讲解,slub 分配器从 2.6.22 版本开始引入内核按页来管理内存,但是内核在运行期间还需要小于整页的小内存,所以 Linux 内核通过对 solaris 开发 Slab 分配器进行优化,开发了3种小内存分配器,分别是 slab、slub、slob 分配器。slob 分配器主要用于移动平台,其特点是分配器本身使用内存很少;slab 是最初的非...
2020-04-03 00:46:10
443
原创 最小堆定时器 —— 优化
定时器优化多路复用本质上为了多个任务可以把一个线程作为运行上下文,减少线程的创建,从而减少上下文的切换,有利提高性能。全局容器为了更好的使用多核的性能,我们将在每个核上设置一个全局的变量,然后使用散列方式将排队的定时器分发到响应的堆容器中。/*我们使用一个宏来控制个数,这样很容易通过编译来控制数量*/struct ev_loop ev_loops[NR_CPU];现在需要一个分发的辅...
2020-02-05 15:01:23
679
原创 定时器 —— 库的设计
定时器 ———— 设计这是一篇启发式的文章,重在介绍设计一个功能库的步骤。我们在开发一个功能库的时候,不能一开始就胡乱的开始编码。最基本的必须要想清楚,你想让库的使用者如何使用这个库。所以在开始编码前,必须尝试来写一个定时器的应用。定时器语义定时器的作用是在未来某个时刻执行某项任务,在程序里就是运行一个函数;然而当我们启动定时器后,由于各方面的条件影响,需要取消定时,或修改定时(提前或...
2020-02-04 00:40:27
271
原创 最小堆定时器 —— 实现
最小堆定时器我们将使用内核现有的数据结构和同步结构的 API 来说明怎样设计一个最小堆定时器,并扩展语义。内核在 2.6.16 就已经使用最小堆实现了一个叫着 hrtimer 的定时器,但是语义较复杂,我们将使用它的一些现成的数据结构和辅助函数来实现 timer_list 定时器。最小堆定时器队列最小堆数据结构的语义是有序的、线性的数据结构,“最小”的成员在容器的前端。在 内核定时器 一文中...
2020-02-03 17:29:07
865
原创 内核定时器 —— 时间轮算法
内核定时器2.6 的内核概述内核通过时间轮算法实现一个精度固定的定时器,这个精度由时钟中断和软频率 HZ 决定。定时器运作的基本流程:在每次(时间)中断触发后,执行各种软中断,其中包括定时器软中断。检查时间轮中的定时器是否超时,如果超时则运行其回调。初始化内核在 start_kernel() 中初始化定时器子系统:void __init init_timers(void)...
2020-01-28 19:55:22
675
原创 从内核 skb 看C语言的面向对象
container_of() 指针运算内核虽然是C语言编写的,但是运用了大量面向对象的思想,封装性非常好。得归功于一个叫 container_of() 的指针运算宏的功劳。该宏展开后:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)#define container_of(ptr, type, memb...
2020-01-18 18:41:41
462
原创 Linux内核编程:实现断言
断言定义断言是非常常见的,其语义就是判断某个条件,如果不为真,就执行一段非常规的动作,一般为程序立马结束运行。分类断言分为动态和静态的。动态断言也叫运行时断言,即在程序运行的使用,由比较指令来判断条件;而静态断言是在代码的编译过程中,通过编译器对常量表达式的计算来判断条件成立与否的,即一般不会生成额外的代码。实现静态断言一般我们在没有编译器特性支撑的情况下,可以使用C语言的语法语义...
2019-03-03 23:28:16
1930
原创 内存寻址
内存寻址概述当通过逻辑地址访问物理地址时,内存管理单元通过分段单元将逻辑地址转换为线性地址,再通过分页单元将线性地址转换为物理地址,这一个过程就是保护模式下的地址转换。硬件中的分段段选择符(Selector)与段寄存器一个逻辑地址由两个部份组成:段和和段内偏移。其中,段可以用一个16 位的段选择符来表示;而偏移,则可以用一个 32 位的变量来表示。具体逻辑地址的字段和位如下图: ...
2019-02-16 12:29:52
869
原创 Linux2.6内存布局笔记
内存布局本篇笔记讨论x86结构体系的内存布局概述Linux以分段加分页的方式管理和访问内存,通过分段将逻辑地址翻译成虚拟地址,再由分页将虚拟地址翻译成物理地址,从而访问内存。一般概念逻辑地址包含在机器语言指令中,用来指定一个操作数或指令的地址。编译器把程序分成多段,每个逻辑地址由一个段和偏移量组成,偏移量指明从段开始的地方到实际地址之间的距离。虚拟地址虚拟地址也称线性地...
2019-02-16 12:29:41
365
原创 内核编程入门——模块
内核模块开发准备工作安装开发内核环境yum install kernel-devel,完成后根据下载的版本不同会在/usr/src/kernels/下生成一个类似3.10.0-514.16.1.el7.x86_64的目录。配置编译环境ln -sf /usr/src/kernels/3.10.0-514.16.1.el7.x86_64 /lib/modules/`uname -r`...
2019-02-16 12:29:29
379
原创 中断笔记
软中断软中断的定义中断实际分为两个部分,硬中断和软中断。由于处理器要及时的响应处理外设的中断请求,但是外设中断请求可能需要消耗一定的时间才能完成,所以不能处理器一直工作中断函数中,这时就可以以软件的方式模拟一个中断,继续处理未完成的工作,这就是软中断。软中断用于处理费时费力的任务。软中断的触发由于软中断本身就为异步执行设计的,所以可以在其他很多地方使用,不仅是只在硬中断后续处理外设中断任务...
2019-02-16 12:29:10
227
原创 OpenMP
OpenMP介绍代码片段#include <stdlib.h>#include <stdio.h>#include <omp.h> // OpenMP编程需要包含的头文件int main(){#pragma omp parallel for for(int i = 0; i < 10; ++i)
2019-02-16 12:28:04
702
原创 GCC特性笔记
GCC特性和选项GNUC 版本要求判定 #if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16)
2019-02-16 12:21:38
623
原创 中断实验
硬中断简单编程测试目标掌握request_irq()的使用掌握free_irq()的使用在模块中以共享的方式注册一个中断以模块变量对中断发生进行计数通过模块变量关联的文件的内容观察结果源码 #include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>...
2019-02-15 14:45:46
413
原创 内核编程入门——编译内核
Linux内核编译安装笔记内核版本与下载版本号 4.9.16下载地址预备知识menuconfig与MakefileLinux内核根目录下的scripts文件夹scripts文件夹存放的是跟make menuconfig配置界面的图形绘制相关的文件arch/$ARCH/Kconfig文件、各层目录下的Kconfig文件用于不同硬件平台生成整个配置界面选项(Kconfi...
2019-02-15 14:44:21
564
原创 动态和静态的增加系统调用
静态增加系统调用暂时只适合4.6以下的内核核心思路通过增加系统调用号和系统调用函数来新增系统调用修改文件向量文件修改 arch/x86/entry/syscalls/syscall_64.tbl,增加一条向量条目,格式如下:<syscall no> <abi> <name> <entry>比如 0 common read sy...
2019-02-15 14:16:09
477
原创 Linux4.x内存布局
内存布局 4.9.16 Linux 64bit0xffffffffffffffff ---+-----------+-----------------------------------------------+-------------+ | | ...
2019-02-15 14:08:52
488
原创 Linux2.6内存布局
内存布局 2.6.11 Linux 32bit假设有4个节点。假设有大于896MB的内存。除node0外,其他的每个node所占的空间为:size = (node_end_pfn[nid] - node_start_pfn[nid] + 1) * sizeof(struct page) + sizeof(pg_data_t)node0所占的空间为它所管理的页描述符的空间(node_e...
2019-02-15 14:07:34
283
原创 自我介绍
小子不才,巴蜀人士是也,姓周名凯,无字无号,生于丙寅年,于世虚度二十有八年矣。甚幸,吾父不惑之年独得吾一子,长于农家,少时家贫,然敏而好学,是为父母先生之喜好。后因散惰顽烈,未能熟读圣贤之书,以至学识浅薄,两度考取功名,皆得专科之列。哀哉!吾大学之时未牢记父母兄长之训,玩物丧志,好网游魔兽是也,未能学得一技之长,虚度三载有余,男女之事更未尝之,此乃一生憾事。吾初入社会,以薄禄混迹于沿海,...
2019-02-15 14:04:17
404
1
OCI-V7操作封装
2013-05-30
c语言解析csv,oracle_oci接口封装
2012-05-15
Ext3.0中英文对照文档
2010-04-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人