Tag Archives: Fedora

Fedora 和 Ubuntu 上的段错误

LilyBBS discussion: Segmentation Fault on Fedora and Ubuntu

昨天和别人在小百合 LinuxUnix 版发帖讨论 Segmentation Fault 的问题,整理如下:

flyDutchMan 根据自己存在段错误的程序在 Fedora 和 Ubuntu 上的运行结果,认为 Fedora 和 Ubuntu 对段错误的处理方式不同,他的观点是(原文链接:[href: http://bbs.nju.edu.cn/vd83468/bbscon?board=LinuxUnix&file=M.1185514732.A&num=6528 ] ):

“Ubuntu认为段错误是很严重的错误,它的做法是当即中断程序。而Fedora对待段错误是比较宽容的,在Fedora中即使检测到某个进程正在对不属于它的地址空间进行操作,他仍然会完成这次“非法”的操作,并且继续执行后面的操作,只是在终端上打印出“Segment Fault”的错误。所以在这个程序中,虽然发生了段错误,Fedora仍然能运行到connect(),是整个程序顺利跑起来。”

并给出了一个 demo:

#include <stdio.h>

#define IP_ADDR_LENGTH 16
#define UMP_FUNC_NUM 6

int main() {
  char addr[IP_ADDR_LENGTH];
  addr[0] = '';
  strcat(addr, "172.16.64.181" );

  char (*taskpath)[IP_ADDR_LENGTH];

  printf("the address is %dn", &amp;taskpath[0]);

  int a;
  int b;

  sprintf(taskpath[0], "%s", addr);

  printf("taskpath[0]: %sn", taskpath[0]);
  printf("finish!n");
  fflush(stdout);

  return 0;
}

“在Ubuntu下运行,系统不会输出“ finish! ”这句,而是在输出taskpath[0]的地址后直接终止程序。注意,上面的int a; int b;声明不能省略,也不能赋值!因为如果省略或赋值,就不会产生Segment Fault!(赋值的话系统就会把这两个变量分配到Stack中,这就与对Heap操作的taskpath没有冲突了)”

我的回复是(原文链接:[href: http://bbs.nju.edu.cn/vd83468/bbscon?board=LinuxUnix&file=M.1185532985.A&num=6538 ]):

首先,我的观点,没有所谓 Fedora 和 Ubuntu 对段错误处理的不同。因为它们都是使用 Linux kernel,而内存管理只要 Kernel 的版本一样,我认为不会有不同的处理方式。

其次,我想纠正上文中的一个说法(可能有些讨人嫌哈,不过一些东西还是说清楚点儿好,因为 ls 用这个来解释自己的程序):

> 赋值的话系统就会把这两个变量分配到Stack中,这就与对Heap操作的taskpath没有冲突了

无论你赋值与否,这两个变量都是存在在 stack 中的; taskpath 也不是对 heap 进行操作,它只是存在于 stack 上的一个指针变量。

> 因为如果省略或赋值,就不会产生Segment Fault!

在我的系统中,都会产生段错误。

最后,我来给出我对这个问题的解释:

就上文的 demo 程序来说, a, b, addr, taskpath 都是存在于 stack 上的,这个很清楚,调试过 C 语言程序的人应该都知道,我就不解释了。

1. 为什么会出现段错误?

因为 taskpath 是一个野指针,在使用之前没有被赋值,所以 taskpath 会指向任何位置,对一个随机的位置进行写操作,显然会出现段错误。

2. 为什么同一个程序,定义不定义 a, b 会影响段错误出来的时间点?

虽然上面说 taskpath 会指向任何位置,但是这个说法并不完全正确。因为大家知道,taskpath 是在 stack 上的一个变量,而 stack 呢,是一直在重复使用的一个区域。要明确这一个概念,在操作系统中执行一个可执行文件,程序并不是从 main 开始的,它要先执行一段代码,也就是平常所说的 crt(c runtime)。这个一般是由 lib 提供的,其中要调用一些库函数,所以呢,在 main 执行之前, stack 被 crt 用过(这是最关键的一点)。

因为 stack 使用完是会被释放的,这也就是在调用函数时 function prologue 和 epilogue 所干的事情,开辟栈空间和恢复栈空间,主要动作就是移动栈指针。那么 taskpath 所占的位置很有可能被 crt 用过(不是一定),那么如果被 crt 写过,比如被 crt 用做保留 ebp 或者什么其他的寄存器,它的值就是确定的(在一定程度上说)。

如果 crt 在 taskpath 这个位置上保存过寄存器的值,尤其是 ebp 或者 esp,那么很有可能 taskpath 就指向此程序栈空间的某个位置。那么写 taskpath 指向的内存产生的段错误就没那么 critical,或者说操作系统对它的指针在自己栈空间中的操作比较容忍,就不会立即停止程序的运行。但是如果 crt 没有在这个位置上进行操作,那么这个位置就可能是某个垃圾地址,比如说操作系统自己的内存空间,那么写 taskpath 指向的内存就会造成很严重的后果,操作系统会立马检查出来终止它的运行。

我在 Ubuntu 7.04 下使用 gcc 4.1.2 编译、调试并反汇编的结果显示:两个程序唯一的不同是 taskpath 在堆栈上的位置,当定义 int a, b; 时,taskpath 是 $ebp -40 而这个地址没有被操作过;当不定义 int a, b; 时, taskpath 是 $ebp - 32,这个地址曾经被 crt 使用过。所以按照上面的解释,系统报段错误的时间不一样。

如果熟悉 GDB 的话,可以很容易的用调试证明这一点。计算出 crt 入口的 $ebp 和 main 中 $ebp 的差,以此计算出 taskpath 保存的位置,在上面设置 watch point,从 _init 执行到 main,看其中有没有对 taskpath 所在位置进行写操作。

3. 为什么不同的操作系统,结果不一样?
这个就比较简单了。kernel 不一样,可能内存管理的方式不一样。使用的 lib 或者 gcc 不一样,可能引起 crt 的汇编结果不一样。这两个都能导致同样的程序报错的时间不一样。

所以,不是 Fedora 或者 Ubuntu 能不能容忍段错误,没有 OS 容忍段错误,不同只是在产生段错误够不够 crucial 需要得到立即处理。

Ubuntu is so cool

上次用Breezy,还没有体验到Ubuntu的好处,这次装上Dapper,才发现Ubuntu用起来那么爽,真是很酷,怨不得有那么多FANS。

1.免费的光盘派送

虽然说这个不是起决定作用,但是能有正版的无差错的安装光盘,谁愿意去下载那些很难保证质量的光盘镜像呀,就像上次下的FedoraCore5,更新安装时候还好,起码剩个系统用,全新安装时候根本无法成功安装。

2.方便的软件安装,丰富的更新源

这也是那么多人喜欢Debian的原因,可以很方便的管理软件,而且,apt-get命令简化了很多麻烦的操作,避免了编译软件包或者直接安装时候出来的某个某个库找不到的罗嗦,直接apt-get就能把所有需要安装的部分自动下载安装好。况且,Ubuntu的更新源也很多,国内国外教育网都有,速度也还可以。

3.全面的使用和配置文档,尤其是中文文档

Ubuntu Wiki涵盖的范围非常广泛,包含了许多可能遇到的问题和解决方案,尤其是中文方面,比其他版本的要好很多,遇到问题再也不用Google半天了。

4.简单快速的系统

显然,只有一张CD,安装速度也很快,半个小时左右,比起5张CD的FC5,4张CD的RedFlag,DVD的SUSE是方便多了。启动速度也很快,配置好以后启动不超过1分钟。简单并不代表不好,基本功能已经很全了,需要什么更多的软件apt-get一下就行。而且桌面也很漂亮,GNOME桌面能做成这个效果,真的很不错了。

总之,作为桌面使用来说,Ubuntu绝对是相当相当的优秀。到现在为止发现它唯一不爽的地方就是,它不带金山词霸,这也是垃圾RedFlag为数不多能让我赞一下的地方:),BTW,RedFlag自带的应用软件真的是很丰富。

P.S. 贴一下速度比较快的源,sources.list For Dapper(6.06),系统自带的那些个不是很好,比较难连上,速度也不行。
# http://www.ubuntulinux.nl/source-o-matic
#
# If you get errors about missing keys, lookup the key in this file
# and run these commands (replace KEY with the key number)
#
# gpg --keyserver subkeys.pgp.net --recv KEY
# gpg --export --armor KEY | sudo apt-key add -

# Ubuntu supported packages (packages, GPG key: 437D05B5)
deb http://de.archive.ubuntu.com/ubuntu dapper main restricted
deb http://de.archive.ubuntu.com/ubuntu dapper-updates main restricted
deb http://security.ubuntu.com/ubuntu dapper-security main restricted universe multiverse

# Ubuntu community supported packages (packages, GPG key: 437D05B5)
deb http://de.archive.ubuntu.com/ubuntu dapper universe multiverse
deb http://de.archive.ubuntu.com/ubuntu dapper-updates universe multiverse

# CN99
deb http://ubuntu.cn99.com/ubuntu/ dapper main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse

# LUPA浙江
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-security main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-updates main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/archive/ dapper-backports main restricted universe multiverse
deb http://mirror.lupaworld.com/ubuntu/ubuntu-cn/ dapper main restricted universe multiverse

# Ubuntu官方
deb http://archive.ubuntu.com/ubuntu/ dapper main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ dapper-backports main restricted universe multiverse
deb http://ubuntu.cn99.com/ubuntu-cn/ dapper main restricted universe multiverse

# 上海交通大学
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-backports main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-proposed main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-security main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu/ dapper-updates main multiverse restricted universe
# deb http://ftp.sjtu.edu.cn/ubuntu-cn/ dapper bleeding main multiverse restricted universe

# 清华大学
# deb http://mirror.net9.org/ubuntu/ dapper main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-backports main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-proposed main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-security main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu/ dapper-updates main multiverse restricted universe
# deb http://mirror.net9.org/ubuntu-cn/ dapper main multiverse restricted universe

Copyright © 2005-2006 Solrex Yang. All rights reserved.

Linux学习笔记(3)

关于GRUB的一些记录

鉴于最近RP的一些危机,电脑也一直在欺负我,就写下了一些遭遇。下面的Linux和GRUB版本以FC4,FC5及其附带的GRUB为例,GRUB大概是0.95版本。

2000重装以后的GRUB恢复:

重装Windows会把MBR(Main Boot Record)覆盖掉,这时候就进不了Linux系统了,可以用很多方法进行GRUB的恢复,我用的可以说是最简单的方式,因为我有FC4的第一张安装盘。
光盘启动,按F5(FC默认,其他版本大概是F4)->
在boot:下输入命令:linux rescue->
出现#提示符后输入命令:chroot /mnt/sysimage 注:意思大概是把内核改为硬盘上的而不是光盘->
在#后输入:grub-install /dev/hda 注:该是把grub重装到第一块硬盘->
重新启动

这里install大概就是把GRUB重装到MBR里,而因为GRUB的引导配置是在/boot扇区下面放着的,所以原来的引导配置都还在,一般情况下不需要更改。可,不幸的是,我恰恰碰到了该修改的情况。

重建GRUB后的Windows系统寻找:

我不知道安装盘为什么会把2000安到第二个区,其实我也不知道这个第二个区是什么意思,大概似乎不是分区。
由于原来的GRUB引导配置对XP的默认是:
rootnoverify (hd0,0) //启动XP系统的扇区
chainloader +1

而现在却启动不了,可以用下面的方法一个一个尝试:
启动后按任意键,出现GRUB引导选择界面->
光标移动到Windows项上,按’e’,就是edit的意思->
将光标移动到第一项启动的分区选择上,再按’e’->
修改(hd0,0),其中前面的0代表是第几块硬盘,默认0为第一块,后面的0代表第几个扇区。->
一般情况下修改后面一个扇区,一个一个的试,改了以后按’b’,就是boot的意思,如果启动不了,按’Esc’,再加1,然后boot.
我是试到了2,才成功的。

修改GRUB的引导配置:

上面的介绍是在启动时候人工修改,但是每次改也是很麻烦的事情(除非你想藉此来增加别人进入你系统的难度),可以到/boot扇区中修改掉GRUB的配置。
用root用户进入Linux,在/boot/grub/目录下找到grub.conf文件,打开,会看到下面的东西(唉,我还是记不住vi怎么用,只好用emacs打开):
default=0 //缺省启动系统标号,0表示FC5,1表示XP
timeout=3 //GRUB启动界面等待时间
splashimage=(hd0,7)/grub/splash.xpm.gz //GRUB默认的背景文件
hiddenmenu //大概是要不要显示选择界面,这个意思是如果不按任意键就直接进入默认系统
title Solrex’s Fedora Core 5(2.6.15-1.2054_FC5) //GRUB选择菜单的选项标题
root (hd0,7) //boot所在扇区
kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet //Linux内核所在位置
initrd /initrd-2.6.15-1.2054_FC5.img
title Solrex’s Windows XP professional
rootnoverify (hd0,0) //启动XP系统的扇区
chainloader +1
显然修改一下rootnoverify (hd0,0)后面那个0就行了。


Copyright © 2005-2006 Solrex Yang. All rights reserved.

Fedora Core 5下载地址

今天早上把FC5下完了,链接不太好找,这里把自己找到的链接贴一下,要是有感兴趣的兄弟可以去下。是清华的FTP站,晚上下的速度在200k左右,要是早上起来下能达到1M,当然得是在教育网。这个站上别的资源也挺多的。ftp://166.111.72.5:21 匿名访问 站点名: ASTAFTP 端口: 21 站点总容量: 601878191 … Continue reading

SCI

这个标题可能会让人很惊讶,可不是说我有那个能力去发表SCI论文,只是有幸认识了一个强人。 也是前天才听到的,在这以前我实在是想不到我认识的人里居然能有那么牛的,人和人是不能比啊! 朋友是物理系的,也是老乡,刚上大学第一次来学校的时候和他睡对铺,也就认识了,还挺聊得来。郑州一高的,开封人,脾气很好的一个小孩,当初人家也是不得志,物理竞赛考到了全省第八还是第九名,差点没被北大录取,而且据他说还是我的一个初中同学比他考得高了一名,把他争取来的名额给顶了。 结果来到南大物理系后也是奋发图强,再加上是自己喜欢的东西,就专心钻研到物理里面,大一时候就开始写论文,好像还拿了全校基础学科论坛的几等奖,大二就带着一帮兄弟做实验。前天碰到他的时候,说开始几篇文章投出去以为没多大希望了,没想到一下子录用了两篇,还都是在SCI里的杂志,还都是他第一作者。在全国的重点高校里我们这一届好像是唯一的一个。 当时真是让我觉得有点,震惊,虽然我知道他很厉害,但是没想到有那么厉害。看来这小子的出国之路是一片光明了,咱们学校又要流传一个牛人的故事了。 刚在上篇文章中说到身边很多其貌不扬的牛人,瞬间就又给我来了一个例子。 可以说每个人都有自己的命运吧,羡慕归羡慕,假如让我再重新来一遍的话,我可能还是愿意没什么改变。好多事情后悔归后悔,但是真正让你再重新选择,怕你还是舍不得曾经有过的精彩或者落寞。《Jane Eyre》里Helen … Continue reading

Linux学习笔记(2)

ADSL拨号: 本来以为是很难的一件事情,还专门去下什么modem的驱动和PPPOE的拨号软件。安装软件时提示与系统某个文件有冲突。 就想,系统是不是自带有软件啊!才发现原来Fedora自己带一个网络配置软件system-config-network,有字符和图形界面。在X Window下可以从程序里面直接找到。打开以后就直接发现有个xDSL选项,类似与Win下面的设置,不过更简单。然后有一个控制软件,从那里面把ADSL激活就行了。还发现Linux下的ADSL连接可比Win下快多了,基本一激活就能用了。 播放媒体文件: 有几个软件,Mplayer,RealPlayer,Xmms。主要是Mplayer,安上它之后,基本所有的格式都能播放,但是我发现它还是不能播DVD,不知道是哪个解码器没安。 安装Mplayer比较麻烦,到它的官方网站上下载MPlayer-1.0pre7.tar.tar主程序,essential-20050412.tar.bz2编码包,Blue-1.5.tar.bz2皮肤。 先将编码包解压缩,拷贝到/usr/local/lib/codecs/下面,必须放到这个目录下。 … Continue reading

Linux学习笔记(1)

装完了Linux,吃了个小亏,由于从硬盘安装时候选择安装语言的地方和光盘安装不一样,结果只是装了一个英文版的系统,没有安装中文支持。于是麻烦就来了: 挂载Windows下的分区,不能识别中文文件名。打开网页文件,不能显示中文。 后来从Windows的字体库里拷贝出来一个SimSum字体,放到/usr/share/fonts/chinese/TrueType里,修改/etc/fonts/fonts.conf,添加SimSum到中文字体的前面。这个是添加新的字体,不过我似乎看到也有几个好像是中文的字体,不过我没找到字体文件在哪儿。然后把/etc/sysconfig/i18n改为LANG="zh_CN.GB18030"。这个是让系统显示中文界面。 到现在我也不知道这两个是哪个在起作用,这样搞过以后,Firefox能显示中文的网页了,这样我就能看到下载下来的有关Linux配置的文件了,不用再启动Windows了。但是中文的TXT文件和中文文件名还不能正常显示。 然后就设定开机自动挂载Win下面的硬盘分区。先在/mnt/目录下建立c,d……文件夹。在/etc/fstab里添加: /dev/hda1 /mnt/c vfat … Continue reading

Fedora Core 4

上次重装Windows系统,直接把硬盘全部格式化,那个最小化的Redhat 9.0也给格掉了。这个学期想学一下Linux下的服务器配置和应用软件的使用,只好再安。不过这次安装的是Fedora Core 4核心的Linux,上次从同学那拷的光盘镜像。 我原以为刻录好第一张光盘做引导,安装第二张的时候会让你选择从硬盘还是从光盘安装,谁知道安到一半还是和Redhat一样,让插入第二张光盘。我只刻了一张,有什么用啊!唉,Linux还是太不人性化了,只好上网查查怎么从硬盘安装。 从硬盘安装的方法有好几种,我试验了多次,重启了N次电脑,都是碰到错误了,就再进Windows上网查。最后使用的是我认为最简单的方法,把四个iso安装光盘镜像放到一个FAT 32格式的分区里,要直接放到主目录下,就是分区盘符下。然后从Fedora的第一张光盘的isolinux目录里拷贝出vmlinuz和initrd.img,也放到同样位置。再从Radhat第一张光盘里拷贝出loadlin.exe,放到同样位置。然后自己编写一个批处理文件autoboot.bat,里面内容是“loadlin vmlinuz … Continue reading