« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
|
Blog信息 |
blog名称:FoxWolf 日志总数:127 评论数量:246 留言数量:0 访问次数:850006 建立时间:2006年5月31日 |

| |
[必须掌握]Linux Programming by Example:The Fundamentals(Notes One) 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/7 14:21:57 |
3.1 Linux/Unix 地址空间
众所周知,操作系统把一个可执行的程序载入内存中,这个可执行程序可称为一个进程。操作系统为程序访问命令行和环境变量做好准备,将程序开启运行。分配进程的内存可分为以下五个区域:
①代码段 (文本段-text segment)
可执行指令放在这个区域。如果可能,Linux/Unix会安排好相同程序的多个运行实体共享这些实例代码。任何内存只有一份相同程序的指令拷贝。可执行文件中包含文本段的部分叫文本结点(text section)。
②数据段 (data segment)
初始化为非零值的静态分配数据和全局数据存放在数据段中。运行相同程序的每个进程都有自己的数据段。可执行文件中包含数据段的部分是数据结点(data section)。
③BSS 段(Block Started by Symbol)
缺省初始化为零的全局数据和静态分配的数据存放在进程的BSS区域。每个运行相同程序的进程都有自己的BSS区域。当程序运行的时候,把 |
|
[必须掌握]进程在内存中的影像 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 16:49:26 |
进程在内存中的影像.
我们假设现在有一个程序, 它的函数调用顺序如下.
main(...) ->; func_1(...) ->; func_2(...) ->; func_3(...)
即: 主函数main调用函数func_1; 函数func_1调用函数func_2; 函数func_2调用函数func_3
当程序被操作系统调入内存运行, 其相对应的进程在内存中的影像如下图所示.
&nbs |
|
[必须掌握]C语言高效编程的四大绝招 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 10:42:14 |
编写高效简洁的C语言代码,是许多软件工程师追求的目标。本文就是针对编程工作中的一些体会和经验做相关的阐述。
第一招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:
方法A:通常的办法 #define LEN 32 char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,"This is a example!!");
方法B: const char string2[LEN] ="This is a example!"; char * cp; cp = string2 ;
使用的时候可以直接用指针来操作。
从上面的例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要 |
|
[必须掌握]#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD)) 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/11/5 10:40:55 |
#define offsetof(STRUCTURE,FIELD) ((int)((char*)&((STRUCTURE*)0)->FIELD))
上述宏是什么意思?
计算 STRUCTURE 类型中 FIELD 域的偏移量
下面拿KEIL 8051的定义来作点解释: ((s *)0):强制转化成数据结构指针,并使其指向地址0; ((s *)0)->m:使该指针指向成员m &(((s *)0)->m):获取该成员m的地址 (size_t)&(((s *)0)->m):转化这个地址为合适的类型 你可能会迷惑,这样强制转换后的结构指针怎么可以用来访问结构体字段?呵呵,其实这个表达式根本没有也不打算访问m字段。ANSI C标准允许任何值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((s*)0)的结果就是一个类型为s*的NULL指针。如果利用这个NULL指针来访问s的成员当然是非法的,但&(((s*)0)->m) |
|
[必须掌握]BSS段 数据段 代码段 堆栈 文章收藏, 软件技术
FoxWolf 发表于 2007/11/5 10:37:30 |
BSS段 数据段 代码段 堆栈 声明:大部分来自于维基百科,自由的百科全书。
BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
代码段:在采用段式内存管理的架构中,代码段(code segment / text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许自修改程序。 在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
堆栈又称堆栈(stack)在计算机科学中,是一种特殊的链表形式的数据结构,它的特殊之处在于只能允许在链表的一端(称为栈顶,英文为top) |
|
[其它]什么是BSP? 概念解析 文章收藏, 网上资源, 软件技术
FoxWolf 发表于 2007/11/2 15:30:30 |
BSP(Board Support Package)是板级支持包,是介于主板硬件和操作系统之间的一层,应该说是属于操作系统的一部分,主要目的是为了支持操作系统,使之能够更好的运行于硬件主板。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的BSP,例如VxWorks的BSP和Linux的BSP相对于某一CPU来说尽管实现的功能一样,可是写法和接口定义是完全不同的,所以写BSP一定要按照该系统BSP的定义形式来写(BSP的编程过程大多数是在某一个成型的BSP模板上进行修改)。这样才能与上层OS保持正确的接口,良好的支持上层OS。
例如: 在VxWorks中的网卡驱动,首先在config.h中包含该网卡,然后将网卡含网卡的信息的参数放入数组 END_TBL_ENTRY endDevTbl [] 中,系统通过函数muxDevLoad( )调用这个数组来安装网卡驱动。
而在Linux中的网卡驱动,是在space.c中声明该网络设备,再把网卡驱动的一些函数加到dev结构中,由函数ether_setup( |
|
[其它]Eclipse3.3 + MinGW +CDT4.0学习笔 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/10/27 5:27:57 |
本设置的主要目的是在最新版的eclipse3.3(Europa)上开发标准C/C++程序,而不去使用VC++。
因为CDT只提供了开发C/C++项目的IDE,所以我们需要安装MinGW(即 Minimalist GNU For
Windows。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC(GNU Compiler C)产生
Windows32 程序。)和MSYS(Minimal GNU(POSIX)system on
Windows,是一个小型的GNU环境,包括基本的bash,make等等。是Windows下最优秀的GNU环境。):
下载Automated MinGW Installer:MinGW-5.1.3.exe(注意这只是个在线安装程序),执行MinGW-5.1.3.exe;
在choose package向导页,选择Current项;
在choose components向导页,选中MinGW base tools和g++ compiler项;
在c |
|
[Linux学习]linux下path与classpath设置方法, 文章收藏, 软件技术, 电脑与网络
FoxWolf 发表于 2007/10/27 4:16:13 |
1。 首先下载了jdk1.4(for linux)http://sun.java.com/j2sdk 安装好后可以在/usr/java下找到j2sdk1.4.0 然后设置路径 打开/etc/profile文件在末尾加上下面几行 #java JAVA_HOME=/usr/java/j2sdk1.4.0 export JAVA_HOME CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export CLASSPATH PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin export |
|
|