自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 资源 (1)
  • 收藏
  • 关注

原创 用gdb调试程序(二)

<br />变量的追踪<br /> <br />struct people{<br />    int age;<br />    int num;<br />};<br /> <br />struct people * you;<br /> <br />调试程序时,总是想观察某个数据的值,使用print可以输出某个变量的值,当然,你也可以输出某个结构体的值,前提是你有一个指向该结构体的指针p。如<br /> <br />使用print/p<br />则,只要在合适的断点处,使用下面的命令,就可以输出这个结

2011-01-08 14:24:00 852

原创 内核中的同步问题(二)

读写锁读者和写者问题是一个常见的同步问题。尤其在操作系统和驱动中经常有这种问题。中断处理程序改写数据,用户进程读取数据就是这种情况。这种情况简单来说就是,可以同时读,但不能同时写,也不能读和写同时进行。内核实现了读写锁来处理这种情况。rwlock_t rwlock = RW_LOCK_UNLOCKED;Process Reader:read_lock(&rwlock);/* Critical Section */read_unlock(&rwlock);Process Writer:write_lock(&

2011-01-07 14:16:00 700

原创 设备模型和模块

2.6版本的内核对于设备驱动进行了很大的改动,而且这些改动现在还在继续。

2011-01-06 00:54:00 894

原创 用gdb调试程序

GDB是个牛人写的一个很牛的调试器,虽然是命令行的,但是功能强大,习惯了就会非常喜欢,就像vim那样。如果你还是傻傻的通过printf语句来调试程序,赶紧行动起来,GDB是你很好的选择。所谓调试程序,无非就是一个确认的过程,代码是正确的?错误的?在这个过程中出现任何问题都很正常,==写成了=?使用了空指针?不管问题多么弱智,都不能证明自己有多弱智,没有出过错误的程序员是那些从来不写代码的程序员。

2011-01-05 23:33:00 939

原创 Linux内核数据结构(二)

队列队列也是一种链表,只是针对队列的操作只能是从队尾插入,从队首删除。在操作系统中有很多这种数据结构的用武之地,一般是一个进程产生数据,另外一个进程处理数据,如Linux中网络数据包的处理,进程之间使用管道通信等,都是这种情况。Linux内核中队列称作kfifo,其对应的源文件时kernel/kfifo.c,中包含了其声明。kfifo提供了两种操作,入队(in)和出队(out),为了记录下一次出队或者入队的位置,kfifo维护了两个变量in offset和out offset。入队操作会将数据拷贝至队列中,

2011-01-05 16:27:00 2648

原创 Linux内核数据结构(一)

链表,队列,映射,二叉树等数据结构是程序设计中常用的数据结构。为了统一这些数据结构的操作接口,Linux内核开发者实现了一些标准的操作接口及实现(使用了大量的GNU扩展特性),以达到代码重用,开发者应该尽量使用这些标准接口,避免实现自己的再创造,虽然那样看起来很酷,很有劲。有关链表传统的双向链表实现方法是在链表元素中加入两个指针,然后用这些指针来构造双向链表。如下所示struct node{    value_type value;    struct element *prev;    struct el

2011-01-05 11:55:00 2025

原创 内核中的同步问题

内核中的同步问题是一个很复杂,而且经常让人感到崩溃的问题,即使是应用程序,多线程也是一个复杂的问题。一般的同步方法包括有锁机制,互斥量,信号量等。而各种应用场景下的方法的选择,尤其是涉及不同的上下文和不同的体系结构时,这个问题会更加复杂。锁和互斥量是保护临界区的两种基本方法。锁保证在同一时刻只有一个线程能够进入临界区,其他线程只有在这个线程退出后在能进入临界区。其使用方法很简单,#include spinlock_t lock = SPIN_LOCK_UNLOCK; /* 也可以初始成SPIN_LOCK_L

2011-01-05 10:51:00 835

原创 Linux内核开发与普通应用开发的不同之处

1、使用GNU C编写,但不能使用c库以及标准头文件。2、没有内存保护机制3、不能进行浮点运算4、每个程序对应一个堆栈,但堆栈大小时固定的。5、由于内核与硬件打交道,所以同步、并行以及可移植性很重要。

2011-01-05 00:51:00 1293

原创 LInux内核编译

Linux内核学习的前提就是必须要有内核源代码,对于源代码,你可以去kernel.org去下载,也可以使用git进行获取。推荐使用git,这样以后一个命令git pull就可以更新内核。下面是Linux的内核源代码树:配置以及编译内核:在编译内核之前,可以根据需要进行裁剪和优化。有多种方法可以编译内核。基于文本命令行的工具$make config这个工具一个接一个的遍历所有选项,用户可以根据自己的需要进行配置。选项配置通常有boolean和tristates两种,前者的可选范围为yes或者no,后者的可选范

2011-01-05 00:18:00 734 2

原创 从源文件到可执行程序(二)

关于目标文件源程序经过编译器编译后生成目标文件。目标文件的格式基本和可执行文件相同,只是在进行链接之前,有些符号和函数的地址是未知的,还需要经过链接来进行调整。Linux系统中采用的可执行文件格式是ELF,因此目标文件也采用这种格式进行存储。不光目标文件,静态库文件(其实就是多个目标文件以及一些索引)和动态库文件也都采用这种格式进行存储。使用命令file可以查看文件格式。$ file example.oexample.o: ELF 32-bit LSB relocatable, Intel 80

2011-01-04 10:40:00 791

原创 初学用make进行项目管理

Make是Linux下的项目管理工具,其作用就是自动进行程序的编译和链接,从而生成指定的目标程序。其工作时的执行步骤如下,(1)读入所有的Makefile(2)读入被include的其他Makefile(后面有解释)(3)初始化文件中的变量(4)推到隐式规则,然后分析所有规则(5)为所有目标创建依赖关系链(6)根据依赖关系,决定生成那些目标(7)执行命令其规则格式一般为目标文件 : 依赖文件    执行命令(生成目标文件,本行必须以Tab键开头)其中目标文件可以是

2011-01-03 21:11:00 1055

原创 从源文件到可执行程序

<br />gcc将源代码文件处理成可执行程序,要经过四个过程:预处理——编译——汇编——链接。<br /><br />1、预处理<br />预处理过程主要处理的是#include、#define、#if、#else、#ifdef、#endif等指令以及处理注释、行号(用于调试)等工作。<br />这里假设源文件包括source.c以及其包含的所有头文件。执行下面的命令可以指示编译器在完成预处理过程后停止。<br />$gcc -E source.c -o source.i<br /><

2011-01-03 21:08:00 1576

原创 Linux程序开发基础(一)

一、参数与选项在命令行启动程序时,通常需要输入命令,而这些命令中就包括很多参数,如输入命令ls -l,其中的ls以及-l都是参数。参数还可以细分为操作数以及选项,如ls -l中的-l就是选项,而echo "hello world"中的hello world就是操作数。选项的作用包括控制程序行为或者为程序提供特定的信息。如命令gdb -f filename,filename就是选项参数,通过参数向程序(gdb)提供附加信息。POSIX中对于参数设定了特定的标准,如下:1,程序名称不得少于两个字

2011-01-03 20:59:00 691

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除