“bss data code” segment

10月 17th, 2008 by allesgut

BSS段

在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

在内存中 bss段全部置零。BSS是block started by symbol的缩写。因为未初始化的变量没有对应的值,所以并不需要存储在可执行对象中。但是因为C标准强制规定未初始化的全局变量要被赋予特殊的默认值(基本上是0值),所以内核要从可执行代码装入变量(未赋值的)到内存中,然后将零页映射到该片内存上,于是这些未初始化变量就被赋予了0值。这样做避免了在目标文件中进行显式地初始化,减少空间浪费

数据段(data)

在采用段式内存管理的架构中,数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域,换句话说就是存放程序静态分配的变量和全局变量。数据段属于静态内存分配。

代码段(text)

在采用段式内存管理的架构中,代码段(text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。

堆栈

堆栈又称堆栈(stack)在计算机科学中,是一种特殊的链表形式的数据结构,它的特殊之处在于只能允许在链表的一端(称为栈顶,英文为top)进行添加和删除操作。另外堆栈数据结构的实现也可以通过数组来完成。

严格来说堆是指Heap,程序运行时供程序员来支配的一段内存。而栈Stack,多指函数调用时候参数的相互传递存在的内存区域。

由于堆栈数据结构只允许在一端进行操作,因而按照先进后出(LIFO-Last In First Out)的原理工作。

堆栈数据结构支持两种基本操作:压栈(push)和弹栈(pop):

1.                  压栈(入栈):将对象或者数据压入栈中,更新栈顶指针,使其指向最后入栈的对象或数据。

2.                  弹栈(出栈):返回栈顶指向的对象或数据,并从栈中删除该对象或数据,更新栈顶。

判断大端小端

10月 15th, 2008 by allesgut

int i=1; 
    char *p=(char *)&i; 
    if(*p==1)   
          printf(”little”); 
    else
          printf(”big”);

 
   大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节
处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。

请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
解答:
int checkCPU( )
{
    {
          union w
          { 
                  int a;
                  char b;
          } c;
          c.a = 1;
          return(c.b ==1);
    }
}

if (checkCPU)
    printf(”little\n”);
else
    printf(”big\n”);

剖析:

入式系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是
从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0×1234在Little-endian
模式CPU内存中的存放方式(假设从地址0×4000开始存放)为:
内存地址 0×4000 0×4001
存放内容 0×34 0×12

而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0×4000 0×4001
存放内容 0×12 0×34

32bit宽的数0×12345678在Little-endian模式CPU内存中的存放方式(假设从地址0×4000开始存放)为:
内存地址 0×4000 0×4001 0×4002 0×4003
存放内容 0×78 0×56 0×34 0×12

而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0×4000 0×4001 0×4002 0×4003
存放内容 0×12 0×34 0×56 0×78

联合体union的存放顺序是所有成员都从低地址开始存放,面试者的解答利用该特性,轻松地获得了CPU对内存采用Little-endian还是Big-endian模式读写。如果谁能当场给出这个解答,那简直就是一个天才的程序员。

manpages

10月 15th, 2008 by allesgut

manpages-dev - for c functions
manpages-posix-dev - for c headers

apt-cache search gcc|grep doc

试题1

10月 15th, 2008 by allesgut

x&(x-1)表达式的意义

求下面函数的返回值(微软) — 统计1的个数

————————————-

int func(int x)

{

    int countx = 0;

    while(x)

    {

        countx++;

        x = x&(x-1);

    }

    return countx;

}

假定x = 9999

10011100001111

答案: 8

思路: 将x转化为2进制,看含有的1的个数。

注: 每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0。

x & (x-1)

Use the following formula to turn off the rightmost 1-bit in a word, producing 0 if none (e.g., 01011000 ==> 01010000):
x & (x-1)

This may be used to determine if an unsigned integer is a power of 2; apply the formula followed by a 0-test on the result.

判断一个数(x)是否是2的n次方

————————————-

#include

int func(int x)

{

    if( (x&(x-1)) == 0 )

        return 1;

    else

        return 0;

}

int main()

{

    int x = 8;

    printf(”%d\n”, func(x));

}

注:

(1) 如果一个数是2的n次方,那么这个数用二进制表示时其最高位为1,其余位为0。

(2) == 优先级高于 &

vtbl & vptr

10月 14th, 2008 by allesgut

每个类有一个vtbl,
每个对象有一个vptr,指向该类的vtbl.

pC1->f1();    –>

(*pC1->vptr[i])(pC1);

const reference

10月 13th, 2008 by allesgut

C++传递的是对象,如一个对象有100K这么大(用这么大, 是为了使问题更加突出,鲜明), 当传给一个函数作为参数时, 如果不用引用或者指针,直接传这个对象, 那么就会调用复制构造函数重新生成一个对象, 也有100K这么大, 这个新生成的对象才是那个函数中使用的对象。

但是, 如果使用传引用的话, 传递的是这个对象的内存地址,才有4字节。
相比之下, 一个传100K, 一个只有可怜的4字节, 哪个速度快?
当然是引用。

至于传常量引用, 一是不可以修改传进来的对象,增加安全性。
二是可以使用临时生成的对象作为参数, 如果只是一般的引用, 就不可以使用临时对象作为这个函数的参数,如
class C {
};

void func(C & a) {
}
// 调用这个函数, 你就不能这么使用func(C());

但是如
void func(const C &a) {
} //这时你就可以使用func(C());了, 别小看这一点, 这个功能是非常有用的。

install Emacs

10月 13th, 2008 by allesgut

sudo apt-get install cvs

export CVS_RSH=”ssh”

cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/cvsroot/emacs co emacs

./configure

make bootstrap

sudo make install

install dev env

10月 12th, 2008 by allesgut

使用命令#apt-get install build-essential

open telnetd under Debian

10月 11th, 2008 by allesgut

root@2[/]# apt-get install xinetd

root@2[/]# apt-get install telnetd

新建一个文件/etc/xinetd.d/telnet,内容如下,并保存

root@2[/]# nano -w /etc/xinetd.d/telnet

  GNU nano 1.2.4             File: /etc/xinetd.d/telnet                        

# default: on

# description: The telnet server serves telnet sessions; it uses \

#       unencrypted username/password pairs for authentication.

service telnet

{

        disable = no

        flags           = REUSE

        socket_type     = stream

        wait            = no

        user            = root

        server          = /usr/sbin/in.telnetd

        server_args     = -h

        log_on_failure  += USERID

}

lcnja@lcnja:~$ telnet ……

从上面我们可以看到我们已经连接成功了,但是使用root连接的时候会失败,因为默认的安全设置是限制root用户使用telnet连接主机的

本来因为telnet是明文传输的,所以处于安全考虑才限制了root从telnet登陆,如果你需要使用,那么如下修改

root@2[/]# nano /etc/pam.d/login

#

# The PAM configuration file for the Shadow `login’ service

#

# NOTE: If you use a session module (such as kerberos or NIS+)

# that retains persistent credentials (like key caches, etc), you

# need to enable the `CLOSE_SESSIONS’ option in /etc/login.defs

# in order for login to stay around until after logout to call

# pam_close_session() and cleanup.

#

# Outputs an issue file prior to each login prompt (Replaces the

# ISSUE_FILE option from login.defs). Uncomment for use

# auth       required   pam_issue.so issue=/etc/issue

# Disallows root logins except on tty’s listed in /etc/securetty

# (Replaces the `CONSOLE’ setting from login.defs)

#把下面在行注释掉

# auth       requisite  pam_securetty.so

# Disallows other than root logins when /etc/nologin exists

# (Replaces the `NOLOGINS_FILE’ option from login.defs)

auth       requisite  pam_nologin.so

# This module parses /etc/environment (the standard for setting

# environ vars) and also allows you to use an extended config

# file /etc/security/pam_env.conf.

# (Replaces the `ENVIRON_FILE’ setting from login.defs)

auth       required   pam_env.so

# Standard Un*x authentication. The “nullok” line allows passwordless

# accounts.

@include common-auth

# This allows certain extra groups to be granted to a user

# based on things like time of day, tty, service, and user.

# Please uncomment and edit /etc/security/group.conf if you

# wish to use this.

# (Replaces the `CONSOLE_GROUPS’ option in login.defs)

# auth       optional   pam_group.so

# Uncomment and edit /etc/security/time.conf if you n

好,现在一个telnet我们就在debian下面架设好了,当然最后一步本人不建议你做

因为telnet是内镶在xinetd这个服务里面的,所以如果你要启动或者是要停止该服务就要

root@2[/]# /etc/init.d/xinetd

force-reload  reload        restart       start         stop

看上面的自己选择

/usr/sbin/inetd -wW

upgrade

09月 18th, 2008 by allesgut

apt-get update
自动连接网上的服务器,然后更新本机的软件列表。

apt-get upgrade
会按照前面更新的列表,自动下载,安装……

apt-get install
用来安装某个具体的软件的,安什么,就看你自己的了。要想知道有什么,按tab就知道了。

另外,还可以查看本机的软件列表:
apt-cache [search]


登录 | 访问数5445 | 水木BLOG | 水木社区 | 关于我们 | Blog论坛 | 法律声明 | 隐私权保护 | 京ICP证050249号
水木社区Blog系统是基于KBS系统WordPress MU架构的