分类: LINUX
2012-03-02 16:57:48
归纳起来,可以将UNIX环境下C编译系统的工作过程下图所示。
C源程序头文件-->预编译处理(cpp)-->编译程序本身-->优化程序-->汇编程序-->链接程序-->可执行文件.
2、ABI,ELF的英文全称是什么?
ELF(Executable and Linking Format),即“可执行可连接格式”,最初由 UNIX
系统实验室(UNIX System Laboratories – USL)做为应用程序二进制接口(Application
Binary Interface - ABI)的一部分而制定和发布。
3、一般UNIX的程序有多少段,举一个实际的例子说明。
代码段,数据段,堆栈段……
4、如何在kernel二进制代码中找一个字符串。
5、段地址F000:FFF0转换为线形地址的值是多少(16进制表达)。
辑地址转换成线性地址的公式是:线性地址=段基址*16+偏移的逻辑地址。
0xF000FFF0
6、在一个UNIX文件系统中,文件的唯一性标志是什么?
索引节点号。
7、系统调用和库函数调用有什么区别?
库函数是高层的,完全运行在用户空间, 为程序员提供调用真正的在幕后完成实际事务的系统调用的更方便的接口。系统调用在内核态运行并且由内核自己提供。标准C库函数printf()可以被看做是一个通用的输出语句,但它实际做的是将数据转化为符合格式的字符串并且调用系统调用write()输出这些字符串。
8、system函数是否等同于fork+exec?
fork exec 都是系统调用 glibc只是简单的封装一下 ;system是库函数
system是用shell来调用程序=fork+exec+waitpid,而exec是直接让你的程序代替用来的程序运行。system 是在单独的进程中执行命令,完了还会回到你的程序中。而exec函数是直接在你的进程中执行新的程序,新的程序会把你的程序覆盖,除非调用出错,否则你再也回不到exec后面的代码,就是说你的程序就变成了exec调用的那个程序了。
9、vfork和fork相比,有什么特色?
vfork() 也可以用来创建一个新进程,与 fork相比,他有自己独特的用处,以下是两者的差异的一个详细对比:
因为使用 fork() 创建一个子进程时,子进程需要将父进程几乎每种资源都复制,所以 fork() 是一个开销很大的系统调用,这些开销并不是所有的情况都需要。比如,fork() 一个进程后,立即调用 exec() 执行另外一个应用程序,那么 fork() 过程中子进程对父进程地址空间的复制将是ige多余的过程。vfork() 不会拷贝父进程的地址空间,这大大减小了系统开销。
10、wait系统调用有多少种条件可以退出?
11、在ext2文件系统上,单个文件最大可以达到多少?
Ext2
Ext2 文件系统是Linux 特有的文件系统,它拥有传统UNIX 文件系统的许多特性,如块、inode
和目录等概念。Ext2 非常健壮,具有很多优良的性能。同时,Ext2 也是可扩展的,它提供
的扩展功能允许用户在不格式化文件系统的情况下使用新的特性。
----------------------------------------------------
最大文件大小: 1TB
最大文件极限: 仅受文件系统大小限制
最大分区/文件系统大小: 4TB
最大文件名长度: 255 字符
缺省最小/最大块大小: 1024/4096 字节
缺省inode 分配: 每4096 字节为1
在强制FS 检查前的最大装载: 20(可配置)
Ext3 文件系统构筑于ext2 文件系统之上,对标准的Linux ext2 文件系统进行了日志扩展。
日志特性显著地减少文件系统崩溃后的恢复时间,它被广泛地应用于带有共享磁盘的HA 站
点。
匈牙利约定优点
匈牙利约定与其它命名约定一样,拥有由命名约定所带来的一切共同优点。由于有这样
多的标准名称,因此在任何一个单个子程序或程序中要特殊记忆的名字是非常少的。匈牙利
约定完全可以在不同项目中采用。
匈牙利约定可以使得在命名中容易产生定义的区域变得准确清楚。特别是约定中对
First,Min,Last,Max 和 Lim 的准确区分在实际中是尤其有帮助的。匈牙利约定可以使
人对编译程序无法检查的抽象数据类型进行检查:cpaReformat[i]很可能是错误的,因为
cpaReformat 不是数组,而 apaReformat[i]则可能是正确的,因为 apaReformat[i]是数
组。
匈牙利约定可以在类型不严格的语言或环境中对类型进行说明。例如,在 Windows 环
境下编程时,需要你放弃许多类型,这极大地限制了编译程序进行严格类型检查的能力。
而建立约定则可以对环境的这一弱点作出补偿,匈牙利约定还可以使名称更简洁,可以用
CMedals 而不用 TotalMedals 来代表奖牌的数量,使用 pNewScore,而不是用
NewScorePtr 命名一个新分数指针。
匈牙利约定缺点
一些版本的匈牙利约定事实上忽视了用抽象数据类型作为基本类型。它们以程序语言
中整型、长整型、浮点数和字符串为基础来建立基本类型。匈牙利约定基本类型事实上是
没有什么价值的,因为它使得程序员陷入对类型进行人工检查的困扰之中,而不是让编译
程序对类型进行更加快速而又准确的检查。
这种形式匈牙利约定的另一个问题是它把数据的意义与其表现联系在一起。比如,说
明某一变量是整型的,把它改为长整型的时,不得不改动这一变量的名称。
匈牙利约定的最后一个问题是它鼓励了懒惰、不含什么信息的变量名的出现。当程序
员用hwnd 来命名对窗口的操作时,往往忽视了他所指的到底是哪种窗口、对话框、菜单还
是帮助区的屏幕?显然用 hwndmenu 要比 hwnd 清楚得多。以变量的意义为代价来获得对
其类型的精确描述显然是愚蠢的。不过好在可以用加限定词的办法来同时获得完整的意义
和精确的类型。
系统初启时,引导程序把系统内核放在内存低地址的48KB内(系统内核原来在哪?下面有解释)。然后经过内部的初启程序为系统建立了进程0和进程1。进程0是所有进程的祖先,也是系统中唯一的核心态进程,它负责把盘上准备运行的进程换入内存,有时也把它称作交换进程。进程1负责为每个终端建立一个进程,执行shell解释程序。shell解释程序分析输入的命令,找到相应的命令执行文件,并为之建立一个子进程来执行这个命令,一旦命令执行完毕,相应的子进程即被撤销。