上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 26 下一页
摘要: 最近在使用filp_open打开文件时遇到到一个问题,当打开一个并不存在的文件时,filp_open返回值值为0xfffffffe,而并不是0(NULL),这是因为内核对返回指针的函数做了特殊处理。内核中的函数常常返回指针,通常如果调用出错,会返回NULL空指针,但linux做了更精妙的处理,能够通过返回的指针体现出来。对任何一个指针,必然有三种情况:一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针。而所谓的错误指针就是指其已经到达了最后一个page,比如对于32bit的系统来说,内核空间最高地址0xffffffff,那么最后一个page就是指的0xfffff000~0x 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(1741) 评论(2) 推荐(0)
摘要: l 符号表链接过程的本质就是把多个不同的目标文件之间相互粘在一起。在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量(函数,变量统称符号)的地址的引用。符号是链接过程中的粘合剂,整个链接过程是基于符号引用完成的,链接过程中很关键的一部分就是符号的管理,每一个目标文件都会有一个相应的符号表(Symbol Table),这个表里面记录了目标文件中用到的所有符号。每个定义的符号有一个对应的值,叫做符号值,对于变量和函数来说,符号值就是它们的地址。符号主要包括定义在本文件内的全局符号,在本文件中引用的全局符号(但定义在其它文件),段名,局部符号,行号信息(目标文件指令与源代 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(585) 评论(0) 推荐(0)
摘要: Linux可执行文件为ELF格式,ELF格式文件主要分为以下几类:1. 可重定位文件(Relocatable File),这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类,如.o文件。2. 可执行文件(Executable File),这类文件包含了直接执行的程序,如/bin/bash等。3. 共享目标文件(Shared Object File),链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;动态链接器可以将几个共享目标文件与可执行文件结合,作为进程映像的一部分来运行,如glibc***.so。4. 核心转储文件( 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(964) 评论(0) 推荐(0)
摘要: 程序设计的模块化是程序员们一直在追求的目标,因为当一个系统十分复杂时,我们不得不将一个复杂的系统逐步分割成小的系统以达到各个击破的目的。复杂的软件也是如此,程序员把每个源代码模块独立的编译,然后按照需要将它们组装起来,这个组装模块的过程就是链接。链接的主要内容就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地链接,链接过程主要包括地址和空间分配,符号决议和重定位等步骤。链接过程如下图所示: 如程序模块main.c中使用了另外一个模块中的func.c中的函数foo(),在main.c中的每一次调用foo函数时都必须知道foo的确切地址,但由于每个模块都是单独编译的,在编译mai 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(151) 评论(0) 推荐(0)
摘要: 编译器是将高级语言翻译成机器语言的一个工具,编译过程是对预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件,编译流程如下图所示。以C语言语句 array[index] = (index+4) * (2 + 6)为例进行分析。1 词法分析首先源代码程序被输入到扫描器(Scanner),扫描器进行词法分析,运用类似于有限状态机的算法将源代码的字符序列分割成一系列的记号(Tokens)。如上述的语句将被分割成:array [ index ] = ( index + 4 ) * ( 2 + 4 )等记号,词法分析产生的记号一般包括关键字,标识符,字面量(数字,字符串等) 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(246) 评论(0) 推荐(0)
摘要: 以helloworld为例分析gcc编译过程:#include <stdio.h>int main(){ printf(“Hello World\n”); return 0;}通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,生成可执行文件a.out实际上gcc hello.c可以分解为4个步骤,分别是预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking),如下图所示:1 预编译gcc –E hello.c –o hello.i,以下为预处理后的输出文件hello.i的内容# 1 "hello.c 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(427) 评论(0) 推荐(0)
摘要: 1. UNIX系统中的设备以文件的形式呈现,用户可以像使用普通文件一样使用设备;2. UNIX-III以普通文件的方式呈现命名管道;3. Killiam的进程文件系统中,进程对应着特殊目录,目录中有进程的相关信息,可通过文件操作来控制进程;4. PLAN9中的服务对应着特殊目录,可通过文件操作来访问系统服务;5. 基于FUSE的一些MultimediaCoding,Compress文件系统,能让用户透明的访问需要编解码的多媒体文件,需要解压缩的压缩文件等;6. 语义文件系统将额外的属性与文件相关联,并建立索引,以丰富文件的访问接口,提供高效的查找服务;以上方式都是在不改变用户接口的情况下提供特 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(135) 评论(0) 推荐(0)
摘要: /** 使用信号实现父子进程之间的同步** TELL_WAIT(): set things up for TELL_xxx & WAIT_xxx * TELL_PARENT(): tell parent we are done* WAIT_PARENT(): wait for parent* TELL_CHILD(): tell child we are done* WAIT_CHILD(): wait for child** SIGUSR1: the signal parent sends to child* SIGUSR2: the signal child sends to pa 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(730) 评论(0) 推荐(0)
摘要: 有五种方式使进程终止:(1) 正常终止:(a) 从main返回。(b) 调用exit。(c) 调用_exit。(2) 异常终止:(a) 调用abort。(b) 由一个信号终止。按照ANSI C的规定,一个进程可以登记多至32个函数,这些函数将由exit自动调用。我们称这些函数为终止处理程序(exit handler),并用exit函数来登记这些函数。回一个值。exit以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也被调用多次。内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(调用exit)调用_exit。进程也可非自愿地由一个信号使其终止。#in 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(156) 评论(0) 推荐(0)
摘要: Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型。 包含进程所有信息的task_struct数据结构是比较庞大的,但是该数据结构本身并不复杂,我们将它的所有域按其功能可做如下划分: · 进程状态(State) · 进程调度信息(Scheduling Information) · 各种标识符(Id... 阅读全文
posted @ 2013-04-19 14:06 ydzhang 阅读(266) 评论(0) 推荐(0)
上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 26 下一页