【linux – 在两个帧缓冲程序之间切换】教程文章相关的互联网学习教程文章

Linux设备驱动程序 之 软中断【代码】

软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错;当然,对于时间要求严格并能自己高效完成加锁的工作,软中断是正确的选择; 分配索引 在编译期间,通过在<linux/interrupt.h>中定义一...

Linux设备驱动程序 之 tasklet【代码】

多数情况下,为了控制一个寻常的硬件设备,tasklet机制都是实现自己下半部的最佳选择;tasklet可以动态创建,使用方便,执行起来还算快; 声明tasklet tasklet既可以静态的创建,也可以动态的创建;如果准备静态的创建一个tasklet,可以使用下面的两个宏之一:1 #define DECLARE_TASKLET(name, func, data) 2 struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data } 3 4 #define DECLARE_TASKLET_DISABLED(name, ...

Linux设备驱动程序 之 ioctl【代码】

ioctl 除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制,通常这种需求使用ioctl方法支持,该方法实现了同名的系统调用; 在用户空间,ioctl系统调用的原型如下:1 int ioctl(int d, int request, ...);原型中的可变参数不是数目不定的一串参数,而只是一个可选参数;可选参数的具体格式依赖于控制命令,也就是第二个参数;某些控制命令不需要参数,某些需要一个整数参数,某...

Linux设备驱动程序 之 休眠【代码】

休眠简介 当一个进程被置入休眠时,它会被标记为一种特殊状态,并从调度器的运行队列中移走;直到某些情况下修改了这个状态,进程才会在任意cpu上调度,即运行该进程;休眠中的进程会被搁置在一边,等待将来的某个时间发生; 为了将进程以一种安全方式进入休眠,需要牢记下面的规则: 第一条规则,永远不要在原子上下文中进入休眠;原子上下文是指下面这种状态:在执行多个步骤时,不能有任何的并发访问;这意味着,对休眠来讲,我...

Linux设备驱动程序 之 顺序锁【代码】

当要保护的资源很小,很简单,会频繁的被访问而且写入访问很少的且必须快速时(即读不允许让写饥饿),就可以使用顺序锁(seqlock);从本质上讲,顺序锁会允许读取者对资源的自由访问,但需要读取者检查是否和写入者发生冲突,当这种冲突发生时,就需要重试对资源的访问; 顺序锁通常不能用于保护包含指针的数据结构,因为在写入者修改该数据结构的同时,读取这可能会追随一个无效指针; seqlock定义在<linux/seqlock>中,通常用于初...

Linux设备驱动程序 之 RCU机制【代码】

读取-复制-更新(read-copy-update,RCU)是一种高级的互斥机制,在正确的条件下,可以获得高的性能; RCU对它保护的数据结构做了一些限定,它针对经常发生读而很少发生写的情况做了优化,被保护的资源应该通过指针访问,而对这些资源的引用必须仅由原子代码拥有,在RCU保护的代码范围内不能进入睡眠状态;在修改该数据结构时,写入线程首先复制,然后修改副本,之后用新的版本替换相关指针,当内核确信老的版本上没有其他引用时,...

Linux设备驱动程序 之 信号量和互斥体【代码】

概念 一个信号量本质是一个整数值,它和一堆函数联合使用,这一对函数通常称为P和V;希望进入临界区的进程将在相关信号量上调用P;如果信号量的值大于零,则该值会减少1,进程可以继续执行;相反,如果信号量的值为0或者更小,则进程必须等待知道其他人释放该信号量;对信号量的解锁通过调用V完成;该函数增加信号量的值,并在必要时唤醒等待的进程; 当信号量用于互斥时(即避免多个进程同时在一个临界区中运行),信号量 的值应该...

为什么Java应用程序不能在Linux Red Hat中处理大页面?【代码】

我试过简单的命令:java -XX:+UseLargePages -Xms2g -version收到错误:Java HotSpot(TM) 64-Bit Server VM warning: Failed to reserve 共享内存(errno = 12). 但是没有大页面,它可以正常工作. meminfo输出:HugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0 Hugepagesize: 2048 kB解决方法:在Linux上运行庞大的页面需要做两件事(请参阅Oracle’s Documentation)1)可用的最大共享内存shmmax必须大于JVM堆...

