
linux-kernel
文章平均质量分 55
linux-kernel
kunkliu
good good study
展开
-
模块unsupported RELA relocation:275错误
ARM A53芯片有个Erratum,编号是843419,在linux内核打开修正选项后,一些模块(ko)会insmod失败,提示:内核选项:CONFIG_ARM64_ERRATUM_843419当内核打开这个选项后,在模块的CFLAGS里增加了-mcmodel=large选项。而有些ko模块是自有编译框架,没有继承内核的编译选项,没有追加-mcmodel=large选项,所以造成insmod错误。解决办法:就是在模块的CFLAGS里也增加-mcmodel=large选项。检查方法1:确保ko文件进行反汇转载 2022-06-07 20:41:37 · 1377 阅读 · 0 评论 -
linux中关于函数__stringify(x)
linux中关于函数__stringify(x) 在linux中,有一个很有意思的函数,叫__stringify,这个函数的功能叫做stringification,没有查到它合适的中文翻译,我把它叫做参数“字符串化”。 它的功能就是把参数x转换成一个字符串,这个函数的实现是由两部分组成的,如下: #define __stringify_1(x) #x #define __stringify(x) __string...转载 2022-04-22 16:46:02 · 288 阅读 · 0 评论 -
内核中各种同步机制(自旋锁大内核锁顺序锁等)
转载地址:https://blog.youkuaiyun.com/FreeeLinux/article/details/54267446 原子操作 自旋锁 读写自旋锁 信号量 读写信号量 互斥量 完成变量 大内核锁 顺序锁 禁止抢占 顺序和屏障 如何选择 原子操作 原子操作是由编译器来保证的,保证一个线程对数据的操作不会被其他线程打断。 自旋锁 原子操作只能用于临界区只有一个变量的情况,实际应用中,临界区的情况要复杂的多。对于复杂的临界区,Linux 内核提供...转载 2021-06-11 14:37:53 · 2300 阅读 · 1 评论 -
理解Memory Barrier(内存屏障)
本文例子均在 Linux(g++)下验证通过,CPU 为 X86-64 处理器架构。所有罗列的 Linux 内核代码也均在(或只在)X86-64 下有效。本文首先通过范例(以及内核代码)来解释 Memory Barrier,然后介绍一个利用 Memory Barrier 实现的无锁环形缓冲区。Memory Barrier 简介程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定...转载 2019-10-08 09:31:32 · 225 阅读 · 0 评论 -
ARM命令LDREX和STREX实现spinlock
在 include/asm-arm/spinlock.h 下有這麼一段#if __LINUX_ARM_ARCH__ <6#errorSMP not supported on pre-ARMv6 CPUs#endif好啦,前提就是:只有 ARM core 版本 >=6 才可以繼續:all spin lock primitives 到最後都是使用下面這個基本型:s...转载 2019-09-29 15:00:15 · 375 阅读 · 0 评论 -
linux 内核自旋锁spinlock实现详解(基于ARM处理器)
1、自旋锁结构typedef struct {union {u32 slock;struct __raw_tickets {#ifdef __ARMEB__u16 next;------ 下一个可以获取自旋锁的处理器,处理器请求自旋锁的时候会保存该值并对该值加1,然后与owner比较,检查是否可以获取到自旋锁,每请求一次next都加1u16 owner;------ 当前获取到...转载 2019-09-29 14:41:27 · 392 阅读 · 0 评论 -
自旋锁spin_lock
自旋锁的引入原子变量适用在多核之间多单一共享变量进行互斥访问,如果要保护多个变量,并且这些变量之间有逻辑关系时,原子变量就不适用了。...转载 2019-09-29 13:58:41 · 399 阅读 · 0 评论 -
自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析
自旋锁的初衷:在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。单处理器的自旋锁:首先,自旋锁的目的如果在系统不支持内核抢占时,自旋锁的实现也是空的,因为单核只有一个线程在执行,不会有内核抢占,从而资源也不会被其他线程访问到。 其次,支持内核抢占,由...转载 2019-09-29 11:30:58 · 630 阅读 · 0 评论 -
自旋锁spin_lock和raw_spin_lock
本文不打算详细探究spin_lock的详细实现机制,只是最近对raw_spin_lock的出现比较困扰,搞不清楚什么时候用spin_lock,什么时候用raw_spin_lock,因此有了这篇文章。/***********************************************************************************************...转载 2019-09-29 11:08:17 · 181 阅读 · 0 评论 -
Linux内核链表之list_head
转载地址:https://blog.youkuaiyun.com/weixin_42164528/article/details/80493826(include/linux/list.h) 1、定义以及初始化 include/linux/type.h定义的结构体struct list_head { struct list_head *next, *prev;}; 2、初始化初...转载 2019-07-18 14:48:08 · 327 阅读 · 0 评论 -
一文读懂list_head相关
转载地址:https://blog.youkuaiyun.com/u013989284/article/details/789581871.list_entry的作用struct list_head { struct list_head *next, *prev;};没有数据区怎么使用,更多的时候是嵌入到其他结构体中使用。struct file_node{ char c; struc...转载 2019-07-18 13:39:13 · 636 阅读 · 0 评论 -
Linux内核源码阅读之自旋锁的作用及其实现
作用:内核中的自旋锁的作用是保护一段临界区域的操作是独占的,不能因为多个CPU或者多个进程同时访问破坏数据结构。在单核系统和多核系统中自旋锁的实现有所不同。多核系统:对于多核系统,主要考虑一个cpu进入临界代码区域之后,其它cpu不能再次进入这个临界代码区域。单核系统:对于单核系统,主要的情景是一个进程进入了临界区域后,不能被其它进程抢占,如果被其他进程抢占,会导致进程抢占的c...转载 2019-09-29 16:44:50 · 269 阅读 · 0 评论 -
自旋锁的C语言代码实现
上一节主要介绍了 Linux内核中的原子操作,在某种程度上避免了多个线程对同一全局变量的竞争问题。要是内核中的其他C语言程序开发中的临界区都能像上一节介绍的原子变量那样简单就好了。然而事与愿违,在某个C语言项目中,可能某个临界区甚至会跨越多个函数。例如,函数 A 负责从共享数据结构中取出数据,函数 B 负责处理这些数据,函数 C 则负责将这些数据分发。显然,在这个过程中,要保护共享数据结构,仅仅...转载 2019-09-29 16:51:29 · 5767 阅读 · 0 评论 -
深入分析Linux自旋锁
前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的模块。但是在我的ARMv7的单核CPU(TI的A8芯片)中测试的时候,不会锁死,并且自旋锁可以多次获取。实验现象和我对自旋锁和休眠的理解有出路。 我后来我将这个模块放到自己的PC上测试,成功锁死了,说明我的模块原理上没有问题。但是为什么在ARM上会这样呢???后来我将模块给了我的两个同事...转载 2019-10-08 09:31:41 · 165 阅读 · 0 评论 -
内核定时机制API之current_kernel_time
inline struct timespec current_kernel_time(void) 此函数用于返回当前内核时间。该时间是距离1970开始的秒和纳秒.static inline struct timespec current_kernel_time(void){ #首先得到时间并存在timespec64 类型的now中 struct timespec64 now ...转载 2019-10-09 10:58:22 · 1502 阅读 · 0 评论 -
Linux内核抢占机制(preempt)
早期的Linux内核(2.5.4版本之前)是不可抢占的。它的调度方法是:一个进程可以通过schedule()函数自愿地启动一次调度。非自愿的强制性调度只能发生在 每次从系统调用返回的前夕以及每次从中断或异常处理返回到用户空间的前夕。但是,如果在系统空间发生中断或异常是不会引起调度的。这种方式使内核实现得以 简化。但常存在下面两个问题:(一)如果这样的中断发生在内核中,本次中断返回是不会引起调度...转载 2019-10-09 11:00:05 · 978 阅读 · 0 评论 -
barrier 和 preempt_disable() 学习
#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier(); \ }while(0) 一、这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自作聪明地对指令序列进行一些处理,比如数据缓存,读写指令乱序执行等等。如果优化对象是普...转载 2019-10-09 11:01:40 · 384 阅读 · 1 评论 -
module_param的介绍
一般用户态传递参数是通过main函数,第一个参数表示args个数,即argc,第二个参数表示具体的参数。在kernel态,无法通过这样的方式传递参数,一般使用module_param的方式,步骤如下:1.使用module_param指定模块的参数2.加载driver时给模块传递参数source code如下:#include <linux/module.h>#inclu...转载 2019-10-09 12:13:30 · 510 阅读 · 0 评论 -
Linux内核module_param的使用
1.定义模块参数的方法:module_param(name, type, perm);其中,name:表示参数的名字;type:表示参数的类型;perm:表示参数的访问权限;2. 数组类型模块参数的定义:用逗号间隔的列表提供的值;声明一个数组参数:module_param_array(name, type, num, perm);其中,name:...转载 2019-10-09 12:15:24 · 205 阅读 · 0 评论 -
linux中class_create和class_register说明
本文介绍linux中class_create和class_register的相关使用方法1 class结构体介绍 内核中定义了struct class结构体,顾名思义,一个...转载 2019-10-09 15:55:52 · 745 阅读 · 0 评论 -
创建设备文件节点_使用device_create实例分析
Linux 的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev 目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样。查看/proc/devices 文件可以获知系统中注册的设备,第 1 列为主设备号,第 2 列为设备名,主设备号是与驱动对应的概念,同一类设备一般使用相同的主设备号,不同类的设备一般使用不同的主设备号(...转载 2019-10-09 16:07:21 · 2234 阅读 · 0 评论 -
Linux内核中经典链表 list_head 常见使用方法解析
转载地址:https://blog.youkuaiyun.com/wanshilun/article/details/79747710 做内核驱动开发经常会使用linux内核最经典的双向链表 list_head, 以及它的拓展接口(或者宏定义): list_add , list_...转载 2019-07-18 13:07:34 · 461 阅读 · 0 评论 -
Linux系统上的popen()库函数
转载地址:https://blog.youkuaiyun.com/qq_29344757/article/details/70925123《Unix环境高级编程》在popen和pclose函数章节说,常见的操作是创建一个连接到另一进程的管道,然后读其输出或向其发生输入,所以标准I/O库为实现这些操作提供了两个函数popen和pclose。这两个函数实现的操作是:创建一个管道,fork一个子进程,关闭管道的...转载 2019-01-24 10:15:34 · 347 阅读 · 0 评论 -
linux驱动之内核定时器驱动设计
转载地址:http://blog.chinaunix.net/uid-20937170-id-3048501.html我的环境:Fedora 14 内核版本为2.6.38.1开发板:ARM9 TQ2440移植内核版本:linux-2.6.30.4定时器在linux内核中主要是采用一个结构体实现的。但是需要注意定时器是一个只运行一次的对象,也就是当一个定时器结束以后转载 2017-11-20 12:57:22 · 331 阅读 · 0 评论 -
出错syntax error: word unexpected (expecting ")")解决
转载地址:http://blog.chinaunix.net/uid-21948941-id-3205757.html最近有朋友问了我一个问题,就是用gcc编译C程序时出现了:出错syntax error: word unexpected (expecting ")"),花了一点时间,去找问题所在,今天总结一下。 代码如下,即文件c_cuiyue.c。转载 2017-10-13 11:21:14 · 15291 阅读 · 1 评论 -
Linux上的free命令详解
转载地址:http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html解释一下Linux上free命令的输出。 下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:FO[2][1] = 24677460FO[3转载 2017-10-13 10:21:36 · 226 阅读 · 0 评论 -
memdup_user()函数
转载地址:http://blog.youkuaiyun.com/lu_xiaoji/article/details/50324981用户态到内核态的拷贝,都会涉及到两个必要的步骤: * void *memdup_user(const void __user *src, size_t len) * { * void *p; * * p = kma转载 2017-10-11 14:49:20 · 1382 阅读 · 0 评论 -
Linux创建swap文件
转载地址:http://www.cnblogs.com/jeakon/archive/2012/05/28/2816808.html新增swap分区 根据Redhat公司的建议,swap分区最适合的大小是物理内存的1-2倍.不过Linux上有些软件对swap分区得需求较大,例如要顺利执行Oracle数据库软件,swap分区至少需要400MB或者物理内存2倍以上的空间.当然我们在转载 2017-09-20 14:36:13 · 219 阅读 · 0 评论 -
list_entry()详解
转载地址:http://blog.youkuaiyun.com/hs794502825/article/details/10364977Linux内核中,获取节点地址的函数list_entry()非常常用,由于其定义有点晦涩,先解析如下:list_entry的宏定义:#define list_entry(ptr, type, member) / ((type *)((char *转载 2017-09-18 11:05:21 · 8255 阅读 · 0 评论 -
Linux内核list_head学习(二)
转载地址:http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532262.html前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码。自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用起来貌似更方便), 在应用程序中转载 2017-09-18 10:37:23 · 370 阅读 · 0 评论 -
Linux 内核list_head 学习(一)
转载地址:http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532240.html在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C+转载 2017-09-18 10:32:28 · 398 阅读 · 0 评论 -
如何打开pr_debug调试信息
转载地址:http://blog.youkuaiyun.com/helloanthea/article/details/25330809如何打开pr_debug调试信息,先不要着急,我们先静下心来分析一下这个函数的源代码。。。以DMA的调试为例,先来看看一个pr_debug函数调用[plain] view plain copy pr_debug("%s: %s转载 2017-09-22 15:13:25 · 10084 阅读 · 0 评论 -
查看Linux系统架构类型的5条常用命令
转载地址:http://www.cnblogs.com/linuxprobe/p/5643668.html导读很多时候我们都需要查看当前 Linux 系统是 32 位还是 64 位系统架构类型,本文中我将向大家推荐 5 条常用命令。无论你使用的是桌面版或是只装了文本界面的 Linux 环境,以下命令几乎可以通吃所有 Linux 发行版,例如:RHEL、CentOS、Fedora、Scien转载 2017-11-06 14:58:30 · 12042 阅读 · 0 评论 -
linux多进程之间的文件锁
转载地址:http://blog.sina.com.cn/s/blog_804354760101al6q.html之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数: 表头文件 #include 定义函数 int floc转载 2017-12-04 15:12:17 · 578 阅读 · 0 评论 -
Linux中_ALIGN宏背后的原理(ZZ) -- 内存对齐
转载地址:https://www.cnblogs.com/med-dandelion/p/4532318.html1. 引子 int a; int size = 8; <----> 1000(bin) 计算a以size为倍数的下界数: 就让这个数(要计算的这个数)表示成二进制时,最后三位为0就可以达到这个目标。只要下面这个数与a进行"...转载 2018-10-09 08:37:28 · 661 阅读 · 0 评论 -
Linux内核 ALIGN PAGE_ALIGN
转载地址:https://blog.youkuaiyun.com/zwmyxfbenet/article/details/25688661 #define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask)) #define ALIGN(x,a) __ALIGN_MASK(x,(typeof(x))(a)-1) 写简单点,宏ALIGN实际上是这...转载 2018-10-09 08:37:19 · 448 阅读 · 0 评论 -
PAGE_ALIGN()
转载地址:http://blog.chinaunix.net/uid-26285146-id-3359483.html将物理地址addr修整为页边界地址(页的上边界)#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)|------------|<-- PAGE_ALGN(addr)| ...转载 2018-10-09 08:37:09 · 217 阅读 · 0 评论 -
uclinux 与 linux的区别
转载地址:https://blog.youkuaiyun.com/bytxl/article/details/50276499第一篇这两天看公司的一个产品 用的是arm7 系统用的uclinux 发现程序的内存管理方面有些看不懂,还有程序几乎用的全是线程。查过资料后才恍然明白,原来没有mmu 所以uclinux对多进程的支持非常有限。不过这是比较老的版本。新版本已经支持了!?------...转载 2018-10-08 10:11:49 · 2013 阅读 · 0 评论 -
Linux启动引导时内核在内存中地址变化
转载地址:https://blog.youkuaiyun.com/Xsos77/article/details/18324441以下描述为linux在i386类型CPU中的启动流程 1、BIOS将可启动设备的第一个扇区(磁盘引导扇区,512字节)的代码(汇编语言编写的boot/bootsect.s)读入内存绝对地址0x7C00处,并跳转到0x7C002、于是这段代码开始执行,它把自己(这5...转载 2018-09-27 13:56:04 · 592 阅读 · 0 评论 -
Linux用户空间与内核地址空间
转载地址:https://blog.youkuaiyun.com/maopig/article/details/77800124Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。 Linux内核地址映射模型x86 CPU采用...转载 2018-09-27 13:46:36 · 1953 阅读 · 0 评论