Linux编程学习
s651665496
这个作者很懒,什么都没留下…
展开
-
Linux中的中断处理
中断处理例程运行方式的不同,它们所能执行的动作将会受到不同的限制。内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表。模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道。在很多场合下,模块也希望可以和其他的驱动程序共享中断信号线。接口实现在头文件中声明:int request_irq(unsigned int ir翻译 2015-12-09 13:12:40 · 532 阅读 · 0 评论 -
时间、延迟(Linux设备驱动程序)
时间延迟如何度量时间差,比较时间如何获得当前时间如何将操作延迟指定的一段时间如何调度异步函数到指定的时间之后执行度量时间差内核通过定时器中断来跟踪时间流。时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个与体系结构有关的常数。每当时钟中断发生时,内核内部计数器的值就增加一。这个计数器的值在系统引导时被初始化为0,它的值就翻译 2016-04-25 20:43:23 · 1670 阅读 · 0 评论 -
高级字符驱动程序操作(Linux设备驱动程序)
一个实际可用的设备除了提供同步读取和写入之外,还会提供更多的功能。ioctl系统调用是用于设备控制的公共接口。除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制。比如,用户空间经常会请求设备锁门、弹出介质、报告错误信息、改变波特率或者执行自破坏等等。这些操作通常通过ioctl方法支持,该方法实现了同名的系统调用。在用户空间翻译 2016-04-29 16:45:09 · 586 阅读 · 0 评论 -
并发和竞态(Linux设备驱动程序)
设备中断是异步事件,也会导致代码的并发执行。内核还提供了许多可延迟代码执行的机制,比如workqueue(工作队列)、tasklet(小任务)以及timer(定时器)等,这些机制使得代码可在任何时刻执行,而不管当前进程在做什么。大部分竞态可通过使用内核的并发控制原语,并应用几个基本的原理来避免。竞争通常作为对资源的共享访问结果而产生。仔细编写的内核代翻译 2016-04-18 19:58:09 · 949 阅读 · 0 评论 -
MAC地址规范
MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置。MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique identifier),后24位由厂商自行分配。MAC地址有单播、组播、广播之分。单播地址(unicast address)表示单一设备、节点,多播地址或者组播地址(multicast address、转载 2016-05-05 17:48:53 · 19831 阅读 · 0 评论 -
CPU的寻址方式(Linux内核情景分析)
Intel在8086 CPU中设置了四个“段寄存器”:CS、DS、SS和ES,分别用于可执行代码即指令、数据、堆栈和其他。每个段寄存器都是16位的,对应于地址总线中的高16位。每条“访内”指令中的“内部地址”都是16位的,但是在送上地址总线之前都在CPU内部自动地与某个段寄存器中的内容相加,形成一个20位的实际地址。(映射)段寄存器中的内容对应于20位地址总线中的高16位;相加时拿翻译 2016-05-17 14:10:41 · 508 阅读 · 0 评论 -
Linux设备模型(Linux设备驱动程序)
kobject所处理的函数清单,都是一些代表其他对象完成的服务。它存在的意义在于把高级对象连接到设备模型上。kobject用于控制对大型域(domain)相关对象的访问。在C语言中使用在一个结构体中嵌入另外一个结构的技术。container_of宏对包含在cdev结构中的、名为kp的kobject结构指针进行转换的代码如下:struct cdev *device翻译 2016-05-07 15:47:56 · 384 阅读 · 0 评论 -
块设备驱动程序(Linux设备驱动程序)
一个块设备驱动程序主要通过传输固定大小的随机数据来访问设备。Linux内核视块设备为字符设备相异的基本设备类型。块驱动程序有自己完成特定任务的接口。高效的块设备驱动程序在性能上是严格要求的。块驱动程序是在核心内存与其他存储介质之间的管道,因此可以被认为是虚拟内存子系统的组成部分。许多字符设备可以在远低于其最快速率下工作。Linux块设备驱动程序接口使得块设备可以发挥翻译 2016-05-07 18:37:56 · 710 阅读 · 0 评论 -
内存映射(Linux设备驱动程序)
第一部分:mmap系统调用直接将设备内存映射到用户进程的地址空间里。第二部分:跨越边界直接访问用户空间的内存页。一些相关的驱动程序需要这种能力,(用户空间内存如何映射到内核中的方法get_user_pages)第三部分:直接内存访问(DMA)I/O操作,使得外设具有直接访问系统内存的能力。Linux的内存管理地址类型Linux是一个虚拟内存系统,这意味着用户程序翻译 2016-04-22 19:15:53 · 1719 阅读 · 0 评论 -
DMA(Linux设备驱动程序)
直接内存访问DMA是一种硬件机制。它允许外围设备和主内存之间直接传输它们的I/O数据,而不需要系统处理器的参与。DMA需要设备驱动程序分配一个或者多个适合执行DMA的特殊缓冲区。许多驱动程序在初始化阶段分配了缓冲区,一直使用它们直到关闭。分配DMA缓冲区设备使用ISA或者PCI系统总线传输数据时,这两种方式使用的都是物理地址。但SBus在外围总线上使用了虚拟翻译 2016-04-22 21:03:51 · 2835 阅读 · 0 评论 -
分配内存(Linux设备驱动程序)
分配内存介绍设备驱动程序中使用内存的方法;如何最好地利用系统内存资源。kmalloc函数kmalloc内存分配引擎是一个功能强大的工具。#include void *kmalloc(size_t size, int flags);参数分配表示flags能够以多种方式控制kmalloc的行为。标志GFP_KERNEL表示内存分配是代表运行在内核空间的进程执行的翻译 2016-04-23 17:15:06 · 1768 阅读 · 0 评论 -
Linux_Timer
static timer_t Linux_TimerID = NULL; /*Timer id*/{ sigevent_t SigEvent = {{0}}; /* Signal event */ struct itimerspec stTimerSpec = {{0原创 2016-05-19 19:34:57 · 493 阅读 · 0 评论 -
Linux中的信号处理函数
信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 1. 基本概念 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信转载 2016-05-23 09:54:42 · 1671 阅读 · 0 评论 -
《Linux 内核设计与实现》学习笔记(定时器和时间管理)
内核中有大量的函数都是基于时间驱动的。像对调度程序中的运行队列进行平衡调整系统定时器是一种可编程硬件芯片,它能以固定频率产生中断,它所对应的中断处理程序负责更新系统时间,也负责执行需要周期性运行的任务。系统定时器和时钟中断处理程序是Linux系统内核管理机制中的中枢。系统定时器以某种频率自行触发时钟中断,该频率可以通过编程预定,称作节拍率(tick rate)。墙上时间(实际时间)...原创 2019-04-01 11:15:28 · 144 阅读 · 0 评论 -
Linux中的并发与竞态
场景:正在运行的多个用户空间进程可能以一种令人惊讶的组合方式访问我们的代码。我们的驱动程序代码可能在任何时候丢失对处理器的独占,而拥有处理器的进程可能正在调用我们的驱动程序代码。内核还提供了许多可延迟代码执行的机制,比如workqueue(工作队列)、tasklet(小任务)以及timer(定时器)等。这些机制使得代码可在任何时刻执行,而不管当前进程在做什么。避免策翻译 2015-12-08 13:59:27 · 438 阅读 · 0 评论 -
Linux中的completion使用
内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束。这个活动可能是:创建一个新的内核线程或者新的用户空间进程、对一个已有进程的某个请求,或者某种类型的硬件动作。可以使用信号量进行同步,但如果存在针对该信号量的严重竞争,性能将受到影响。如果使用信号量在任务完成时进行通信,则调用down的线程几乎总是要等待,这样性能也同样会受到影响。comple翻译 2015-12-08 12:18:48 · 2539 阅读 · 0 评论 -
Linux学习笔记(06-04)创建进程
在Linux中主要提供了fork、vfork、clone三个进程创建方法。(1)fork fork创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。例如,要是父进程打开了五个文件,那么子进程也有五个打开的文件,而且这些文件的当前读写指针也停在相同的地方。copy-on-write(CO原创 2015-06-04 13:47:06 · 493 阅读 · 0 评论 -
Linux学习笔记(03-11)vi、tar命令
把sh改为指向bash:1,直接把/bin/sh的软链接改到bash中。如:ln -s /bin/bash /bin/sh2.sudo dpkg-reconfigure dash出现菜单问你是否要dash的时候,选no就可以了。检查:ls /bin/sh -al 发现软链接指向/bin/bash就可以了。vi退出命令::w 保存文件但不退出vi:w转载 2015-03-11 19:11:43 · 449 阅读 · 0 评论 -
Linux学习笔记(05-25)条件变量的使用
1.互斥量的存在问题: 互斥量是线程程序必需的工具,但它们并非万能的。如果线程正在等待共享数据内某个条件出现,它可以重复对互斥对象锁定和解锁,每次都会检查共享数据结构,以查找某个值。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。 可以让调用线程短暂地进入睡眠,比如睡眠三秒钟,但就无法最快作出响应。真正需要的是这样一种方法:当线程在等待满足某些条件时使线程进入转载 2015-05-25 14:45:39 · 417 阅读 · 0 评论 -
Linux学习笔记(06-11)POSIX消息队列
1. 消息队列的创建和删除1.1 mq_open( )#includemqd_tmq_open( const char *name, int flag )mqd_t mq_open( const char *name, int flag, mode_t mode, mq_attrattr )创建或获取一个消息队列。成功返回消息队列描述符;失败返回-1。参数name指转载 2015-06-11 13:29:33 · 432 阅读 · 0 评论 -
Linux学习笔记(05-25)读写锁
特性: 读写锁也叫共享——排他锁,因为有3种状态, 所以可以有更高的并行性。使用mutex,它的状态要么处于锁住和未锁状态,只有一个线程可以上锁。而读写锁有更多的状态:在读状态锁住,在写状态锁住,未锁住。只有一个线程可以获得写锁,多个线程可以同时获得读锁。当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时, 所有试图以读模转载 2015-05-25 15:04:31 · 452 阅读 · 0 评论 -
Linux学习笔记(05-18)线程使用
(1)接触线程编程照着GUN/Linux编程指南中的一个例子输入编译,结果出现如下错误:undefined reference to 'pthread_create'undefined reference to 'pthread_join'问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pth原创 2015-05-18 18:44:13 · 310 阅读 · 0 评论 -
Linux学习笔记(06-11)POSIX信号量
POSIX信号量详解1.无名信号量 无名信号量的创建就像声明一般的变量一样,例如:sem_t sem_id。然后再初始化该无名信号量。 无名信号量常用于多线程间的同步,同时也用于相关进程间的同步。 无名信号量必须是多个进程(线程)的共享变量,要保护的变量也必须是多个进程(线程)的共享变量,这两个条件是缺一不可的。 无名信号量转载 2015-06-11 11:14:35 · 313 阅读 · 0 评论 -
Linux学习笔记(06-11)select, poll和epoll的区别
select()系统调用:提供一个机制来实现同步多元I/O。调用select()将阻塞,直到指定的文件描述符准备好执行I/O,或者可选参数timeout指定的时间已经过去。监视的文件描述符分为三类set,每一种对应等待不同的事件。readfds中列出的文件描述符被监视是否有数据可供读取(如果读取操作完成则不会阻塞)。writefds中列出的文件描述符则被监视是否写入操作完成而不阻塞,e转载 2015-06-11 14:30:53 · 337 阅读 · 0 评论 -
Linux学习笔记(05-25)定时器接口
POSIX时钟系列:创建、初始化以及删除一个定时器的行动被分为三个不同的函数:timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。 (1)创建一个定时器:int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timeri转载 2015-05-25 16:19:25 · 522 阅读 · 0 评论 -
Linux学习笔记(05-25)时间接口
(1)time_t time( time_t * t );此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非空指针的话,此函数也会将返回值存到t指针所指的内存。(2)struct tm *localtime( const time_t *timer );struct tm* localtime_r( const time_t*转载 2015-05-25 15:11:00 · 336 阅读 · 0 评论 -
Linux推荐书籍
《UNIX环境高级编程》(第2版),史蒂文斯著 《深入理解 Linux 内核》(第三版) ,博韦等著 《Linux 设备驱动程序》,科波特著 《Linux 设备驱动程序》,推荐指数:★★★ 《嵌入式 Linux 应用开发完全手册》,韦东山著 《人月神话》(32周年中文纪念版),布鲁克斯著 思想篇 《Linux/Unix设计思想》 图书将Unix与Lin原创 2015-06-10 22:33:39 · 433 阅读 · 0 评论 -
Linux学习笔记(06-11)线程优先级
调度策略posix提供了int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);函数来获取所使用的调度策略,它们是:SCHED_FIFO, SCHED_RR 和 SCHED_OTHER。可以使用int sched_get_priority_max(int policy);int s转载 2015-06-11 17:23:15 · 659 阅读 · 0 评论 -
Linux学习笔记(06-05)信号列表
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。使用kill -l就会显示出linux支持的信号列表。其中列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号转载 2015-06-05 13:26:10 · 306 阅读 · 0 评论 -
Linux学习笔记(06-15)信号集的使用
信号集(signal set)POSIX.1定义数据类型sigset_t以包含一个信号集,并且定义了下列5个处理信号集的函数。#include int sigemptyset(sigset_t * set);int sigfillset(sigset_t * set);int sigaddset(sigset_t * set, int signo);int sigdelse原创 2015-06-15 14:36:44 · 372 阅读 · 0 评论 -
linux中的信号处理机制
简介:信号本质上是一种向一个进程通知发生异步事件的机制,是在软件层次上对中断的一种模拟。这种通知机制可以用于通知硬件消息,也可以用来进行进程间通信,还可以用来通知一些程序错误如除0、非法内存访问。异步是说进程没有对信号进行实时监控,不必等待信号到来,事实上进程也根本不知道信号什么时候会来。信号的运行,当信号发送到程序时并不是立即执行而是等待某个时机再执行,在这个时机还没到来的时翻译 2015-12-17 10:37:57 · 1064 阅读 · 0 评论 -
Linux学习笔记(05-25)进程优先级设置和进程调度
常把进程分为以下三类:交互式进程(Interactive process)批处理进程(Batch process)实时进程(Real-time process)Linux2.6 内核是抢占式的,这意味着进程无论是处于内核态还是用户态,都可能被抢占。调度程序总能成功地找到要执行的进程,事实上,总是至少有一个可运行进程:即swapper 空闲进程,它的PID等于0,而且它只原创 2015-05-25 16:32:57 · 847 阅读 · 0 评论