Linux内核代码的编写和优化技巧

1. Linux内核代码的编写和优化技巧 1.1. 代码编写 使用 __same_type和 typecheck编译时检查类型匹配。 __printf和 __scanf编译时检查代码。 对宏进行undef后重新定义,生成不同的代码,如 __SYSCALL配合 unistd.h生成系统调用,TRACE_EVENT生成ftrace相关的数据结构和各个函数。 使用模板宏,减少重复代码也降低出错率,如 STANDARD_PARAM_DEF生成 module_param用到的set和get函数。 使用内联汇编提升性能。 使用位图优化内存占用。 无锁队列kfifo。 1.2. 控制编译时行为 O2或 O3,编译时优化汇编代码。...

vmalloc原理

1. 全局数据结构 1/// mm/vmalloc.c 2/* Export for kexec only */ 3LIST_HEAD(vmap_area_list); 4static struct rb_root vmap_area_root = RB_ROOT; 5/// ... ... 6 7/* 8 * This kmem_cache is used for vmap_area objects. Instead of 9 * allocating from slab we reuse an object from this cache to 10 * make things faster. Especially in...

ARM64 jump label源码分析

1. 背景 引入jump label的背景,参考Linux: Jump label实现简析 在内核代码中,有很多分支判断条件,它们在绝大多数情形下,都是不成立的。尽管我们已经加上unlikely修饰来进行优化,但是,读取 condition 仍然要访问内存,仍然需要用到cache;另外,也会CPU分支预测失败。虽然少数这样的代码影响不大,但当这样的条件判断代码(如内核中大量的tracepoint)增多的时候,将对cache会造成很大压力,所有这些代码导致的cache miss,以及CPU分支预测失败,所造成的性能损失,就变得可观起来。因此,内核需要一种方案,来解决这样的问题。这个解决方案,就是本文描述的 Jump label。...

ARM64 Linux中断入口

1. 简介 ARM64中断入口相关的代码主要在arch/arm64/kernel/entry.S,启动过程中,会将中断向量表vectors的起始虚拟地址写入到VBAR_EL1。 当发生中断或者异常时,硬件会保存一些寄存器,然后就是软件的工作: 进入中断后,根据中断原因,跳转到对应的中断处理函数,这部分是汇编实现。 在中断处理函数中,先通过kernel_entry将寄存器压栈,然后将栈空间记录的struct pt_regs传递给C语言的对应中断处理函数。 完成中断处理后,根据中断发生的异常等级,决定是调用ret_to_user还是ret_to_kernel退出中断,这两个hasn’t都是对汇编代码kernel_exit的封装。...

U-Boot和Linux内核的CRC函数

测试的时候,发现内核驱动里用crc32_le计算出的值和u-boot里用crc32计算出的值不一样。 又用python的zlib.crc32和把内容写到文件用linuxcrc32命令计算,发现与u-bootcrc32函数计算结果一致。 对比u-boot和linux内核用的crc32table,两者是一致的,后来查看代码,发现u-boot的crc32有个与0xffffffffL进行异或的操作。 实际linux的crc32_le函数与u-boot的crc32_no_comp函数是一致的。 1uint32_t __efi_runtime crc32(uint32_t crc, const Bytef *p, uInt len) 2{ 3...

linux常用命令-系统管理

1. pstree查看进程树 1$ pstree -ptA 2systemd(1)-+-VGAuthService(546) 3 |-cron(625) 4 |-dbus-daemon(626) 5 |-dhclient(1587) 6 |-dhclient(1831) 7 |-rinetd(707) 8 |-rsyslogd(629)-+-{in:imklog}(632) 9 | |-{in:imuxsock}(631) 10 | `-{rs:main Q:Reg}(633) 2. ps 1# 查看命名空间,需要用root权限,可以使用sudo 2ps -eo pid,pidns,user,group,cmd 3# ps查看进程...

C语言编译断言

1. 简介 c++17标准引入了static_assert。 1static_assert(bool-constexpr, message ) /// since C++11 2static_assert(bool-constexpr) /// since C++17 gnu c编译器也实现了_Static_assert,见Static Assertions。 2. 自定义 在没有static_assert的c语言中,可以自己实现类似的功能,如下: 2.1. 方法一 1#ifndef STATIC_ASSERT 2#define STATIC_ASSERT(exp)...

Linux Bash技巧

1. shell语法 shell核心基础知识 进阶版 2. 忽略大小写 重新进入bash后生效。 1echo 'set completion-ignore-case on' > ~/.inputrc 3. 临时使用alias前的命令 参考LINUX下使用命令行获取公网IP地址转载 “"在命令前表示使用最原始的命令 比如 rm 和 \rm 如果环境alias过,那rm就是alias后的rm 如: rm -i \rm 指没有alias过最原始的rm。 4. jobs/fg/bg/Ctrl+Z/kill 参考[如何使用jobs命令管理Linux后台进程 在Linux系统中,可以使用jobs命令来管理在后台运行的进程。下面是一些使...