C
文章平均质量分 65
C语言
Li-Yongjun
这个作者很懒,什么都没留下…
展开
-
EXPORT_SYMBOL 底层原理
编译器会将这些信息放在模块的 .o 文件的 __ksymtab 和 __ksymtab_strings 段中。当内核加载这个模块时,它会处理 __ksymtab 和 __ksymtab_strings 段,将符号注册到全局符号表中。原创 2024-10-28 22:15:00 · 981 阅读 · 0 评论 -
性能优化——避免使用除法
ARM 硬件上不支持除法指令。编译器是通过调用 C 库函数来实现除法运算的,要花费 20~100 个周期。如果不能避免除法运算,那么就尽量使除数和被除数是无符号的整数。原创 2024-03-31 19:54:15 · 546 阅读 · 0 评论 -
GCC 优化等级(O0、O1、O2、O3)对程序性能的影响
O3 直接将内层循环给优化掉了,10 次循环展开成 10 次指令,也是牛逼。这样一来,少了内层循环的边界判断。更重要的是,少一层跳转,就减少一次分支预测判断,这对指令执行的效率有显著提升。原创 2023-10-09 22:05:40 · 4836 阅读 · 0 评论 -
反汇编方法收集
ndisasm、gdb、objdump、radare2原创 2023-05-20 22:15:00 · 915 阅读 · 0 评论 -
内核态栈 && 用户态栈
“用户态栈”只用于程序的函数调用,不参与进程切换或从用户态切换到内核态的相关操作。在进行进程切换或从用户态切换到内核态时,操作系统会使用“内核态栈”来存储关键的状态信息和寄存器值。原创 2023-04-26 23:16:52 · 1661 阅读 · 0 评论 -
linux-0.11 研究
在看源码的同时,如何能够编译、运行,就再好不过了,如果还能调试,那就锦上添花了。原创 2023-04-25 22:03:31 · 1435 阅读 · 0 评论 -
pkg-config
后来,找到了 `pkg-config` 这个绝招,只要一行就解决了我上面的问题。原创 2023-04-17 21:48:19 · 961 阅读 · 1 评论 -
C语言 匿名结构体
匿名结构体只有成员变量,没有结构体名称。原创 2023-04-10 22:44:39 · 2063 阅读 · 0 评论 -
C语言——指针
C语言中,函数的参数传递机制是“值传递”。原创 2022-12-13 00:01:42 · 930 阅读 · 1 评论 -
系统调用应用层 demo
在不同平台,系统调用号是不同的。原创 2022-11-24 00:34:58 · 230 阅读 · 0 评论 -
vscode 阅读 linux kernel 源码
使用 global 工具。原创 2022-11-20 23:23:28 · 4416 阅读 · 3 评论 -
GDB 使用指南
debug 神器原创 2022-10-14 21:58:25 · 447 阅读 · 0 评论 -
链接脚本
“.” 在链接脚本里面叫做定位计数器,默认的定位计数器为 0。我们要求代码链接到以 0x87800000 为起始地址的地方,因此这一行给 “.” 赋值为 0x87800000,后面的文件或者段都会以 0x87800000 为起始地址开始链接。原创 2022-09-11 12:01:06 · 1261 阅读 · 0 评论 -
C语言结构体——指定初始化
一种是通过点号加赋值符号实现,即 .fieldname = value,另一种是通过冒号实现,即 fieldname : value。原创 2022-08-25 22:26:09 · 806 阅读 · 0 评论 -
链接、加载
链接地址 ≠ 运行地址:位置无关码;链接地址 = 运行地址:位置有关码。原创 2022-08-23 23:15:00 · 238 阅读 · 0 评论 -
浅谈哈希表
UT_Hash 是使用 C 语言实现哈希表的一个优秀开源项目。原创 2022-08-13 22:57:14 · 409 阅读 · 0 评论 -
内核动态打印
能够让程序员控制只打印某个文件、某个模块、某个函数的调试信息。原创 2022-08-11 00:31:52 · 1284 阅读 · 2 评论 -
dump_stack()
dump_stack() 能够提高我们分析代码的效率。原创 2022-08-10 22:22:40 · 1212 阅读 · 5 评论 -
sscanf 导致地址越界
其实在编译时,编译器就已经发出了警告。原创 2022-07-25 22:54:09 · 977 阅读 · 2 评论 -
core dump
core dump 记录了程序崩溃时的案发现场。我们可以使用 gdb 对 core 文件进行分析,叫做现场还原,就能够看到程序是因何而崩溃。原创 2022-07-23 09:46:15 · 455 阅读 · 1 评论 -
ESP32 EC11 制作电脑音量调节旋钮
改造 EC11原创 2022-05-04 01:46:34 · 5489 阅读 · 2 评论 -
获取 Linux 系统所有网卡信息
打印网卡的 名称、MAC 地址、IP 地址、广播地址、子网掩码。原创 2022-05-01 13:44:47 · 3191 阅读 · 0 评论 -
字长和数据类型
C 语言定义的 long 类型总等于机器的字长。原创 2022-04-20 23:15:00 · 537 阅读 · 1 评论 -
gcc -O0 -O1 -O2 -O3 -Os 编译优化等级
调试的时候,要使用 -O0,不然你大概率会发现程序并不是按照你预期的顺序执行的。原创 2022-03-22 22:07:38 · 7699 阅读 · 0 评论 -
strerror()
strerror() 函数能够将错误号 errno 转换成对应的错误消息字符串。原创 2022-02-20 23:23:17 · 363 阅读 · 1 评论 -
熟悉 Glibc,善于利用轮子
我是一个“轮吹”原创 2022-01-07 01:30:31 · 666 阅读 · 6 评论 -
cflow——C语言函数调用关系生成器
拿到一份陌生的 C 工程,想要了解整个工程的脉络,你会使用什么方法呢?原创 2021-12-27 01:35:10 · 10648 阅读 · 25 评论 -
Kernel 启动流程梳理
start_kernel 相当于内核的 main 函数原创 2021-11-26 00:39:44 · 18655 阅读 · 7 评论 -
/dev/tcp/*/*
一些文件名在重定向中被 bash 特殊处理原创 2021-11-21 21:18:46 · 9362 阅读 · 1 评论 -
make 调试方法
Makefile 中有没有 Debug 方法呢?原创 2021-10-18 09:27:47 · 28251 阅读 · 5 评论 -
Shell 中的真与假
与 C 语言中有所不同。原创 2021-10-13 09:23:46 · 20003 阅读 · 2 评论 -
在 main 函数之前执行代码(C 语言)
constructor 属性可以使函数在 main 函数之前执行原创 2021-09-27 19:48:35 · 18755 阅读 · 23 评论 -
内核中的 offsetof、container_of 宏
内核链表是怎么通过指针域来访问数据域的呢?原创 2021-09-13 22:50:49 · 12630 阅读 · 24 评论 -
侵入式链表,内核链表
侵入式链表是嵌(侵)入在其它宿主数据结构中的,这些宿主数据结构可以不相同。原创 2021-09-08 08:47:37 · 21939 阅读 · 81 评论 -
一叶知秋,一个 LED 就能入门 Linux 内核
简单点灯最近项目上需要用到 LED 子系统,在嵌入式 Linux 里面点个灯还是比较简单的,只要在某个灯对应的目录里,向相应文件写入特定值,就可以让 LED 亮/灭/闪烁。# echo 1 > /sys/class/leds/green/brightness // 点亮 LED# echo 0 > /sys/class/leds/green/brightness // 熄灭 LED# echo heartbeat > /sys/class/leds/green/trigger //原创 2021-08-16 09:50:29 · 63742 阅读 · 137 评论 -
win10 为什么可以秒开机?(附实战源码,真机操作)
BIOS 没落BIOS 是长期以来 PC 上最具有代表性的固件,而近年来,BIOS 已经被标准化的 UEFI 取代。相对于新式的 UEFI, 传统的 BIOS 被称为 Legacy 方式。现在 PC 的默认启动方式基本都是 UEFI,但为了兼容,也保留了对 Legacy 的支持。开机流程BIOS 方式:BIOS 是主板上固化的一块 flash 芯片,它在 PC 上电后最先启动,然后根据里面固化的程序,按步骤把主要硬件挨个检查一遍,接着去硬盘找引导程序,把引导权交给它,随后就进入系统了。UEF原创 2021-08-06 02:20:46 · 61712 阅读 · 97 评论 -
撬开程序底层的两把瑞士军刀
工欲善其事,必先利其器了解计算机程序的运行原理和底层细节,对于程序员来说十分重要。毕竟根基不稳,大厦不牢。我们在学习这些内容的时候,如果有得心应手的工具帮我们披荆斩棘,那么将会事半功倍。readelf 和 objdump 就是其中两把有力的瑞士军刀。原创 2021-07-14 22:12:50 · 10814 阅读 · 109 评论 -
没有了 main 函数,程序还能跑吗?
文章目录刑天代码编译运行探索疑问指定刑天刑天,是中国远古神话传说人物,手使一柄巨斧和盾牌,身强力壮,体型巨大的上古巨人,炎帝手下大将,和黄帝争位,被斩去头颅,失了首级后,以双乳为眼,肚脐为口,再战黄帝。刑天没有了头仍然可以战斗,程序没有了 main 函数,还能跑吗?答案是:可以的。代码nomain.c#include <stdio.h>#include <stdlib.h>void nomain(){ printf("hello world\n原创 2021-07-10 23:13:14 · 16374 阅读 · 124 评论 -
C语言进阶——内联汇编
内联函数在 C 语言中,我们可以指定编译器将一个函数代码直接复制到调用其代码的地方执行。这种函数调用方式和默认压栈调用方式不同,我们称这种函数为内联函数。有点像宏。优点:内联函数降低了函数的调用开销。实现:指定编译器将一个函数处理为内联函数,我们只要在函数声明前加上 inline 关键字就可以了。内联汇编基于对上述内联函数的认知,我们大概可以想象出内联汇编到底是怎么一回事了。内联汇编相当于用汇编语句写成的内联函数。优点:效率高。实现:使用 asm 关键字。关键:之所以内联汇编如此有用,主要原创 2021-07-05 01:34:11 · 27057 阅读 · 45 评论 -
touch,一个被大多数程序员误解的命令,你中招了吗?
如果,你问一个程序员,touch 命令是干什么的?我相信 10 个里面有 8 个会回答:创建一个空文件。然而,事实真的如此吗?原创 2021-06-24 19:23:02 · 10611 阅读 · 66 评论