- 博客(473)
- 资源 (53)
- 收藏
- 关注
原创 xarray 简易体会与实现
体会源码中规律,范围索引 [0…最大的阻碍应该是内核使用 xarray 结点地址低 2 位用作了判断该结点是否位中间结点等用途 —— 内核可保证低所分配地址以 4 字节对齐,而用户程序中的内存分配不能保证。如当 xarray 结点槽位数为 64,存 2GiB 数据时,xarray 层级高度为 5,二叉树层级高度为 30。以 xarray 各层级结点最右侧有值槽位向下层索引子结点方式可找到 xarray 中的最大索引。为 xarray 结点槽位数,这便是 xarray 根据索引值映射目标值的基础规则。
2023-08-15 23:04:22 603
原创 用户程序内存分配缓存简易实现
应用程序内存缓存简易实现。用于尝试解决在内存分配偶现耗时问题。memca 不要求额外内存用于此处管理正因为如此,所缓存内存单元最小为指针大小(sizeof(void *))
2023-07-19 00:01:13 1267
原创 用于挂载管理复合类型的双向链表实现
若将双向链表结点作为相同或不同 C 复合类型的一员,然后将复合类型中的各链表结点关联成双向链表,从而间接将复合类型变量以双向链表方式进行了管理。对于大部分双向链表结点的操作都比较高效——甚至不需要判断语句。在合适场景下如此使用双向链表结点,可算得上轻量优雅。/** * 根据结构体类型 type 中的名为 mn 成员的地址 ma 获取 * type 结构体类型变量的首地址。*/#define DL_START_ADDR(ma, type, mn) \ ((type *) (((char *)
2022-05-04 22:12:17 612
原创 内存字典实现
此内存字典基于哈希表实现,适用于不明确具体数据量场景。1 结构体定义先想好功能,然后根据该功能想想需要哪些结构体来辅助实现该功能。#define DICT_FLAG_FREE (0x01)#define DICT_ITEM_EXIST (0x43)#define CMIN(a, b) ((a) < (b) ? (a) : (b))#define CMAX(a, b) ((a) > (b) ? (a) : (b))#define CIF_RETURN(exps, ret) ({
2022-05-04 21:54:27 494
原创 跳表与模型补偿实现
跳表弱试到了我这般码龄,再记录代码直接相关篇的文章是很难的,有很多难述清楚的原因。可今天起的太早花了一部分时间做了其他事情,剩下的时间不足以再做点其他的事情,不如……记录一篇?就选择跳表实现吧——记录跟实现顺序有差异。1 跳表个人弱理1.1 最大高度/** * [1] 跳表最大高度 * 设层级增长概率为 P , * 结点在层 L 的概率为 P^(L-1) * 当跳表拥有 N 结点时 * 层 L 结点数的期望为 N * P^(L-1) 。 * 层 L 有结点需满足 N * P^(L-1
2022-05-03 08:06:07 370
原创 NVDIMM编程模型原理大概推导梳理
NVDIMM 简介NVDIMM(Non-Volatile DIMM) 非易失性DIMM(Dual In-line Memory Module,双列直插式内存模块),即- 掉电不丢失数据;- 兼容 DIMM 插槽(通过插入内存条插槽接入计算机使用);故俗称 pmem(persistent memory)。NVDIMM 编程模型原理梳理原理上 NVDIMM 可直接作为一段物理内存使用——就像一块 DRAM 一样,此时可能需要注意- NVDIMM 比 DIMM 还是要慢一些;- NVDIMM 不
2021-12-26 01:21:58 994
原创 C函数尝试匹配
C函数尝试匹配不知缘起何处,如今已草草写了一个C函数尝试匹配工具。它大概可以从能通过编译的纯C源文件中匹配出C函数定义——即匹配C函数定义因子修饰 返回值类型 函数名 参数列表的自由组合模式。可以用它来支持一些不太重要的偷懒行为:声明单元测试函数全覆盖对于C函数定义因子自由组合模式的匹配大概有以下两种困难:C函数体能产生极大干扰,处理策略是跳过函数体。注释、引号会产生干扰,处理策略是删除掉它们。以 ln_co.c 为靶子试试它的成色。1 作声明1.1 匹配函数定义$ awk
2021-11-06 23:32:29 211
原创 电因 电呈现 电用
电描述的是两种物质1之间的作用力。大自然将二者及其作用力束缚在另一种物质2内,然后结合其他及该物质形成更大的物质结构,以此类生……一步一步构成很多种类的物体 —— 人、云、树、石头…… 即大自然中众多物体内部束缚着电。在束缚方面,不同物体对电的束缚能力不同3。在达到各自物体破坏束电能力条件4时,物体内部产生电的两种物质分离而各自聚集,从而电性得到宏观对外呈现 —— 对另一种包含1处物质的物体产生作用力。电的功能取决于被施与物体特性 —— 将电施加于点灯,电灯将发热发亮;将电施加于人,人将会有“触电”、
2021-06-09 22:43:37 330
原创 记录一种在C语言中的打桩实现及原理
1 场景考虑一个由多个模块组成的工程,如.└── wsw ├── m1 ├── m2 └── ...假设 m2 中的接口会调用 m1 中的接口。当要初步验证 m2 中各接口功能时,由于 m1 中各接口的运行往往依赖 m1 模块上下文(而在验证 m2 时往往不想参与 m1 模块的流程),此时需模拟 m1 接口所产生的数据。一种直接的方法是新建 m3 模块,并在其中重新编写 m1 中的函数用以产生模拟数据,再编写一个新的工程管理文件将 m2 和 m3 整合成一个可执行文件。
2020-10-18 19:06:51 2560
原创 windows VSCode 远程开发配置参考
windows VSCode 远程开发配置参考1 VSCode的下载与安装官网下载并安装VSCode。2 基础插件安装通过快捷键 “Ctrl + Shift + X” 或点击左列的扩展图标(由四个小方块组成)打开插件安装窗口栏,在搜索栏中搜索并安装以下插件[1] Remote Development[2] Remote-SSH按照开发需求可选择安装[3] Chinese (Simplified) Language Pack for Visual Studio Code插件安装后,点击插件“
2020-08-29 10:43:44 652
原创 C volatile 使用基础理解
C语言中的volatile由编译器处理,他告知编译器1 每次访问由 volatile 修饰的变量皆在内存/缓存层面/* vol_var.c, * gcc -O3 -S vol_var.c */volatile int flag = 0; | | void _co_fn1(void) | _co_fn1:{ | .L3: while (!flag) | movl fl
2020-06-15 18:09:04 593
原创 11 linux011用于进程共享资源的睡眠与唤醒
用进程调度状态、进程调度和一个指向上一个睡眠进程PCB的指针实现了进程在共享资源时的睡眠等待与唤醒机制,分别包装成睡眠和唤醒两个函数。此机制的实现非常简单,但不太容易被理解。1 进程等待资源的睡眠[1] 初始一个用于某资源共享的PCB指针为NULL,表征之前无进程睡眠等待;[2] 在睡眠函数栈中保存该PCB指针,置PCB指针指向当前进程的PCB;置当前进程状态为不可调度状态,随即调度进程调度函数完成进程调度;[3] 在调用进程调度函数之后唤醒(置回可调度状态)栈中所保存PCB所指进程。这个过程有
2020-06-04 13:21:16 393
原创 10 linux011子进程创建和多进程调度开销分析
1 子进程创建的主要过程(1) 执行int 80h指令进入系统调用fork();(2) fork()[1] 为子进程搜索唯一进程号(PID)和空闲的进程管理结构体(PCB,包含TSS);[2] 继承父进程管理结构体部分属性,共享父进程下的全局数据(如文件),初始化子进程的TSS;计算子进程的逻辑内存空间,以设置子进程的LDT,并在GDT中设置子进程TSS和LDT的描述符;[3] 为子进程分配页机制相关数据结构体(如页表目录项、页表和页表项)——映射为父进程的物理内存页(写时拷贝共享的物理内存页),
2020-06-03 22:53:03 587
原创 09 linux011系统调用开销分析
1 系统调用主要过程(1) int 80h保护模式下执行int 80h指令的过程比较复杂[1] CPU 根据中断号 80h 和 IDTR(IDT内存地址) 读取描述符 IDT[80h] (并作有效、特权级等检查);[2] CPU 根据 IDT[80h] 描述符中的 GDT 选择符(s)和 GDTR(GDT内存地址)读取段描述符 GDT[s](并作有效、特权级等检查); IDT +==+ logic memory addrIDTR[1]|..|
2020-06-03 22:52:20 746
原创 08 linux011进程调度
1 linux 0.11 用户进程调度时机[1] 主动请求调度(如调用 pause );[2] 进入系统调用时内核资源不够,则主动睡眠当前进程并调度其他进程运行,当内核资源可用时被唤醒,从而再次进入能被调度的状态;[3] 在定时器中断中,当前进程时间片运行完毕时;[4] 系统调用结束时检查当前进程已进入不可运行状态。2 调度策略[1] 遍历管理进程的所有数据结构体, 检查各进程所设置的报警是否超时, 若超时则为当前进程设置报警超时信号。若当前进程有可被处理的信号且处于可被唤醒状态则置该进程为可调
2020-06-03 22:51:27 350
原创 07 linux011字符设备管理
1 与字符设备的大体交互过程(如UART)[1] 写操作IO 端口指令 |[0] V +---+ [1] 命令 +----------+ | |--------->|UART控制器|[2] 命令接收与执行 |CPU| | | | | [3] 中断 | | +---+<---------+----------+ |[4] V中断处理程序[2] 读读一般由字符设备主动发起中断触发CPU调用相
2020-06-03 22:50:39 364
原创 06 linux011块设备管理
1 与块设备交互的大体流程(如硬盘)IO 端口指令 |[0] V +---+ [1] 命令 +------------+ | |--------->|块设备控制器|[2] 命令接收与执行 |CPU| | | | | [3] 中断 |块设备存储器| +---+<---------+------------+ |[4] V中断处理程序2 与块设备交互涉及到的抽象层次linux 0.11 没有直接跟块设备的交
2020-06-03 22:49:56 350
原创 05 linux011中断
1 中断源此文将触发 CPU 引用 IDT 描述符的方式总结为两种。[1] CPU执行 int 一类指令。[2] CPU在完成某条指令的执行后, 接收/检测到某中断(或异常)信号时。2 中断过程CPU 执行 int 指令或检测到中断信号时具体引用哪一个 IDT 描述符呢。[1] CPU执行 “int n” 指令时将其操作数 n 用作引用IDT描述符的索引, 即引用 IDT[n]。[2] IDT[0…16]是 Intel 在硬件层面为 CPU 分配的 IDT描述符, 即当CPU检测到这17个中断
2020-06-03 22:49:07 343
原创 04 linux011缓冲区
1 缓冲区位置+-------------+========+------------+-------------+| OS routines | BUFFER | [RAM-DISK] | MAIN_MEMORY |+-------------+========+------------+-------------+0x0 end 4Mb 16Mbend 是操作系统内核程序内存段结束位置。linux0.11 引导程序为
2020-06-03 22:48:15 346
原创 03 linux011文件系统(minix).md
1 磁盘上的文件系统结构+------+------+-------------------+---+-------------------+| boot |supper|minix file system 1|...|minix file system x|+------+------+-------------------+---+-------------------+引导块 - 包含分区表,可包含引导程序;分区表描述了各文件系统起始位置,结束位置等信息。超级块 - 各分区文件系统结构信息
2020-06-03 22:47:19 496
原创 02 linux011内存管理
CR0.PG=1将开启内存页机制,由CR3保存内存页机制相关数据结构体的内存地址。1 页表目录页表目录用于索引页表,在页表目录中用于索引页表的信息被(此文)称为页表目录项。+---------------------+|page table dir item 0|+---------------------+|page table dir item 1|+---------------------+| ... |页表目录项|31
2020-06-03 22:45:27 305
原创 01 linux011 引导和保护模式的初始设置
1 引导程序位于引导块的引导程序由 BIOS 加载到实模式下的[0x7c00, 0x7e00)内存段,若检查到引导程序最后两个字节为0xAA55则跳转执行[0x7c00, 0x7e00)内存段的引导程序。引导程序的主要工作是将后续操作系统程序拷贝到内存中。linux0.11 引导程序执行完毕后,内存分布大体如下。0x00000|----------------------------------| | 1KB RAM | |
2020-06-03 22:43:56 354
原创 一种在C语言中用汇编指令和 System V ucontext 支撑实现的协程切换
1 实现内容此文在看了 python yield 和 yield from 机制后,觉得这种轻量级编程技术在小并发场景下优雅可爱,在大并发场景下较进程或线程而言能突破资源瓶颈,实在令人忍不住而想在C语言中实现一个。然后经过一些学习后,此文就在 Linux 上用C语言实现了一个。目前具体包括[1] co_yield() —— 类似 python 的 yield,用于协程切换;[2] co_s...
2020-03-04 17:55:29 4156
原创 一种添加汇编指令支撑协程上下文及协程切换的实现
1 操作栈的数据结构体typedef struct asm_cctx_s { void **sp;} cctx_s;这个数据结构体来自 https://github.com/ramonza/libcoro。除 cctx_s 的可扩展性外,此文也非常喜欢其使用二级指针 sp 操作栈的方式,所以将其延用。2 协程上下文切换协程切换涉及相应寄存器的备份、跳转地址的安排等内容,凡是需要...
2020-02-11 19:09:20 7235
原创 一种在C语言中用 System V ucontext 所实现协程切换的优化
序前段时间,此文的电脑被人霸占做PPT去了。是的没错,霸占。那些夜晚只能喝着一碗醪糟水并尝试阅读李娟的散文。随着翻页篇章稍厚,再一次陷入对其文字的带着羡慕的欣赏之中。这些与描述内容具天生契合性的文字竟间接地鼓舞着心灵不为小事而偏离善良。这些由一针一线编织在箱底的珍宝,真令人赞叹。于是想到优化“一种在C语言中用 System V ucontext 实现的协程切换”的事。此种激励或许是此文对这个...
2020-01-14 23:18:53 6962
原创 一种在C语言中用 System V ucontext 实现的协程切换
A coroutine switching implement by ucontext in C-language1 python 协程原理尝试了解上篇文字“一种在 python 中用 asyncio 和协程实现的IO并发”中协程的基本原理。python 协程可基于其生成器实现,其生成器由 yield 和 yield from[^1] 标识。1.1 yield在实例化对象时,python ...
2020-01-01 23:41:46 6937 3
原创 一种在 python 中用 asyncio 和协程实现的IO并发
1 此篇文字围绕的主题基于IO驱动程序[^1],本机从IO读取或发送数据——读/写IO的有效方法。+--------------------------+ +----+| | +==>| || +--+ +---+ | | +----+ 1| +-----+ | | | I...
2019-12-15 15:30:34 7156
原创 haribote&&linux0.11并发笔记整理抽取
1 初识并发“在一段时间内,多个进程(线程)都被CPU执行”是并发初期更被广为流传的定义。跟众多其他计算机技术一样,并发也得到了扩展。此文先从CPU进程特例层面认识并发。p1 -=. =. =. =. =. -.p2 -. =. =. =. =. =- | <--concurrency--> |p1,p2: 进程1,进程2;= : 进程...
2019-11-06 23:08:33 6772
原创 haribote&&linux0.11内存地址转换笔记整理抽取
haribote和linux0.11由Intel 80x86 CPU执行,程序需契合该CPU对外提供的编程机制才能使用其相应功能。此文意在总结下x86 CPU对外提供的内存地址转换机制。1 逻辑层面总结CPU执行内存中可执行程序过程|--------| 0____________ |----------------------|| PC | ------------> | ...
2019-11-06 23:06:47 6780
原创 haribote&&linux0.11引导程序阅读笔记整理抽取
工作日每晚平均两小时周末全勤的那段日子是此文阅读h&&l源码的全部生命力,一些见过这样我的人可能会说他除此外似已无其它爱好。此文也很绝望啊,因为h&&l只有少数模块仅会花一两晚时间,其余需要此文花一周,两周,三周……时间的阅读量,所得到的以注释为主的笔记也普遍繁长。此文若在一些人面前主动提到这些笔记,会预先重复承认其当真繁长的话语,因为他们当真繁长啊。就像网上曾...
2019-11-06 23:01:44 6800
原创 haribote && linux0.11源码阅读笔记
在碚大时此文曾想象,若类似haribote&&linux0.11的作者从小被熏陶的核心是文字或医术,他们应该也会成为真正出色的诗人或医生。宇宙间渺小的清晰之物是否都跟他们那样源于健康 深厚底蕴的素养相关?还能看见窗外绿叶翻动后花苞的生长就代表着此文对这种气息还持续着迷恋。这种想象和迷恋是在 阳光纯粹穿透力强 星月明亮温婉 还没有真正开始讨生活 同时坚信着与众不同的自由并拥有那么多期...
2019-09-22 20:19:45 7200
原创 haribote系统调用 工程管理及应用程序阅读注释
haribote;OSASK;系统调用;工程管理;Makefile;make;应用程序ipl09.nasasmhead.nasbootpack.c(HariMain)dsctbl.cmemory.cint.ctimer.cfifo.ckeyboard.cmouse.cgraphic.csheet.cwindow.cfile.cmtask.cconsole.cnaskfunc.nas(tek.c)bootpack.cbootpac
2019-09-15 15:18:28 8061
原创 haribote bootpack.c 主任务程序代码阅读注释
haribote;OSASK;bootpack.c;HariMain;主程序;主任务程序/* HariMain, * haribote OS C主程序入口,从asmhead.nas中跳转而来。*/void HariMain(void){ /* 以 struct BOOTINFO 类型访问 ADR_BOOTINFO * 内存段即获取显卡信息参数所在内存段基址。*/ struct BOOTINFO *binfo = (struct BOOTINFO *) ADR
2019-09-08 14:23:52 7214
原创 haribote naskfunc.nas 汇编函数接口程序阅读注释
haribote;OSASK;naskfunc.nas;汇编指令;; naskfunc.nas, 将只能用汇编语句实现或更益用汇编语句实现的功能; 通过汇编子程序提供给C程序调用,所有的参数都通过栈传递。现在常; 用的编译会适当选择用寄存器传参, 都通过栈传递参数可能是作者根; 据当时需要而改写gcc 编译器所得到的结果。该编译器在将 C全局标; 识符转换为汇编标识符时,会自动在C全局标识符前加'_'前缀。
2019-09-08 10:52:25 7400 3
原创 haribote dsctbl.c 设置GDT和IDT程序阅读注释
haribote;OSASK;dsctbl.cvoid init_gdtidt(void);void set_segmdesc(struct SEGMENT_DESCRIPTOR *sd, unsigned int limit, int base, int ar);void set_gatedesc(struct GATE_DESCRIPTOR *gd, int offset, int selector, int ar);
2019-09-07 22:08:41 7297
原创 haribote console.c 命令行窗口交互管理程序阅读注释
haribote;OSASK;console.c;命令行窗口交互;终端窗口交互;/* console.c */console_task();cons_putchar();cons_newline();cons_putstr0();cons_putstr1();cons_runcmd();cmd_mem();cmd_cls();cmd_dir();cmd_exit();cmd_start();cmd_ncst();cmd_langmode();cmd
2019-09-07 19:51:50 7014
原创 haribote mtask.c 多任务管理程序阅读注释
haribote;OSASK;mtask.c;多任务管理;extern struct TASKCTL *taskctl;extern struct TIMER *task_timer;struct TASK *task_now(void);struct TASK *task_init(struct MEMMAN *memman);struct TASK *task_alloc(void);void task_run(struct TASK *task, int level, int
2019-09-07 18:24:47 7041
原创 haribote file.c 文件读取程序阅读注释
haribote;OSASK;file.c;文件读取;void file_readfat(int *fat, unsigned char *img);void file_loadfile(int clustno, int size, char *buf, int *fat, char *img);struct FILEINFO *file_search(char *name, struct FILEINFO *finfo, int max);char *file_loadfile2(int
2019-09-07 17:51:43 6900
haribote_read.zip
2020-02-12
一个简单C程序的编程简记
2019-02-25
绣花枝&&src;
2019-02-25
后街镐挖锄
2019-02-25
一个简单C程序的编写简记
2019-02-16
pxtcxyczjh-SourceII
2015-09-21
32位限位浮点数乘法器
2015-07-12
to_mdivider
2015-06-26
OSASK源码注释II
2015-05-11
晶振振荡器电路的设计
2014-10-28
ANSI C九九标准
2014-10-21
《Linux C编程一站式学习》
2014-08-16
《The Standard C Library》
2014-06-15
正则表达式或通配符匹配的代码
2014-06-15
Grap-A Language User Manual
2014-04-08
The Secret
2014-03-21
《Cortex-M3 STM32F10XXX参考手册》
2014-03-11
The AWK Programming Language
2014-02-14
more progamming pearls,编程珠玑续
2014-02-07
The C Programming Language
2013-12-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人