- 博客(108)
- 资源 (4)
- 收藏
- 关注
原创 GNU ARM汇编--(三)ARM处理器的基本原则
这一篇的知识来源全部来自《ARM System Developer's Guide》 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而h哈佛结构体系的arm核就
2012-05-06 16:25:29
12003
原创 GNU ARM汇编--(二)汇编编译链接与运行
GNU的汇编器是GNU Tools的一部分,可以用来ARM的汇编语言源代码编译为二进制文件.关于GNU汇编器的介绍可以搜索《GNU Assembler Manual》.这里我们只是做一个简短的介绍,对GNU汇编器有一个大概的认识,同时通过两个例子了解一下GNU ARM汇编. 给出一个模板文件: .text
2012-04-26 22:28:46
16291
6
原创 GNU ARM汇编--(一)开篇
在大学的时候,汇编就是学的很烂.一是对汇编这门语言没概念,二是那些指令集很难记清楚,用的机会也少,自然学的不好.但是现在觉得相当有必要重头学习一下汇编.部分原因我在上一篇写完设备模型的总结时提到了而.最近在看一本书《ARM:Assembly Language Programming》,作者是Peter Knaggs & Stephen Welsh.作者在开头也提出学习汇编的必要性和重要性,借他们的
2012-04-22 20:02:26
14553
3
原创 linux文件系统的系统分析--(十七)总结
从文件系统写到设备模型,写的很舒畅,写的过程中自己重新做了整理思考,很有收获. 那我之所以将文件系统和设备模型放在一起写,因为linux的哲学就是一切都是文件,所以文件系统和设备模型是分不开的,单单理解设备模型还是不充分的,理解了文件系统后,再看设备模型就会有不一样的感受. 王阳明说"知行合一",做了这么多的理论上的分析后,就需要找块板子来实践,验证和加
2012-04-15 22:30:49
1746
原创 linux文件系统的系统分析--(十六)sysfs和设备模型--从platform和rtc来感受设备模型
分析文件系统后,再分析设备模型,从而自然的理解了sysfs和设备模型的关系.既然linux2.6引入了设备模型和sysfs,那肯定是比之前更为先进的.下面要分析下内核中如何利用设备模型去管理设备的,在内核的driver目录下有好多子目录,比如iic spi pci input usb这些子系统的框架,这些框架都是在设备模型的模型之上再去抽象的.我们仅以platform这种虚拟的总线类型和rtc这种
2012-04-15 22:16:05
2416
原创 linux文件系统的系统分析--(十五)sysfs和设备模型--Class
看完了bus device和driver,终于到了设备模型上层架构的最后一个单元:class.class的初始化同样是在driver_init下: driver_init-->classes_initint __init classes_init(void){ class_kset = kset_create_and_add("class", NULL, NULL); if
2012-04-14 23:22:25
2151
原创 函数的调用与自增(减)运算符
记得前段时间有个技术群里有哥们给了这么一道面试题: int i = 5; printf("%d %d %d\n",i++,i++,i++); 刚一看以为答案就是5 6 7 ,其实答案是7 6 5.为什么这样?因为函数调用参数压栈的顺序是从右到左的. 可以写个简单的函数调用关系,然后反汇编分析一下://name:add.
2012-04-13 21:27:27
3541
原创 linux文件系统的系统分析--(十四)sysfs和设备模型--Driver
看完了device看driver,给出device_driver的结构体:struct device_driver { const char *name; struct bus_type *bus; struct module *owner; const char *mod_name; /* used for built-in modules */ bool suppre
2012-04-11 21:26:02
1861
原创 linux文件系统的系统分析--(十三)sysfs和设备模型--Device
分析完了bus,接下来分析device: 同样在driver_init-->devices_initint __init devices_init(void){ devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); if (!devices_kset) return -ENO
2012-04-11 20:32:09
2574
原创 linux文件系统的系统分析--(十二)vfs层的三个hashtable
在vfs_caches_init中有三个重要的hashtable:mount_hashtabledentry_hashtable inode_hashtableHashtable有什么作用?主要的查找的效率很高,vfs层用这三个就是为了提高查找效率。另外一个,inode和dentry是内存中的数据,而数据的来源是硬盘,如果我们获得了inode和dentry数据,加到hashtable中,方
2012-04-10 21:01:54
4700
原创 linux文件系统的系统分析--(十一)sysfs和设备模型--Bus
在分析设备模型的bus之前,我们看一下初始化的过程,很有意思: start_kernel-->rest_init-->kernel_init-->do_basic_setup 在do_basic_setup中有个usermodehelper_init有意思,凭感觉,这个函数与kobject_uevent有联系,kobject_uevent做什么的,就是内核空间来通知用户空间
2012-04-08 21:45:30
2544
原创 linux文件系统的系统分析--(十)sysfs和设备模型--kobject、kset和ktype
前面分析了这么多,是因为设备模型和文件系统的联系很紧密,了解sysfs是为了更好的理解设备模型。 在分析sysfs的时候,我们也看到了sysfs_dirent与kobject的紧密联系。这一次我们分析下kobject kest和ktype。在vfs层,sysfs的目录和属性文件都有对应的inode和dentry;而在sysfs中,不管目录还是文件,都用统一的sysfs_diren
2012-04-08 19:08:57
3007
原创 linux文件系统的系统分析--(九)sysfs下属性文件的读写
sysfs的属性文件的读写,我们先看下open,open系统调用最终会调用sysfs_open_file struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata; //获取sysfs_dirent结构struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
2012-04-07 17:54:52
6607
原创 linux文件系统的系统分析--(八)sysfs中sysfs_dirent与inode dentry的关系
对于具体的文件系统,因为在vfs层下,所以必须有inode和dentry才能用,但从前两篇中我们只看到了sysfs中的sysfs_dirent搭建起来的目录树,通过sysfs_dirent与kobject的紧密关系,也可看到kobject的层次关系。 但前面的创建目录和创建文件,都没有inode和dentry,下面我们就看看sysfs中sysfs_dirent与inode dentr
2012-04-07 16:01:05
6424
2
原创 linux文件系统的系统分析--(七)sysfs下属性文件的创建
属性文件的建立和目录的建立相差不大,因为不管目录还是普通文件,都由一个sysfs_dirent代表sysfs_create_file-->sysfs_add_file-->sysfs_add_file_modeintsysfs_add_file_mode(struct sysfs_dirent *dir_sd,conststruct attribute *attr, int type,
2012-04-07 15:28:26
3069
原创 linux文件系统的系统分析--(六)sysfs下目录的创建
对sysfs和设备模型有了解的都会知道sysfs实际是为了将设备模型导出到用户空间的一个内存文件系统。 设备模型的关键结构体kobject会组成设备模型的树形结构,而sysfs的关键结构体sysfs_dirent也是类似的树形的结构,vfs中的dentry同样是类似的树形结构。 sysfs目录文件的创建都是由设备模型的上层构件(bus device driver c
2012-04-07 11:29:20
6879
2
原创 linux文件系统的系统分析--(五)路径名的查找
do_path_lookup是文件系统中最基本的函数,也是非常重要的,里面各种情况,各种goto,总之各种坑爹。。 没能把所有的goto都理清,只看了标准情况下的路径查找,但主要的关键点都是一样的,弄清了关键点,心中对文件系统的路径名查找就有了概念。不管绝对路径名,相对路径名,还是带符号链接的,又有什么质的区别呢? do_path_lookup分为两步:
2012-04-07 10:29:35
4872
原创 linux文件系统的系统分析--(四)sysfs的安装和挂载
在上一次分析rootfs的安装时,其实是不准确的,应该称为安装根文件系统。 安装根文件系统分为两个阶段: 1、内核安装特殊rootfs文件系统,该文件系统仅提供一个作为初始安装点的空目录。 2、内核在空目录上安装实际根文件系统。比如pc上的ext4,比如嵌入式中用到的各种flash的根文件系统。 这一次分析sysfs,发现sy
2012-04-05 19:11:26
6570
原创 linux文件系统的系统分析--(三)rootfs的安装
在《linux文件系统的系统分析--(一)文件系统类型的注册》我们以rootfs为例分析了文件系统是如何注册的,接着我们就分析rootfs的安装。 在mnt_init-->init_mount_tree:static void __init init_mount_tree(void){ struct vfsmount *mnt; struct mnt_namesp
2012-04-03 18:51:03
4830
原创 linux文件系统的系统分析--(二)文件系统类型的注册
因为linux支持模块机制,所以我们可以将文件系统编译为模块,所以文件系统系统类型的注册的注册有多种方式:要么已经包含在内核映像中,要么作为一个模块被动态加载。我们关注的重点是rootfs和sysfs,他们其实在系统初始化的时候就注册并安装好了,没有rootfs,linux就没法玩了。以rootfs的注册为例,来分析一下文件系统类型的注册: 在start_kernel-->vfs
2012-04-03 15:43:17
4286
原创 linux文件系统的系统分析--(一)vfs和数据结构
linux的虚拟文件系统层的特点在于把很多不同种类文件系统的共同信息放入内核;可以通过vfs的转换来利用linux所支持挂载的实际文件系统。实际上,因为有了vfs,也可以较为方便的按照vfs的一些接口将文件系统移植过来,比如win下的ntfs和fat32就是如此。在open read等系统调用之后就是到vfs_read 等式样的函数,在vfs层做些处理后,再根据当前操作的路径所挂载在哪个文件系统下
2012-04-02 20:54:55
3884
原创 linux文件系统的系统分析--开篇
在看设备模型的时候,对sysfs、devtmpfs有一定了解,也分析过linux下的一个简单的文件系统:omfs。但当时的分析比较散,现在觉得还是得花时间再系统的整理一下为好。因为目前对linux的内存管理还不熟悉,关于vfs中高速缓存的部分暂且略过。这次开篇,准备按照:根文件系统挂载和“/”;文件系统的挂载,sysfs的分析(基于内存的fs和基于磁盘的fs还是有不少差距的),然后在这个基础上再分
2012-04-02 19:13:14
1860
原创 linux设备驱动下的工作队列(workqueue)
从表面和使用来看,工作队列类似与tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。但实际上它们有一些非常重要的区别:1、 tasklet在软件中断上下文中运行,因此所有的tasklet代码都必须是原子的。而工作队列函数在一个特殊内核进程的上下文总运行,所以具有更好的灵活性。更主要的是工作队列函数可以休眠。2、 tasklet始终运行在被初始提交的同一处理器上
2012-03-29 18:50:19
3665
原创 linux设备驱动下的tasklet
在设备驱动的中断处理中经常会用到tasklet,在前面稍微看了下linux的软中断后,tasklet就很容易理解了。Tasklet也要用到软中断,而tasklet的用法和定时器的用法很相似。 同样的在main.c中, start_kernel-->softirq_init 先给出tasklet的结构体定义:str
2012-03-29 18:47:30
1653
原创 linux的动态定时器--时间轮
定时器—有时也称为动态定时器或内核定时器—是管理内核时间的基础。定时器是一种软件功能,即允许在将来的某个时刻,函数在给定的时间间隔用完时被调用。注意的是定时器并不会周期运行,它在超时后就自行销毁,这也是定时器被称为动态定时器的一个原因。动态定时器不断地创建和销毁,而且它的运行次数也不受限制。 定时器在内核代码中属于一个基础组件。要想完全弄清楚linux2.6中内核定时器的实现,得......
2012-03-29 00:33:27
8341
原创 linux的软中断
本来没想到写这个的,但在研究linux的动态定时器时,发现动态定时器是用到软中断机制的,所以对软中断做一个浅显的了解: 在分析过程中,愈加的觉得kernel是一个整体,想单单搞懂驱动是有难度的,因为kernel是个整体。你要懂驱动,就要对驱动模型,就要对文件系统、内存管理和进程调度等等有一定了解。 下面来分析soft irq:在kernel/softirq.c中:
2012-03-28 23:07:14
3266
原创 简单hash就是数组加链表
简单的hash就是用数组加链表的组合来实现,这种hash很简单,但hash的思想在那。 贴出代码:hash.h:#ifndef _HASH_H_#define _HASH_H_typedef struct _ListNode{ struct _ListNode *prev; struct _ListNode *next; void *data;}L
2012-03-26 21:56:41
3975
原创 暗时间----有感而发
首先给出《暗时间》一文的链接:http://mindhacks.cn/2009/12/20/dark-time/ 该文的作者在我看来是一个牛人,同样作为一个写blog的程序员,我的blog都是技术的一些点滴,他已经上升为方法论或者说思维方法的高度。虽然还没到哲学的高度,但他的高度值得我学习奋斗相当长的时间了。 当年看了他的一篇文章后毅然从南京来到了深圳,从事嵌入式linu
2012-03-22 19:01:35
1227
原创 linux设备驱动--异步通知
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 异步通知意味着设备可以通知应用程序自身可被访问,实现了异步IO。 在ldd3中给出了设备驱动实现异步信号的详细操作顺序:1.当发出F_SETOWN,什么都没发生,除了一个值被赋值给filp->f_owner.2.当
2012-03-21 21:56:21
1131
原创 berkeleyDB的安装
下载的版本是berkeyleyDB.5.3,安装过程很简单: #../dist/configure #make #make install安装的默认目录是:/usr/local/BerkeleyDB.5.3网上抄了个程序:#include #include #include #include //only this head
2012-03-20 20:13:32
2213
原创 linux设备驱动--非阻塞IO与select,poll调用 (续2)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在续1中了解中bitmap在select的用法后,下面就开始分析select Select系统调用的调用过程: Sys_select-->core_sys_select-->do_select-->f_op->
2012-03-19 20:35:44
1453
原创 linux设备驱动--非阻塞IO与select,poll调用 (续1)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在《linux设备驱动--非阻塞IO与select,poll调用》中给出了驱动中poll函数的一般写法,很简单明了。但是为什么这么写,还是要稍微追究一下的。<!--@page {margin:2cm}p {margin
2012-03-19 20:22:56
1478
原创 linux设备驱动--阻塞IO(续)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->在《linux设备驱动--阻塞IO》中对阻塞IO的实现做了一个模板式的概述,也给出了内核中等待队列的系列函数接口的使用。但是阻塞IO到底是如何实现的,总觉得还有层窗户纸没戳破,这个让我有点不爽。 于是再多花点时间戳个小窟窿看看,但是仅仅
2012-03-16 22:42:41
1558
原创 linux设备驱动--非阻塞IO与select,poll调用
在linux应用编程中,经常要用到select和poll调用。select和poll的功能本质是一样的,都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读或写。 举几个工作中用到的select或poll例子:1、编解码中,监听几个编解码通道的;2、对于主CPU,监听挂载的几个dsp;3、socket编程等等。 对于驱动程序而言,上面的系统调用通过驱动程序
2012-03-13 23:26:32
2298
原创 linux设备驱动--阻塞IO
阻塞与非阻塞IO与进程的调度密切相关,但是深入的进程调度的算法还不到时间去研究,因为个人的方针是先以设备模型和文件系统为突破口,循序渐进。 这个并不妨碍目前对设备驱动中的阻塞与非阻塞IO的理解。 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。
2012-03-12 23:06:28
2204
原创 linux设备驱动--并发与竞态之信号量
信号量(semaphore)是用于保护临界区的一种常用手段。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但不同的是,当获取不到信号量时,进程不会“自旋”而是进入休眠等待状态。 To use semaphores,kernel code must include . 信号量的初始化: 直接创建信号量: void
2012-03-10 23:58:57
1184
原创 linux设备驱动--并发与竞态之自旋锁
自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段。与信号量不同,自旋锁可在不能休眠的代码中使用,比如中断处理例程。(自旋锁api的一些衍生都是与中断相关的)在正确使用的情况下,自旋锁通常可以提供比信号量更高的性能。 自旋锁相关的主要操作如下:This initialization may be done at compile time as follo
2012-03-10 20:04:07
1528
原创 linux设备驱动--并发与竞态之原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 linux下面有两类原子操作,一类是整形原子操作,一类是位原子操作。 原子操作目前仅仅做个测试验证学习,至于原子操作在哪些场合适合用到,还需要今后更多的驱动以及内核代码的fuck。 整形原子操作的函数说明:void atomic_set(atomic_t *v, int i);atom
2012-03-10 00:15:03
2380
原创 linux设备模型之字符设备
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->Linux设备模型之字符设备以ldd中scull为例来分析一下设备模型的字符设备。对scull做了一些修改,一方面是内核版本不同引起的一些定义上的修改,另一方面是去除了scull中包括的scullpipe等设备。为使得我们对字符设备更清晰,我们不
2012-02-25 20:46:49
3839
原创 linux设备模型之kset
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->同样的,在看kset-example之前我们先看下kset的相关操作函数。kobject_set_name设定kobject的name这个函数就是前面介绍的kobject_set_name_vargs函数的封装。kset_init
2012-02-25 20:41:55
1991
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