
linux
文章平均质量分 72
jeffade
这个作者很懒,什么都没留下…
展开
-
博客寻址
http://blog.chinaunix.net/uid/26820608/frmd/-1.html Linux驱动http://blog.youkuaiyun.com/intrepyd?viewmode=contents APUE笔记 http://blog.youkuaiyun.com/sailor_8318?viewmode=contentshttp://blog.youkuaiyun.com/goo原创 2012-06-04 14:22:24 · 674 阅读 · 0 评论 -
Linux进程的实际用户ID和有效用户ID
本人对Unix下的进程的实际用户ID和有效用户ID一直都比较迷惑,没有完全搞清楚。最近温习APUE(《高级UNIX环境编程》),终于对这两个概念有了一个清晰的认识,看来经典著作绝对需要温习多遍,才能领略其中的奥秘。 在Unix进程中涉及多个用户ID和用户组ID,包括如下:1、实际用户ID和实际用户组ID:标识我是谁(据说这是一个变态的哲学问题,难死一片哲学家)。也就是登转载 2012-05-18 09:35:10 · 420 阅读 · 0 评论 -
Linux进程间通信(IPC)之二——命名管道(FIFO)
1 命名管道(FIFO) 经过前文《Linux进程间通信(IPC)之一——管道》介绍管道,但是管道应用的一个重大缺陷就是没有名字,因此只能用于亲缘进程之间的通信。后来从管道为基础提出命名管道(named pipe,FIFO)的概念,该限制得到了克服。FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲转载 2012-05-18 09:33:09 · 540 阅读 · 0 评论 -
Linux下线程同步对象(3)——条件变量
在前面两篇文章中介绍了Linux下的互斥量和读写锁两种线程同步对象。这两种线程同步对象都是用来保护特定资源(内存,文件句柄等)的。假如某个线程需要等待系统处于某种状态下才能继续执行,Linux为了解决这种问题引入了条件变量这种线程同步对象,本文简要介绍一下条件变量。 条件变量必须要与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生。线程在等待条件变量和通知条件变量之前都转载 2012-05-18 09:31:55 · 390 阅读 · 0 评论 -
Linux下线程同步对象(1)——互斥量
进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等资源,是一个静态的概念。线程是CPU调度的对象,是一个动态的概念。一个进程之中至少包含有一个或者多个线程。这些线程共享该进程空间的内存和文件句柄资源,多个线程竞争地获得这些资源。为了防止多个线程访问资源的不一致性,多线程编程一个很重要的任务就是控制好线程同步。本文简单介绍一下Linux的同步对象和使用时的一些注意事项转载 2012-05-18 09:30:54 · 397 阅读 · 0 评论 -
I/O端口和I/O内存的访问
I/O端口访问的一种途径是直接使用I/O端口操作函数;另一种途径是将I/O端口映射到内存进行访问。I/O内存的访问步骤:首先调用request_mem_region()申请资源,接着将寄存器地址通过ioremap()映射到内核空间虚拟地址,之后可以通过linux设备访问编程接口访问这些设备的寄存器了。访问完成之后,应对ioremap()申请的虚拟地址使用iounmap()进行释放,并释放rel原创 2012-06-04 10:09:12 · 672 阅读 · 0 评论 -
linux DMA
DMA(Direct Memory Access)直接内存存储,是一种无需CPU参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。DMA方式的数据传输由DMA控制器(DMAC)控制,在传输期间,CPU可以并发地执行其他任务。当DMA结束以后,DMAC通过中断通知CPU数据传输已经结束,然后CPU执行相应的终端服务程序进行后处理。 当DMA针对的目的地址与Cache缓存的对象有重叠区域原创 2012-06-04 16:03:34 · 1047 阅读 · 0 评论 -
vm_area_struct (VMA)
Linux内核中,关于虚存管理的最基本的管理单元应该是struct vm_area_struct了,它描述的是一段连续的、具有相同访问属性的虚存空间,该虚存空间的大小为物理内存页面的整数倍。 下面是struct vm_area_struct结构体的定义:[cpp] view plaincopyprint?"font-family:Microsoft YaHei转载 2012-06-04 10:56:45 · 5803 阅读 · 0 评论 -
android wifi 移植记录
我用的是 Ralink 的网卡,所以 wifi 网卡的名字是 ra0, 在网上看了一些文章,要改很多地方。不就是个网卡名字问题吗? 我有 驱动源码, 就直接在源码里把名字改成 mlan0 就得了。在源码中找到注册网卡的 register_netdev 或者 register_netdevice 函数,直接在注册前把名字给它改咯。。。 strcpy( pNe转载 2012-05-16 10:38:51 · 371 阅读 · 0 评论 -
高端内存与低端内存
高端内存是Linux中一个重要的概念,初涉Linux时曾经对这个概念非常迷惑。实际上这个概念比较简单,理解这个概念,需要追溯一下Linux的内存管理。 从前,CPU的地址总线只有32位,再早的就不再追溯了。32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间,在物理上理论上最多拥有4G内存(除了IO地址空间,实际内存容量小于4G),逻辑空间也只能描述4G的转载 2012-06-04 15:04:36 · 2388 阅读 · 0 评论 -
Linux内核DMA机制
DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 在第一种情况下,调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡转载 2012-06-04 16:03:05 · 21937 阅读 · 0 评论 -
Linux下线程同步对象(2)——读写锁
上文介绍了Linux下线程同步对象——互斥量,本文介绍另外Linux下同步对象——读写锁。 如果多个线程同时读资源,则不会发生竞争关系,也不会出现资源的不一致性,所以读资源的时候不需要同步对象保护。但是如果写某个资源的时候,必须要进行同步保护,否则将会出现不一致性。在上文的互斥量中,不管读写都加锁,这样对于读资源操作非常多,但写资源非常少的情况下,效率会比较低。Linux提供了读写转载 2012-05-18 09:31:31 · 570 阅读 · 0 评论 -
Linux进程间通信(IPC)之一——管道
1 管道(Pipe) 管道是UNIX系统IPC的最古老的形式,并且所有的Unix系统都提供这种通信机制,当然也包括Linux。这样利用管道进行IPC管道具有如下限制:1、历史原因造成管道是半双工的,数据只能单向流动。如果想双向通信,必须要创建两个管道。2、管道通信双方必须有亲缘关系的进程之间(父子进程或者兄弟进程之间)。2 管道的创建#inc转载 2012-05-18 09:32:25 · 595 阅读 · 0 评论 -
copy_to_user和copy_from_user
在内核的学习中会遇到很多挺有意思的函数,而且能沿着一个函数扯出来很多个相关的函数。copy_to_user和copy_from_user就是在进行驱动相关程序设计的时候,要经常遇到的两个函数。由于内核空间与用户空间的内存不能直接互访,因此借助函数copy_to_user()完成用户空间到内核空间的复制,函数copy_from_user()完成内核空间到用户空间的复制。下面我们来仔细的理一下这两个函转载 2012-06-07 20:04:14 · 2636 阅读 · 1 评论 -
设备文件系统剖析与使用 udev mdev devfs
一、什么是Linux设备文件系统 首先我们不看定义,定义总是太抽象很难理解,我们先看现象。当我们往开发板上移植了一个新的文件系统之后(假如各种设备驱动也移植好了),启动开发板,我们用串口工具进入开发板,查看系统/dev目录,往往里面没有或者就只有null、console等几个系统必须的设备文件在这儿外,没有任何设备文件了。那我们移植好的各种设备驱动的设备文件怎么没有啊?如果要使用这些转载 2012-06-13 19:40:23 · 1226 阅读 · 0 评论 -
Linux设备驱动程式学习(1)-字符设备驱动程式
今天进入《Linux设备驱动程式(第3版)》第三章字符设备驱动程式的学习。这一章主要通过介绍字符设备scull(Simple Character Utility for Loading Localities,区域装载的简单字符工具)的驱动程式编写,来学习Linux设备驱动的基本知识。scull能够为真正的设备驱动程式提供样板。一、主设备号和此设备号主设备号表示设备对应的驱动程式;次设备转载 2012-05-11 14:46:08 · 300 阅读 · 0 评论 -
理解和认识udev
因为本身从事存储行业,在工作中多次碰到用户有这样的要求:我的linux系统中原来有一块SCSI硬盘,系统分配的设备文件是/dev/sda。现在新增加了一个外置的磁盘阵列,通过SCSI卡连接。但接上这个磁盘阵列后,/dev/sda变成了磁盘阵列的硬盘了,原来内置的SCSI硬盘变成了 /dev/sdb,我希望将设备文件固定下来。 过去,我总是对用户说,这个比较麻烦,因为/dev/sda等文件转载 2012-05-23 20:06:38 · 359 阅读 · 0 评论 -
Linux 内核调试器 调试指南
简介:调试内核问题时,能够跟踪内核执行情况并查看其内存和数据结构是非常有用的。Linux 中的内置内核调试器 KDB 提供了这种功能。在本文中您将了解如何使用 KDB 所提供的功能,以及如何在 Linux 机器上安装和设置 KDB。您还将熟悉 KDB 中可以使用的命令以及设置和显示选项。Linux 内核调试器(KDB)允许您调试 Linux 内核,四川旅游。这个恰如其名的工具实质上是内核代码的转载 2012-06-12 18:39:32 · 1528 阅读 · 0 评论 -
_wait_event 具体实现过程
是不是当前进程要等待某个condition,然后就把它加到这个等待这个condition的wq中 _wait_event是当前进程调用它,也就是在宏DEFINE_WAIT(_wait)中的_wait就是把当前进程设置成_wait加到等待队列里, 以上基本正确 如果condition发生,是这个进程被唤醒设置成running而不是整个等待队列wq被唤醒? 如果cond转载 2012-06-11 10:19:05 · 2153 阅读 · 1 评论 -
Linux slab 分配器剖析--M. Tim Jones, 顾问工程师, Emulex
动态内存管理内存管理的目标是提供一种方法,为实现各种目的而在各个用户之间实现内存共享。内存管理方法应该实现以下两个功能:最小化管理内存所需的时间 最大化用于一般应用的可用内存(最小化管理开销) 内存管理实际上是一种关于权衡的零和游戏。您可以开发一种使用少量内存进行管理的算法,但是要花费更多时间来管理可用内存。也可以开发一个算法来有效地管理内存,但却要使用更多的内存。最终,特定应用程转载 2012-06-11 11:17:16 · 620 阅读 · 0 评论 -
在Ubuntu上为Android系统编写Linux内核驱动程序
在智能手机时代,每个品牌的手机都有自己的个性特点。正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了。据统计,截止2011年5月,AppStore的应用软件数量达381062个,位居第一,而Android Market的应用软件数量达294738,紧随AppStore后面,并有望在8月份越过AppStore。随着Android系统逐步扩大市场占有率,终转载 2012-05-10 10:13:15 · 515 阅读 · 0 评论 -
我的Linux书架
工作几年来,一直从事Linux内核驱动方面的开发。从接触Linux到现在,读过不少Linux方面的书籍,现把认为很不错的一部分列出来和大家分享一下。入门类一直认为,在一个系统上学习开发之前,首先需要熟悉这个系统的使用。鉴于天朝的国情,绝大部分人第一个接触的操作系统就是Windows,因此对于这绝大部分人来说,如果要学习Linux开发,学会使用这个系统都是必不可少的一个环节。现在的Lin转载 2012-06-08 18:55:31 · 462 阅读 · 0 评论 -
Linux内核中的汇编语言
AT&T的汇编格式在intel格式中大多使用大写字母,而AT&T格式中使用小写字母。 在 AT&T 汇编格式中,寄存器名要加上 '%' 作为前缀;而在 Intel 汇编格式中,寄存器名不需要加前缀。例如: AT&T 格式 Intel 格式 pushl %eax push eax 在 AT&T 汇转载 2012-06-08 10:41:48 · 2200 阅读 · 0 评论 -
信号量与自旋锁的比较
sem就是一个睡眠锁.如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。这时处理器获得自由去执行其它代码。当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。信号量一般在用进程上下文中.它是为了防止多进程同时访问一个共享资源(临界区).spin_lock叫自旋锁.就是当试图请求一个已经被持有的自旋锁.这个任务就会一直进转载 2012-06-08 09:13:49 · 1579 阅读 · 0 评论 -
Linux的IO端口和IO内存
CPU对外设端口物理地址的编址方式有两种:一种是IO映射方式,另一种是内存映射方式。 Linux将基于IO映射方式的和内存映射方式的IO端口统称为IO区域(IO region)。IO region仍然是一种IO资源,因此它仍然可以用resource结构类型来描述。 Linux管理IO region: 1) request_region() 把一个给定区间的IO端口分配给一转载 2012-06-02 09:21:37 · 463 阅读 · 0 评论 -
request_mem_region,ioremap 和phys_to_virt()
Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏:(1)request_mem_region()宏,请求分配指定的I/O内存资源。(2)check_mem_region()宏,检查指定的I/O内存资源是否已被占用。(3)release_mem_region()宏,释放指定的I/O内存资源。 这三个宏的定义如下:转载 2012-06-01 16:05:30 · 944 阅读 · 0 评论 -
编译linux内核步骤
下载新内核以后,先把Linux-2.6.18.2.tar.bz2 复制到/usr/src/ 的下面tar –jxvf Linux-2.6.18.2.tar.bz2 cd Linux-2.6.18.2 make mrproper 把原来编译产生的垃圾删除 配置内核可以根据需要与爱好使用下面命令中的一个:#make config (基于文本的最为传统的配置界面)转载 2012-05-14 14:53:37 · 338 阅读 · 0 评论 -
Linux设备驱动程式学习(3-补)-Linux中的循环缓冲区
参考资料:《Linux内核中的循环缓冲区》作者:西邮 王聪 严重感谢文章作者! 但是(可能是源码版本问题)有些结论并不正确: “而kfifo_init只会接受一个已分配好空间的fifo->buffer,不能和kfifo_free搭配,用kfifo_init分配的kfifo只能用kfree释放。” 阅读源码能够得出这样的结论:kfifo_init和kfifo_alloc分配的kfifo转载 2012-05-11 14:48:01 · 382 阅读 · 0 评论 -
Linux设备驱动程序学习
前言: 接触ARM-Linux已经有9个多月了,经历了毕业设计和公司的练习设计,对ARM-Linux有了一定的了解,也让我爱上了ARM-Linux,决心以后从事Linux的工作。 8月份开始,我算是从头认认真真,一步一个脚印地学习ARM-Linux。先后对博创UP-NETARM2410-S和友善之臂SBC2440V4进行了系统移植,包括U-Boot1.2.0、Linux2.6.转载 2012-05-11 14:44:27 · 401 阅读 · 0 评论 -
Android硬件抽象层(HAL)概要介绍和学习计划
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space),其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?从技术实现的角度来看,转载 2012-05-10 10:10:51 · 320 阅读 · 0 评论 -
如何阅读Linux源码
1, 关于操作系统理论的最初级的知识。不需要通读并理解《操作系统概念》《现代操作系统》等巨著,但总要知道分时(time-shared)和实时(real-time)的区别是什么,进程是个什么东西,CPU和系统总线、内存的关系(很粗略即可),等等。 2, 关于C语言。不需要已经很精通C语言,只要能熟练编写C程序,能看懂链表、散列表等数据结构的C实现,用过gcc编译器,就可以了。当然,转载 2012-05-10 09:20:19 · 406 阅读 · 0 评论 -
Linux设备驱动程序学习(13)-Linux设备模型(总线、设备、驱动程序和类)
文章的例子和实验使用《LDD3》所配的lddbus模块(稍作修改)。总线总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连, 甚至是内部的虚拟"platform"总线。总线可以相互插入。设备模型展示了总线和它们所控制的设备之间的实际连接。在 Linux 设备模型中, 总线由 bus_type 结构表示, 定义在 :stru转载 2012-05-11 14:58:08 · 305 阅读 · 0 评论 -
Linux设备驱动程式学习(5)-高级字符驱动程式操作[(2)阻塞型I/O和休眠]
这一部分主要讨论:假如驱动程式无法立即满足请求,该如何响应?(65865346)一、休眠进程被置为休眠,意味着他被标识为处于一个特别的状态并且从调度器的运行队列中移走。这个进程将不被在任何 CPU 上调度,即将不会运行。 直到发生某些事情改变了那个状态。安全地进入休眠的两条规则:(1) 永远不要在原子上下文中进入休眠,即当驱动在持有一个自旋锁、seqlock或 RCU 锁时不能睡眠;关转载 2012-05-11 14:49:13 · 430 阅读 · 0 评论 -
Linux设备驱动程式学习(4)-高级字符驱动程式操作[(1)ioctl and llseek]
今天进入《Linux设备驱动程式(第3版)》第六章高级字符驱动程式操作的学习。一、ioctl大部分设备除了读写能力,还可进行超出简单的数据传输之外的操作,所以设备驱动也必须具备进行各种硬件控制操作的能力. 这些操作常常通过 ioctl 方法来支持,他有和用户空间版本不同的原型:int (*ioctl) (struct inode *inode, struct file *filp,转载 2012-05-11 14:48:37 · 410 阅读 · 0 评论 -
Linux设备驱动程式学习(2)-调试技术
今天进入《Linux设备驱动程式(第3版)》第四章调试技术的学习。 一、内核中的调试支持在前面已建议过:学习编写驱动程式要构建安装自己的内核(标准主线内核)。最重要的原因之一是:内核研发者已建立了多项用于调试的功能。但是由于这些功能会造成额外的输出,并导致能下降,因此发行版厂商通常会禁止发行版内核中的调试功能。为了实现内核调试,我在内核配置上增加了几项: Kernel hacki转载 2012-05-11 14:46:40 · 407 阅读 · 0 评论 -
Linux内核配置文档(make menuconfig)
make menuconfig 图形化的内核配置2007-04-20 16:56#make mrproper -----删除不必要的文件和目录. #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用) #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)转载 2012-05-10 09:23:37 · 468 阅读 · 0 评论 -
Linux设备驱动程式学习(0) -Hello, world!模块
一个学习Linux设备驱动程式都会碰到的第一个例程:#include #include MODULE_LICENSE("Dual BSD/GPL");static int hello_init(void){ printk(KERN_ALERT "Hello, Tekkaman Ninja !/n"); return 0;}static void h转载 2012-05-11 14:45:38 · 656 阅读 · 0 评论 -
·Linux设备驱动程序学习(12)-Linux设备模型(底层原理)
以《LDD3》的说法:Linux设备模型这部分内容可以认为是高级教材,对于多数程序作者来说是不必要的。但是我个人认为:对于一个嵌入式Linux的底层程序员来说,这部分内容是很重要的。以我学习的ARM9为例,有很多总线(如SPI、IIC、IIS等等)在Linux下已经被编写成了子系统,无需自己写驱动;而这些总线又不像PCI、USB等在《LDD3》上有教程,有时还要自己研究它的子系统构架,甚至要自己添转载 2012-05-11 14:57:27 · 459 阅读 · 0 评论 -
Linux设备驱动程序学习(15)-Linux设备模型(热插拔、mdev 与 firmware)
热插拔有 2 个不同角度来看待热插拔: 从内核角度看,热插拔是在硬件、内核和内核驱动之间的交互。 从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev 和 mdev)的交互。 当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。现在的计算机系统,要求 Linux 内核能够在硬件从系统中增删时,可靠稳定地运行。这就对设备转载 2012-05-11 14:59:59 · 690 阅读 · 0 评论 -
Linux设备驱动程式学习(3)-并发和竞态
今天进入《Linux设备驱动程式(第3版)》第五章并发和竞态的学习。 对并发的管理是操作系统编程中核心的问题之一。 并发产生竞态,竞态导致共享数据的非法访问。因为竞态是一种极端低可能性的事件,因此程式员往往会忽视竞态。但是在电脑世界中,百万分之一的事件可能没几秒就会发生,而其结果是灾难性的。一、并发及其管理 竞态通常是作为对资源的共享访问结果而产生的。在设计自己的驱动程式时,第一个转载 2012-05-11 14:47:20 · 314 阅读 · 0 评论