当前位置:早雪网网络学院编程文档C/C++ → Unix编程/应用问答中文版 ---8.Solaris内核编程相关问题

Unix编程/应用问答中文版 ---8.Solaris内核编程相关问题

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-22 19:40:41
B |0    |10     |_init 
[73]    |     67956|       4|OBJT |GLOB |0    |12     |_lib_version 
[57]    |     67380|     116|FUNC |GLOB |0    |9      |_start 
[62]    |    133576|       0|FUNC |GLOB |0    |UNDEF  |atexit 
[68]    |    133864|       4|OBJT |WEAK |0    |20     |environ 
[63]    |    133588|       0|FUNC |GLOB |0    |UNDEF  |exit 
[74]    |     67784|      24|FUNC |GLOB |0    |9      |main 
[65]    |    133868|       4|OBJT |GLOB |0    |20     |var1 


注意到var2这样的"静态全局变量",由于仅仅在单个源文件中有效,nm -g并未显示 
它。如果不指定-g选项,将显示var2(当然会显示更多垃圾信息)。 

$ nm junk 

junk: 

[Index]   Value      Size    Type  Bind  Other Shndx   Name 

... ... 
[65]    |    133868|       4|OBJT |GLOB |0    |20     |var1 
[46]    |    133860|       4|OBJT |LOCL |0    |20     |var2 


8.8 如何单独获得Solaris编译环境 

Q: 我需要安装哪些包 

A: Seán Boran <sean@boran.com> 

需要下列Solaris安装包: 
SUNWbtool、SUNWsprot、SUNWtoo、SUNWhea、SUNWarc、SUNWlibm、SUNWlibms 

可以用pkginfo [-l]检查是否安装了这些包 

$ pkginfo SUNWbtool SUNWsprot SUNWtoo SUNWhea SUNWarc SUNWlibm SUNWlibms 
system      SUNWarc        Archive Libraries 
system      SUNWbtool      CCS tools bundled with SunOS 
system      SUNWhea        SunOS Header Files 
system      SUNWlibm       Sun WorkShop Bundled libm 
system      SUNWlibms      Sun WorkShop Bundled shared libm 
system      SUNWsprot      Solaris Bundled tools 
system      SUNWtoo        Programming Tools 


可以从Solaris CD中单独安装缺少的包(pkgadd) 

象make这样的工具安装在/usr/ccs/bin,增加到$PATH环境变量中。但是这个make和 
某些工具相冲突,比如BIND,此时应该安装GNU make,确认GNU make的搜索路径位于 
/usr/ccs/bin/make之前。另外,$PATH环境变量中/usr/ccs/bin应该位于/usr/ucb之 
前。 

8.9 如何获取Solaris内核可调参数列表 

Q: 谁有Solaris内核可调参数列表 

A: Andrew Garman <andrew_garman@ins.com> 

执行 

/usr/xpg4/bin/nm /platform/sun4u/kernel/unix | egrep 'OBJT \|GLOB' | more 

显示结果中部分为Solaris内核可调参数,另外一些非可调内核参数。可以用ndd获取、 
设置网络相关参数。 

D: scz <cloudksy@263.net> 

可以考虑 

/usr/ccs/bin/nm -nx /dev/ksyms | egrep 'OBJT \|GLOB' | more 

不知道二者区别何在?第二个报告内容应该包含了后来动态加载内核模块输出的符号, 
第一个才对应基本内核输出的符号。 

8.11 如何页边界对齐式分配内存 

Q: 我希望在页边界上分配大块内存,要求普通用户、非特权进程亦能使用此技术。 
   在mmap(2)手册页中没有明确表明返回地址边界对齐。它提到可以指定起始地址以 
   保证页边界对齐,但没有说明如果由系统选定起始地址时是否也是页边界对齐的。 

   MAP_ANON并非所有系统都支持,我需要在Solaris 2.x上运行。 

A: Andrew Gierth <andrew@erlenstar.demon.co.uk> 

mmap(2)即可满足要求。某些系统提供了valloc或者memalign,但它们的实现机制是, 
分配超过请求大小的内存,然后调整之,这相当浪费。 

mmap(2)应该始终是页边界对齐的。 

在那些不支持 MAP_ANON 的系统上,打开/dev/zero获取句柄,传递给mmap(2),效果 
是一样的。 

mmap(2)的可移植性足够好,不过"分配超过请求大小的内存并调整之"可能更具有可 
移植性。 

8.13 compile()和step()怎么用 

Q: 我知道这两个函数是Solaris对正则表达式的支持函数,可到底怎么用呢? 

A: microcat <rotm@263.net> 

-------------------------------------------------------------------------- 
/* gcc -Wall -O3 -o reg reg.c -lgen */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <regexpr.h> 

int main ( int argc, char * argv[] ) 

    char * expbuf = NULL; 

    if ( ( expbuf = compile( argv[1], NULL, NULL ) ) == NULL ) 
    { 
        exit( EXIT_FAILURE ); 
    } 
    if ( step( argv[2], expbuf ) ) 
    { 
        printf( "Match at: %s\n", loc1 ); 
    } 
    else 
    { 
        printf( "No match.\n" ); 
    } 
    free( expbuf ); 
    exit( EXIT_SUCCESS ); 
}  /* end of main */ 
-------------------------------------------------------------------------- 

$ ./reg '^.*inetd$' '/usr/sbin/inetd' 
Match at: /usr/sbin/inetd 

上一页  [1] [2] [3] 

[数据载入中...] [返回上一页] [打 印]