![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核
文章平均质量分 80
os从业人员
os从业人员,研究方向主要涉及linux操作系统、并行实时系统。个人邮箱wdjjwb@163.com
展开
-
linux内核中一些关键词讲解
asmlinkage/FASTCALL()/fastcall这三个宏指定了函数参数的传递方式。asmlinkage修饰的函数,其参数通过堆栈传递。FASTCALL()/fastcall,此二者实际上是一样的作用。在Intel i386架构中,它们所修饰的函数,其前三个参数分别通过通用寄存器EAX,ECX和EDX来传递。它们定义于include/asm-i386/linkage.h:#d转载 2013-12-03 15:38:44 · 593 阅读 · 0 评论 -
linux DO_ONCE、Static Keys、jump label和IPI
本文基于linux4.4问题的来源: 研究的起始来源与发现linux4.4内核在x86机器上text_poke_bp函数会向每个在线cpu发送IPI,执行do_sync_core动作。 虽然do_sync_core只是在每个cpu上执行一下简单的CPUID指令,但毕竟会触发中断,打断当前进程,对系统确定性造成影响。 下面主要分析下这个IPI的来龙去脉。一种分支判断优化方法: 要说明...原创 2018-06-28 16:46:30 · 1015 阅读 · 1 评论 -
计算机优化的一些随想
Wolpert and Macready 在 1997 年在优化领域中提出的 No Free Lunch Theorems(NFL),可以简单理解为:针对某一具体域内的所有优化问题 Q,经过 m 步迭代之后达到目标函数给定值的所有可能性的累加和是相等。 周志华老师在其《机器学习》一书中引申到机器学习领域:“针对某一域的所有问题,所有算法的期望性能是相同的”其实在计算机优化中上面的道理非常普遍...原创 2018-07-03 16:58:21 · 178 阅读 · 0 评论 -
yocto 默认x86根文件系统 开启 serial 登陆支持
使用yocto编译的x86 根文件系统默认是图形界面。通过修改etc/inittab的启动级别后,修改默认从字符界面启动,连接串口,默认没有shell。解决方法: 1. 修改启动参数,添加console=ttyS0,115200 2. 修改/etc/inittab 添加 2:12345:respawn:/sbin/getty -L 115200 ttyS0...原创 2018-07-03 10:45:59 · 845 阅读 · 0 评论 -
linux jump lable
越来越多的工作现如今都交给了编译器,甚至连动态代码修改的数据组织这种事都交给了编译器。gcc提供了一个特性用于嵌入式汇编,那就是asm goto,其实这个特性没有什么神秘之处,就是在嵌入式汇编中go to到c代码的label,其最简单的用法如下(来自gcc的文档): int frob(int x) { int y; asm goto (“frob %%r5, %1; jc ...转载 2018-06-27 15:38:38 · 1491 阅读 · 0 评论 -
定位linux 内核oops具体代码的简便方法
通常是使用objdump对文件反汇编,然后去查找对应错误,下面介绍两种更简单的方法:方法一:假如我们要查看0xffffffff8124d1f9地址对应的是内核中哪个文件哪一条代码,可以按照如下方法来做:~/crosstools/x86_64_gcc6.2.0_glibc2.24.0/bin/x86_64-pc-linux-gnu-addr2line -e vmlinux -a ffff...原创 2018-07-02 09:38:38 · 728 阅读 · 0 评论 -
linux 透明巨页khugepaged 后台进程分析
简介: 透明巨页Transparent Hugepage 可以代替以前的hugetlbfs方式。 相关说明可以参考内核Documentation\vm\transhuge.txt文档。khugepaged : khugepaged 是透明巨页的守护进程,它的主要功能是定时唤醒,根据配置尝试将4k 的普通page转成2M等巨页,减少TLB压力,提高内存使用效率。 khugepaged的处...原创 2018-06-26 14:14:28 · 11377 阅读 · 0 评论 -
x86 tlb
x86_64上的TLB普通模式Global Pages当CR3寄存器被修改时,TLB就被flush掉;然而有些经常使用的或则比较关键的pages不想被flush,则可以通过标识为global pages来实现;更改CR3寄存器只flush非global的pages;TLB管理INVLPG用来无效掉某个TLB项,包括标识为gobal的项;修改CR3可以flush除gl...转载 2018-06-26 10:52:13 · 961 阅读 · 0 评论 -
x86 cr0 cr1 cr3
状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。这几个寄存器中保存全局性和任务无关的机器状态。CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coprocessor)...转载 2018-06-26 10:48:23 · 353 阅读 · 0 评论 -
linux 后台clocksource_watchdog 线程的启动条件
如果启动参数没有设置tsc=reliable,系统认为tsc时钟源需要检查后能被使用 2.检查的方法是启动clocksource_watchdog加入时钟源的时候,如果tsc时钟源不是reliable,则会在执行list_add(&cs->wd_list, &watchdog_list);,即将时钟源加入watchdog_list链表。 而启动watchdog的条...原创 2018-07-04 14:13:47 · 1162 阅读 · 0 评论 -
Linux NO_HZ_FULL NO_HZ 框架实现分析
解决一个问题重要的是了解问题的领域知识和相关背景,本文的目的是介绍linux内核的NO_HZ_FULL相关领域知识,以便涉及相关问题时候能更容易上手。 简单的说linux NO_HZ_FULL的作用是消除Linux内核不必要的周期时钟,提高系统的性能或者节省能耗。NO_HZ需要内核高精度时钟框架的支持。NO_HZ有几种选择,NO_HZ_IDLE是在CPU IDLE的时候关掉该CPU的周期tick...原创 2018-07-12 16:35:29 · 5239 阅读 · 0 评论 -
linux kernel内核slab内存泄露debug经验
打开内核的SLUB DEBUG选项+CONFIG_SLUB_DEBUG=y+CONFIG_SLUB_DEBUG_ON=y观察slabinfocat /proc/slabinfo启动后记录下slabinfo。运行一段时间,再观察slabinfo。找到增长比较大的slab。打开slab traceecho 1 > /sys/kernel/slab/<leakin...转载 2019-03-13 19:33:51 · 4148 阅读 · 1 评论 -
linux smp原子操作
原子操作:就是在执行某一操作时不被打断。linux原子操作问题来源于中断、进程的抢占以及多核smp系统中程序的并发执行。对于临界区的操作可以加锁来保证原子性,对于全局变量或静态变量操作则需要依赖于硬件平台的原子变量操作。因此原子操作有两类:一类是各种临界区的锁,一类是操作原子变量的函数。对于arm来说,单条汇编指令都是原子的,多核smp也是,因为有总线仲裁所以cpu可以单独占用总线直到指令...原创 2019-03-13 19:28:32 · 545 阅读 · 0 评论 -
Printk实现流程
一、初步结论1.如何把字符串放到缓存,如何从缓存写到串口。首先是在关中断,关调度,保持logbuf_lock自旋锁的情况下,将数据格式化后,放到printk_buf缓冲区,其大小为1K,也就是说,每次printk只能打印1K的内容。格式化完毕后,将数据再复制到log_buf缓冲区。由于在向串口输出的过程中,会暂时打开自旋锁,所以在SMP下,其他CPU可能继续向log_buf中存放数据,并由驱动...原创 2019-03-15 16:24:01 · 1203 阅读 · 0 评论 -
Linux内核页表
一. Linux地址空间ARM的32位系统共支持4G的内存空间,其中0-3G为用户空间,3G-4G是内核空间,ARM采用2级页表,32位地址空间ADDRESS分别为 PGD|PTE|12Bits, 在内核代码中分别为PGD 11位,PTE 9 位,页内地址12位;但是在MMU系统中对于ARM的二级分页设置分别为PGD 12位,PTE 8位,页内地址为12位。在内核代码层次虽然是11位,但...转载 2019-02-26 20:13:00 · 1258 阅读 · 1 评论 -
ARMV8 用户态DMA cache一致性问题和解决
原因:dma和cpu都有操作内存的能力,dma操作内存不通过cpu和cache,即cpu cache感知不到dma对内存的操作因此cpu和dma合作时,就会存在cpu cache和内存的一致性问题,原因是dma对内存操作无法被cache感知。当然如果给dma的内存是no cache的,cpu不会使用cache,也就不存在相关问题。如果给dma的是带cache内存,那么cpu访问的时候就需要...原创 2019-02-19 15:46:57 · 4758 阅读 · 1 评论 -
ld 和参数说明
本文档介绍GNU连接器ld的2.14版本.本文档在GNU自由文档许可证下发行.在"GNU自由文档许可证"一章中有关于本许可证的一份拷贝.概述‘ld’把一定量的目标文件跟档案文件连接起来,并重定位它们的数据,连接符号引用.一般,在编译一个程序时,最后一步就是运行’ld’.'ld’能接受连接命令语言文件,这是一种用AT&T的连接编辑命令语言的超集写成的文件,用来在连接的整个过程中提...转载 2019-01-18 10:53:15 · 17307 阅读 · 0 评论 -
vmlinux 和普通elf文件的差别 linux kernel加载简述
vmlinux其实也是一个elf格式文件,它和普通elf是有些区别的。linux下可执行程序格式是elf的。elf格式的文件中有一个Program Headers,这个数据结构告诉 程序加载器,应该如何把 这个elf文件加载到虚拟地址空间中去执行。elf格式还有一个数据结构是Section Headers,这个不是用于程序加载,是用于编译、链接的。 因此gcc -c也可以生成目标代...原创 2018-07-21 15:32:12 · 2373 阅读 · 0 评论 -
ELF文件格式简介
https://blog.csdn.net/gx19862005/article/details/53350032转载 2018-07-21 14:58:56 · 185 阅读 · 0 评论 -
阿里内核月报集合
https://yq.aliyun.com/articles/96423?spm=a2c4e.11153940.blogcont96534.14.1e7d218bP0SCaB转载 2018-06-25 16:40:28 · 1197 阅读 · 0 评论 -
linux prctl系统调用触发IPI
prctl系统调用提供了一系列操作进程的方法。这里主要说明一下PR_SET_SECCOMP参数是如何触发IPI的。seccomp 是 secure computing 的缩写,是 Linux kernel 从2.6.23版本引入的一种简洁的沙盒 sandboxing 机制。 在 Linux 系统里,大量的系统调用(system call)直接暴露给用户态程序。但是,通常的程序并不需要所有...原创 2018-06-29 11:02:15 · 1437 阅读 · 0 评论 -
linux x86 性能调试记录
频率 urbostat是intel针对自己的x86 CPU,做的一个CPU频率、能耗监控的用户态程序,位于linux代码的tools/power/x86/turbostat目录下,编译也很简单,可以直接在这个目录下make,就生成二进制文件了。这个工具在监控cpu运行频率方面有很大用途。cache伪共享 当应用在 NUMA 环境中运行,或者应用是多线程的,又或者是多进程间有共享内存,满...原创 2018-05-17 16:05:48 · 755 阅读 · 0 评论 -
linux 内核启动参数
Linux 内核引导选项简介 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。无担保:本文作者不保证作品内容准确无误,亦不承担任何由于使用此文档所导致的损失。 自由使用:任何人都可以自由的阅读/链接/打印此文档,无需任何附加条件。 名誉权:任何人都可以自由的转载/引用/再创作此文档,但必须保留作者署名并注明出处。 其他作品 ...转载 2018-05-09 16:29:35 · 7104 阅读 · 1 评论 -
linux config
明一下各config命令都做了什么事情:make config: 这个要求你手动选择所有配置项,配置完成后生成.config文件.make menuconfig: 显示以curses的图形配置菜单,当已有.config文件存在时,它会根据.config文件设定默认项.若不存在.config文件,则根据各级Kconfig文件来设定菜单项.完成配置后,生成.config文件.make ol...转载 2018-05-09 10:56:33 · 6742 阅读 · 0 评论 -
x86 64 内核堆栈
switch_to.h中define switch_to(prev, next, last) \do { \ /* \ * Context-switching clobbers all registers, so we原创 2017-08-24 11:00:11 · 507 阅读 · 0 评论 -
find 查找指定时间文件
find /usr/ -newermt ‘2017-05-07’ ! -newermt ‘2017-05-08’原创 2017-08-24 16:53:31 · 1055 阅读 · 0 评论 -
linux 内核启动参数
概述内核引导参数大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导参数多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导参数。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导参数,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导参数说明。大多数参数是通过"__set转载 2017-08-03 09:54:13 · 2020 阅读 · 0 评论 -
linux 启动参数设置 启动打印同时输出到串口和显示器
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/ console=tty0 console=ttyS0 console=tty0 表示当前键盘/显示器控制台 ttyS0表示 COM1口Grub 中的kernel语句加的console=d原创 2017-08-03 09:41:24 · 7936 阅读 · 0 评论 -
linux 进程切换执行流的分离
所谓进程的切换,实际上就是属于进程上下文的寄存器和堆栈的切换,以及页表的切换。切换总是发生在内核态。对于一个执行流来说,它本身是感知不到所谓进程切换的,它只是机械的按照代码执行,取ip的执行地址,执行完毕后进行自加。进程切换一般不会显式的设置eip/rip寄存器的值。设置ip寄存器值一般是需要jmp的时候。那么进程切换后执行路径的不同不是通过设置ip来实现的,那么是怎么实现的?可能有人认为原创 2015-11-16 09:58:19 · 547 阅读 · 0 评论 -
阿里linux内核月报201702
The future of the page cache 持久化内存用得越来越多, 促使了内核的一系列变更, 内核是否还真的需要页面缓存呢? 在2017 linux.conf.au会上, Matthew Wilcox先是纠正了数年前的一个错误,然后表示, 我们不仅需要页面缓存,还要将他的作用将进一步得到提升。他从他作为微软员工的时候开始讲起,以前他以为不会提及这个。 然后进入主题,内容如下,...转载 2018-05-22 10:09:44 · 806 阅读 · 0 评论 -
阿里linux内核月报201704
Gregg: perf sched for Linux CPU scheduler analysis 随着 Linux 4.10 perf sched timehist 新特性的推出,Linux 的 perf 工具又增加了一个新的 CPU 调度器性能分析的子命令。perf sched timehist 可以按照调度事件表示调度延迟,其中包括了重要的调度相关的时间信息:任务等待被唤醒的...转载 2018-05-22 10:10:36 · 776 阅读 · 0 评论 -
kernel如何保证cache数据一致性
在嵌入式系统中,cache位于CPU与DDR之间,是一段SRAM,读写性能远高于DDR,利用cache line提供了预取功能,平衡CPU与DDR之间的性能差异,提高系统的性能。据我了解,ARM/PPC/MIPS三款主流嵌入式处理器都是软件管理cache,即有专门的指令来进行cache操作,如PPC的iccci icbi,ARM的CP15协处理器也提供对cache的操作。cache的操作有...转载 2018-05-28 10:17:55 · 1072 阅读 · 0 评论 -
阿里linux内核月报201405-06
The initial kGraft submission 长久以来,重启操作系统来安装一个内核补丁一直是一个烦人的事情。很多时候,重启系统的时机会受到其他条件的限制。此外,用户则更希望能够在不重启系统的情况下完成内核补丁的安装工作。2008年为了迎合这一需求Ksplice诞生了。但它并没有被合并进主线内核,甚至在Oracle收购其后便消失在Linux开源社区的视线内了。最近其他一些解决方案陆续...转载 2018-05-22 10:24:45 · 506 阅读 · 0 评论 -
阿里linux内核月报201412
Live kernel patching on track for 3.20 运行时间敏感的用户一直以来都很希望有一种方法可以在不重启系统的情况下对运行的操作系统内核打补丁。目前有几个还没有进入主线内核的实现(比如:kpatch, Kgraft)。很明显,这些实现不可能全部进入upstream内核。从最近Jiri Kosina发出的一组补丁来看, 内核热升级补丁的开发似乎又向前迈进了一步,kpa...转载 2018-05-22 10:23:27 · 553 阅读 · 0 评论 -
阿里linux内核月报201503
Virtual filesystem layer changes, past and future LSF/MM 2015峰会上,虚拟文件系统也吸引了足够的目光。LSF/MM 2015峰会上,虚拟文件系统也吸引了足够的目光。 首先是一些需要继续期待的变化。一个是替代mount()系统调用的工作,Al做了一些但是还没能发出来review。另一个是revoke()系统调用,也只有框架。进展比较...转载 2018-05-22 10:22:29 · 526 阅读 · 0 评论 -
阿里linux内核月报2014-07-08
Capsicum for Linux Capsicum: 一种基于文件句柄的新安全模型 Capsicum是一种源自FreeBSD的安全模型,与Linux下众多LSM的相同之处在于它们都是基于权限管理的,而不同之处在于LSM针对的操作对象非常丰富,有进程、VMA、端口、带有标签的文件等等,而Capsicum操作的对象非常单一:文件句柄。例如,一个fd必须带有CAP_READ才能被读取,必须带有C...转载 2018-05-22 10:21:16 · 1118 阅读 · 0 评论 -
阿里linux内核月报201703
目前Linux内核急需的一项功能是在线打补丁的特性。此前被Oracle收购的ksplice一度是Linux上唯一的解决方案。但是在被Oracle收购后,ksplice就闭源了,并且成为了Oracle Linux的一项商业特性。而目前可以拿到的最新版本的ksplice仍然仅仅停留在0.19上,而可以直接使用的内核版本则是2.6.26。对于更新的内核版本则还无法使用。在目前的实际生产环境中,不论是...转载 2018-05-22 10:18:03 · 845 阅读 · 0 评论 -
阿里linux内核月报201701
Controlling access to the memory cache 控制对Cache的访问 cpu对内存的访问一直以来都会通过L1/L2/L3缓存来加速,我们都知道当你打算严肃地去考察性能问题时,各级缓存的命中率一直是一个重要的指标。而一个进程的缓存命中率在很大程度上又和它在各级缓存中所占的空间大小正相关。由于缓存本身是socket范围上的共享资源,一个进程的缓存命中率不仅取决于它自...转载 2018-05-22 10:15:53 · 345 阅读 · 0 评论 -
阿里linux内核月报201705
A report from Netconf: Day 1 本文是2017年4月3日Netconf会议报告。主要的议题是:移除ndo_select_queue()函数,对于refcount_t类型引入开关,TC重定向导致内核陷入循环等。移除ndo_select_queue() ndo_select_queue()函数是大家首先讨论的,它被用来决定往网络接口发送数据包的时间和方式。主要的争...转载 2018-05-22 10:11:43 · 776 阅读 · 0 评论 -
The Performance of µ-Kernel-Based Systems
Hermann Härtig - Michael Hohmuth - Jochen Liedtke* - Sebastian Schönberg - Jean WolterDresden University of TechnologyDepartment of Computer ScienceD-01062 Dresden, Germanyemail: l4-linux@os.inf.t...原创 2019-03-13 20:32:16 · 2634 阅读 · 0 评论