linux-应用程序可以使用的最大内存空间等于(物理内存交换空间)吗?

从post开始,我知道交换空间与物理内存相关.因此,假设物理内存和交换空间均为4 GB.尽管从理论上讲,64位应用程序的内存空间接近2 ^ 64(当然,内核会占用一些空间),但是据我了解,该应用程序可以使用的实际内存仅为8 GB. 所以我的问题是:对于在Unix / Linux上运行的应用程序,它可以使用的最大内存空间等于(物理内存交换空间)吗?解决方法:这是一个复杂的问题. 首先,64位系统的理论虚拟内存空间为2 ^ 64.但是实际上,OS和CPU都不支持如此...

Linux设备驱动程序 之 Makefile【代码】

典型的模块Makefile如下所示; 1 ifneq ($(KERNELRELEASE),)2 obj-m := hello.o3 else4 KERNELDIR ?=/lib/modules/$(shell uname -r)/build5 PWD :=$(shell pwd)6 default:7 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules8 clean:9 @rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers 10 endif 该Makefile在构造过程中会被读取两次;执行步骤如下: 1. 当Makefile从命令行调用时,它注意...

什么是hrtick_clear(rq);在Linux调度程序?

在__scheduler()函数中浏览linux内核代码时,我看到了hrtick_clear(rq).谁能解释这是什么以及为什么使用它?似乎与计时器有关,但无法继续进行.解决方法:经典的OS设计涉及系统计时器-一个以固定间隔计时的实体.在每个刻度期间,将调用调度程序,以及是否应切换进程/线程.但是系统计时器频率非常低(即1000 HZ,这意味着1毫秒一次),并且如果进程仅剩100us的时间片,它将获得额外的时间(在某些情况下),而其他进程却饿死了. 但是,现代CPU提供...

linux-守护程序不会杀死正在从命名管道读取的子级【代码】

我已经编写了这个bash守护程序,该守护程序监视命名管道,将其看到的所有内容记录在名为$LOG_FILE_BASENAME.$DATE的文件中,并且还在$ACTIONABLE_LOG_FILE中创建其过滤版本:while true doDATE=`date +%Y%m%d`cat $NAMED_PIPE | tee -a "$LOG_FILE_BASENAME.$DATE" | grep -P -v "$EXCEPTIONS" >> "$ACTIONABLE_LOG_FILE" done pkill -P $$ # Here it's where it should kill it's children exit 0守护程序运行时,进程表的外观如下:/...

Linux内核设备驱动程序需要访问用户空间中的共享对象

我正在尝试为Linux编写网络设备驱动程序.我拥有的设备具有可用的API,该API使我可以通过用户空间中存在的共享对象来访问所需的所有功能. 我想编写一个网络驱动程序,以便可以使设备显示为CAN接口.但是,为了与设备进行交互,我需要使用用户空间中存在的特定共享对象. 我需要网络设备驱动程序的原因是公开可以通过SocketCAN实用程序进行交互的CAN接口. 有没有办法可以在用户空间中编写网络设备驱动程序?或者,对我来说,构造解决方案的最...

查看linux程序加载so文件的位置【代码】

最近安装公司新产品,安装的时候发现加载的so文件不对,于是开始找问题,到底加载的是谁?1 使用ldconfig -p|grep linkfileName比如:查看共享的ssl动态库;路径![](http://www.icode9.com/i/li/?n=1&i=images/blog/201910/26/50f9fde6c9584c112a2840337cb840dc.png?,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)2 使用ldd programName查看程序使用的静态连接库![](htt...

c-如何使用其他Linux平台中的所有dll文件部署Qt应用程序?

我已经在Linux操作系统中使用Qt Creator创建了一个Web浏览器.我必须在另一个具有linux os的系统上运行此浏览器.而且我不想在其他系统中安装Qt Creator.我希望我的浏览器可以独立运行.使用build创建了浏览器,但是当我运行.exe文件时,它显示未找到.dll文件.因此,我想知道如何将我的应用程序与库绑定.谢谢.解决方法:您所要查找的正是标题中所说的内容,即“ deploying”和Qt wiki can help you out. 首先存在问题的原因是,当您在系统上...