- 博客(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
904
原创 内核中的同步问题(二)
读写锁读者和写者问题是一个常见的同步问题。尤其在操作系统和驱动中经常有这种问题。中断处理程序改写数据,用户进程读取数据就是这种情况。这种情况简单来说就是,可以同时读,但不能同时写,也不能读和写同时进行。内核实现了读写锁来处理这种情况。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
742
原创 用gdb调试程序
GDB是个牛人写的一个很牛的调试器,虽然是命令行的,但是功能强大,习惯了就会非常喜欢,就像vim那样。如果你还是傻傻的通过printf语句来调试程序,赶紧行动起来,GDB是你很好的选择。所谓调试程序,无非就是一个确认的过程,代码是正确的?错误的?在这个过程中出现任何问题都很正常,==写成了=?使用了空指针?不管问题多么弱智,都不能证明自己有多弱智,没有出过错误的程序员是那些从来不写代码的程序员。
2011-01-05 23:33:00
987
原创 Linux内核数据结构(二)
队列队列也是一种链表,只是针对队列的操作只能是从队尾插入,从队首删除。在操作系统中有很多这种数据结构的用武之地,一般是一个进程产生数据,另外一个进程处理数据,如Linux中网络数据包的处理,进程之间使用管道通信等,都是这种情况。Linux内核中队列称作kfifo,其对应的源文件时kernel/kfifo.c,中包含了其声明。kfifo提供了两种操作,入队(in)和出队(out),为了记录下一次出队或者入队的位置,kfifo维护了两个变量in offset和out offset。入队操作会将数据拷贝至队列中,
2011-01-05 16:27:00
2724
原创 Linux内核数据结构(一)
链表,队列,映射,二叉树等数据结构是程序设计中常用的数据结构。为了统一这些数据结构的操作接口,Linux内核开发者实现了一些标准的操作接口及实现(使用了大量的GNU扩展特性),以达到代码重用,开发者应该尽量使用这些标准接口,避免实现自己的再创造,虽然那样看起来很酷,很有劲。有关链表传统的双向链表实现方法是在链表元素中加入两个指针,然后用这些指针来构造双向链表。如下所示struct node{ value_type value; struct element *prev; struct el
2011-01-05 11:55:00
2114
原创 内核中的同步问题
内核中的同步问题是一个很复杂,而且经常让人感到崩溃的问题,即使是应用程序,多线程也是一个复杂的问题。一般的同步方法包括有锁机制,互斥量,信号量等。而各种应用场景下的方法的选择,尤其是涉及不同的上下文和不同的体系结构时,这个问题会更加复杂。锁和互斥量是保护临界区的两种基本方法。锁保证在同一时刻只有一个线程能够进入临界区,其他线程只有在这个线程退出后在能进入临界区。其使用方法很简单,#include spinlock_t lock = SPIN_LOCK_UNLOCK; /* 也可以初始成SPIN_LOCK_L
2011-01-05 10:51:00
877
原创 Linux内核开发与普通应用开发的不同之处
1、使用GNU C编写,但不能使用c库以及标准头文件。2、没有内存保护机制3、不能进行浮点运算4、每个程序对应一个堆栈,但堆栈大小时固定的。5、由于内核与硬件打交道,所以同步、并行以及可移植性很重要。
2011-01-05 00:51:00
1387
原创 LInux内核编译
Linux内核学习的前提就是必须要有内核源代码,对于源代码,你可以去kernel.org去下载,也可以使用git进行获取。推荐使用git,这样以后一个命令git pull就可以更新内核。下面是Linux的内核源代码树:配置以及编译内核:在编译内核之前,可以根据需要进行裁剪和优化。有多种方法可以编译内核。基于文本命令行的工具$make config这个工具一个接一个的遍历所有选项,用户可以根据自己的需要进行配置。选项配置通常有boolean和tristates两种,前者的可选范围为yes或者no,后者的可选范
2011-01-05 00:18:00
785
2
原创 从源文件到可执行程序(二)
关于目标文件源程序经过编译器编译后生成目标文件。目标文件的格式基本和可执行文件相同,只是在进行链接之前,有些符号和函数的地址是未知的,还需要经过链接来进行调整。Linux系统中采用的可执行文件格式是ELF,因此目标文件也采用这种格式进行存储。不光目标文件,静态库文件(其实就是多个目标文件以及一些索引)和动态库文件也都采用这种格式进行存储。使用命令file可以查看文件格式。$ file example.oexample.o: ELF 32-bit LSB relocatable, Intel 80
2011-01-04 10:40:00
833
原创 初学用make进行项目管理
Make是Linux下的项目管理工具,其作用就是自动进行程序的编译和链接,从而生成指定的目标程序。其工作时的执行步骤如下,(1)读入所有的Makefile(2)读入被include的其他Makefile(后面有解释)(3)初始化文件中的变量(4)推到隐式规则,然后分析所有规则(5)为所有目标创建依赖关系链(6)根据依赖关系,决定生成那些目标(7)执行命令其规则格式一般为目标文件 : 依赖文件 执行命令(生成目标文件,本行必须以Tab键开头)其中目标文件可以是
2011-01-03 21:11:00
1130
原创 从源文件到可执行程序
<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
1641
原创 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
728
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人