linux系统内核
文章平均质量分 78
emtribe
这个作者很懒,什么都没留下…
展开
-
线程同步——信号量
信号是 E. W. Dijkstra 在二十世纪六十年代末设计的一种编程架构。Dijkstra 的模型与铁路操作有关:假设某段铁路是单线的,因此一次只允许一列火车通过。信号将用于同步通过该轨道的火车。火车在进入单一轨道之前必须等待信号灯变为允许通行的状态。火车进入轨道后,会改变信号状态,防止其他火车进入该轨道。火车离开这段轨道时,必须再次更改信号的状态,以便允许其他火车进入轨道。在计算机版转载 2013-03-04 14:54:53 · 265 阅读 · 0 评论 -
linux-2.6.26内核中ARM中断实现详解(1)
看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。一、中断注册方法在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义:int request_irq(unsigned int irq, irq_handler_t转载 2013-02-28 10:45:01 · 257 阅读 · 0 评论 -
linux内核input子系统解析
Android、X windows、qt等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持都通过、或越来越倾向于标准的input输入子系统。因为input子系统已经完成了字符驱动的文件操作接口,所以编写驱动的核心工作是完成input系统留出的接口,工作量不大。但如果你想更灵活的应用它,就需要好好的分析下input子系统了。一、input输入子系统框架下图是input输入子转载 2013-02-28 15:19:29 · 212 阅读 · 0 评论 -
多进程与多线程的选择
上周去参加答辩,内容是安防系统,然后就想到了我们如何来实现我们的程序,是选择进程还是线程。带着疑惑,查了些资料,总结如下: 1、首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只转载 2013-02-28 10:52:06 · 360 阅读 · 0 评论 -
Linux的文件系统管理
Unix业界有句话叫“一切皆文件”,Linux作为一个优秀的类Unix操作系统,具有强大的文件管理能力, 其中“一切皆文件”就是很突出的特点!文件系统就是负责文件的管理。每一个文件通常包含两部分的内容,一个是文件的信息包括文件的权限、文件的所有者、时间参数等,一个是文件数据。前者放在一个叫inode的结构体中,每个文件的inode的编号都是唯一的;后者放在block区,每个block都有唯一的转载 2013-02-28 15:21:49 · 277 阅读 · 0 评论 -
zImage内核镜像解压过程详解
在华清远见教学过程中,发现很多学员对内核镜像解压过程比较感兴趣,但网上相关的文章往往不能把关键问题讲清楚,所以写了这篇文章。 本文以linux-2.6.14内核在S3C2410平台上运行为例,讲解内核的解压过程。 内核编译完成后会生成zImage内核镜像文件。关于bootloader加载zImage到内核,并且跳转到zImage开始地址运行zImage的过程,相信大家都很容易理解。转载 2013-02-28 10:03:36 · 281 阅读 · 0 评论 -
linux-2.6.26内核中ARM中断实现详解(2)
三、中断处理过程 这一节将以S3C2410为例,描述linux-2.6.26内核中,从中断开始,中断是如何一步一步执行到我们注册函数的。3.1 中断向量表 arch\arm\kernel\entry-armv.S __vectors_start: swi SYS_ERROR0转载 2013-02-28 10:46:03 · 287 阅读 · 0 评论 -
linux-2.6.26内核中ARM中断实现详解(3)
四、中断处理模型 要想弄清楚desc->handle_irq(irq, desc)和我们注册的中断有什么关联,就要了解中断处理模型了。4.1 中断处理模型结构 中断处理模型如下图所示,其中NR_IRQS表示最大的中断号,在include/asm/arch/irq.h中定义。 irq_desc[]是一个指向irq_desc_t结构的数组, irq_desc转载 2013-02-28 10:46:40 · 218 阅读 · 0 评论 -
Linux设备模型之input子系统详解
一:前言 在键盘驱动代码分析的笔记中,接触到了input子系统。键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析。 下面的代码是转载 2013-03-12 16:59:11 · 526 阅读 · 0 评论 -
linux模块导出符号 EXPORT_SYMBOL_GPL EXPORT_SYMBOL
一个模块mod1中定义一个函数func1;在另外一个模块mod2中定义一个函数func2,func2调用func1。在模块mod1中,EXPORT_SYMBOL(func1);在模块mod2中,extern int func1();就可以在mod2中调用func1了。=================================EXPORT_SYMBOL只出现在2.6内核中转载 2013-03-27 10:43:37 · 837 阅读 · 0 评论 -
linux之MACHINE_START和 MACHINE_END
一、 注:下面的内容是以linux-2.6.38和mini6410为例进行学习的。 玩过或者移植过arm-linux的都应该知道在/arch/arm目录下有许多与具体处理器相关的目录,当然对于6410的话所对应的目录就是mach-s3c64xx,在里面找到与具体板子相关的文件mach-mini6410.c,没错,就是它。无论是出于想移植到新的内核还是出于想深入学习某一款a转载 2013-03-27 13:43:29 · 1914 阅读 · 0 评论 -
Linux模块编译
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。模块具有以下特点: 1 模块本身不被编译入内核映像,从而控制了内核的大小 2 模块一旦被加载,它就和内核中的其他部分一样 一、 什么是模块 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接转载 2013-03-28 18:13:26 · 1612 阅读 · 0 评论 -
MODULE_DEVICE_TABLE
1. MODULE_DEVICE_TABLE (usb, skel_table);该宏生成一个名为__mod_pci_device_table的局部变量,该变量指向第二个参数。内核构建时,depmod程序会在所有模块中搜索符号__mod_pci_device_table,把数据(设备列表)从模块中抽出,添加到映射文件/lib/modules/KERNEL_VERSION/modules.pci转载 2013-04-22 14:32:23 · 1011 阅读 · 0 评论 -
宏定义中的#,##
1、在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。(原文:When you put a # before an argument in a preprocessormacro, the preprocessor turns that argument into a character array. This,combined with the fact t转载 2013-04-25 20:27:26 · 451 阅读 · 0 评论 -
linux的初始化函数(late_initcall和module_init)
在init.h 中有如下定义#define pure_initcall(fn) __define_initcall("0",fn,1)#define core_initcall(fn) __define_initcall("1",fn,1)#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)#转载 2013-04-22 11:05:33 · 1785 阅读 · 0 评论 -
linux电源管理的uevent上报
作为一名嵌入式软件程序猿,很多时候我们都需要知道linux或android等设备的电源使用相关的情况。如是否有充电器连接、是否在充电、是否充满等状态,linux kernel可以通过uevent机制进行上报事件。 源码目录下相关文档: /include/linux/power_supply.h // 公用的一些数据结构等的定义,包括电源的各项属性、状态及读写这些属性的一些接口函原创 2013-05-12 17:25:11 · 3397 阅读 · 0 评论 -
浅谈Linux内核动态模块的编译
Linux内核给开发者提供了灵活的模块加载方式,开发者可根据需要适当地选择静态或动态的方式将模块加入内核当中。静态加载的时候我们只需将驱动文件添加到对应的文件夹中并修改相应的Makefile和Kconfig即可,但是通过动态加载模块的方式,如果只是编译一个小的驱动文件而对内核大动干戈,那样编译的时间不仅长而且修改内核配置文件也是一件多余的工作。那么我们是否可以在不修改内核的前提下单独编译它是如何编转载 2013-02-27 17:32:17 · 325 阅读 · 0 评论 -
进程之基础知识
1、进程会创建新的地址空间:子进程是父进程的复制品,在fork之后子进程获得父进程的数据空间、堆和栈的复制品,这就是子进程所拥有的拷贝。(线程使用当前的地址空间)2、进程结束的五种原因:正常终止: 1>从主函数main返回 2>调用exit 3>调用_exit异常终止:转载 2013-02-27 17:30:05 · 241 阅读 · 0 评论 -
线程同步——读写锁
特性:读写锁也叫共享——排他锁,因为有3种状态, 所以可以有更高的并行性。使用mutex,它的状态要么处于锁住和未锁状态,只有一个线程可以上锁。而读写锁有更多的状态:在读状态锁住,在写状态锁住,未锁住。只有一个线程可以获得写锁,多个线程可以同时获得读锁。当读写锁是写加锁状态时, 在这个锁被解锁之前, 所有试图对这个锁加锁的线程都会被阻塞。当读写锁在读加锁状态时, 所有试图以转载 2013-03-04 14:56:26 · 306 阅读 · 0 评论 -
线程同步——互斥量
我们可以通过pthread提供的互斥量接口来保护我们的数据,确保每次只有一个线程访问。从本质上说就是一把锁,我们在访问共享数据的时候设置(上锁),在访问完成后释放(解锁)。当我们解锁互斥量的时候,如果有多余一个的线程被阻塞,则所有阻塞在这个锁的进程都被唤醒,变成可以运行的状态。接下来,只有一个线程开始运行并设置锁,其他的看到互斥量仍然是被锁定,继续等待。1. 初始化:线程的转载 2013-03-04 14:57:17 · 298 阅读 · 0 评论 -
workqueue
1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.工作队列(workqueue)是另外一种将工作推后执行的形式.工作队转载 2013-03-05 11:07:13 · 480 阅读 · 0 评论 -
Linux 内核WorkQueue阅读笔记
Workqueue的名字就和他的功能一样:需要处理的工作列表和工作的添加删除(貌似没有看到如何删除的)、以及工作的调度执行。需要处理的工作列表通常都维护在内核对象workqueue_struct里面。系统里面可以有多个workqueue_struct。内核部分的工作添加到了工作队列keventd_wq。而fs/aio.c里面实现了自己的工作队列aio_wq。workqueue_struct转载 2013-03-05 11:07:57 · 750 阅读 · 0 评论 -
linux INIT_WORK 创建工作队列
Linux 2.6内核使用了不少工作队列来处理任务,他在使用上和 tasklet最大的不同是工作队列的函数可以使用休眠,而tasklet的函数是不允许使用休眠的。工作队列的使用又分两种情况,一种是利用系统共享的工作队列来添加自己的工作,这种情况处理函数不能消耗太多时间,这样会影响共享队列中其他任务的处理;另外一种是创建自己的工作队列并添加工作。(一)利用系统共享的工作队列添加工作:转载 2013-03-05 11:10:29 · 5152 阅读 · 0 评论 -
进程间通讯概述管道通讯信号通讯共享内存
为什么进程间需要通信?1、数据传输:一个进程需要将它的数据发送给另一个进程。2、资源共享:多个进程之间共享同样的资源。3、通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。4、进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。Linux进程间通信(IPC)转载 2013-03-05 11:10:53 · 346 阅读 · 0 评论 -
线程同步——条件变量
1.互斥量的存在问题:互斥量是线程程序必需的工具,但它们并非万能的。例如,如果线程正在等待共享数据内某个条件出现,那会发生什么呢?它可以重复对互斥对象锁定和解锁,每次都会检查共享数据结构,以查找某个值。但这是在浪费时间和资源,而且这种繁忙查询的效率非常低。在每次检查之间,可以让调用线程短暂地进入睡眠,比如睡眠三秒钟,但是因此线程代码就无法最快作出响应。真正需要的是这样一种方法:当线转载 2013-03-05 11:11:31 · 548 阅读 · 1 评论 -
揭开linux内核中container_of的神秘面纱
在linux 内核中有一个大名鼎鼎的宏container_of(),这个宏是用来干嘛的呢?我们先来看看它在内核中是怎样定义的。呵呵,乍一看不知道是什么东东。我们先来分析一下container_of(ptr,type,member),这里面有ptr,type,member分别代表指针、类型、成员。看一个例子:Struct test {转载 2013-03-05 11:11:47 · 241 阅读 · 0 评论 -
关于task_struct的认识
在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段. 当我们调用fork() 时, 系统会为我们产生一个task_struct结构。然后从父进程,那里继承一些数据, 并把新的进程插入到进程树中, 以待进行进程管理。因此了解task_struct的结构对于我们理解任务调度(在linux 中任转载 2013-02-27 16:10:15 · 387 阅读 · 0 评论 -
Linux内核的编译流程简析
在内核的 Makefile 中会在多处地方看到 FORCE ,比如: # vmlinux image - including updated kernel symbols vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE 实际转载 2013-02-27 16:14:29 · 369 阅读 · 0 评论 -
Linux进程状态解析之R、S、D、T、Z
R (TASK_RUNNING),可执行状态。只有在该状态的进程才可能在CPU上运行。同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。正在CPU上执行的进程定义为RUNNING状态、可执行但尚未被调度转载 2013-02-27 16:44:20 · 303 阅读 · 0 评论 -
更换linux/android的启动logo
更改linux或者android开机启动的logo:到linux 内核源码根目录下执行makemcnuconfig,按如下层次依次进入:->DeviceDrivers ->Graphicssupport选择help查看详细信息:CONFIG_LOGO: Enableandselectframebufferbo转载 2013-02-27 16:48:00 · 560 阅读 · 0 评论 -
进程的用户ID探究
一、进程与权限A.进程是Linux/Unix操作系统中最重要的抽象之一。B.进程是一个处于执行期的程序(目标代码存储在某种介质上)A process is a program(object code stored on some media) in the midst of execution.而进程在执行过程中经常涉及到文件访问操作等。1.一个运行中转载 2013-02-27 16:51:56 · 303 阅读 · 0 评论 -
linux内核及驱动开发中有关__init,__exit和__initdata的用法
要了解Linux Kernel代码的分段信息,需要了解一下gcc的__attribute__的编绎属性或定义的函数或数,__attribute__主要用于改变所声明据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn表示没有返回值、pure表明函数除返回值外,不会通过其它(如全局变量、指针)对函数外部产生任何影响。但这里我们比较感兴趣的是对转载 2013-03-11 17:35:25 · 495 阅读 · 0 评论 -
浅析linux中open系统调用
从2.6.19的linux内核开始,内核的系统调用使用函数syscall,其函数原型为:int syscall(int number, ...)其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。以x86平台为例,系统调用号在内核源码中的路径是/arch/x86/include/asm/unistd_32.h头文件中定义。其中大部分以__NR_开头,比如open的系统调用转载 2013-02-27 17:27:47 · 659 阅读 · 0 评论 -
设备驱动之一 - linux读写信号量semaphore .
读写信号量(rw_semaphore) 读写信号量对访问者进行了细分,或者为读者,或者为写者,读者在保持读写信号量期间只能对该读写信号量保护的共享资源进行读访问,如果一个任务除了需要读,可能还需要写,那么它必须被归类为写者,它在对共享资源访问之前必须先获得写者身份,写者在发现自己不需要写访问的情况下可以降级为读者。读写信号量同时拥有的读者数不受限制,也就说可以有任意多个读者同时拥有一个读转载 2013-07-06 17:44:06 · 789 阅读 · 0 评论