Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153234
  • 博文数量: 116
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-21 15:04
文章分类

全部博文(116)

文章存档

2014年(1)

2013年(13)

2012年(27)

2011年(49)

2010年(26)

分类:

2010-02-02 19:48:35

 最开始我想到的是/proc/meminfo的内如,于是cat /proc/meminfo,结果只在最后发现一个Hugepagesize的值,是4096K,整整大了1024倍。看了一下这个参数,和我要的page_size不是一码事。
[separate]
然后sysctl -a ,sysctl -A, 均没有发现对我有用的东西。于是googling,找到一篇文章,提到了time 命令,说用time -v就可以显示pagesize。窃喜,赶紧测试了一下

[root@mlsx tmp]# time -v pwd
bash: -v: command not found


方法不对?man一把,没有发现-v选项,但是看到了这个

 %Z     (Not in tcsh.) System’s page size, in bytes. 
This is a per-system constant, but varies between systems.


以为搞定,马上测试,结果得到这样的一些结果:

[root@mlsx tmp]# time "%Z" pwd
bash: fg: %Z: no such job
[root@mlsx tmp]# time +%Z pwd
bash: +%Z: command not found
[root@mlsx tmp]# time --format %Z pwd
bash: --format: command not found
[root@mlsx tmp]# time -o %Z pwd
bash: -o: command not found
.......


差点崩溃
strings time一把,有%Z,就是不知道如何用。

再次进入/proc目录,搜刮了一番,没有发现什么东西。

有点绝望了,ping(xplore行业术语,用户和人打招呼 )了一下 ,问问他知道不。搞研发的就是搞研发的,查了两个命令没有后,就丢一句,看源代码吧。我说我不看,我要以管理员 的身份来解决这个问题。被逼无奈,继续寻找中, 甚至lspci/lshal/dmidecode都看了,还是没有新进展,我一直觉得这是一特简单的事情,我们怎么就找了这么久,还没有结果呢?

于是我要找一个局外人,ping了一下 ,问问她这个问题如何解决。结果她大智若愚的回答我,“我不知道内存分页是什么意思”,难道是我描述本身就有问题?算了,她忙于做经理要做的事情--协调资源。所以还是我和wf来搞这个事情好了。

wf过了不多久,丢来一个信息

man -k  getpagesize
getpagesize          (2)  - get memory page size


我知道,他要写代码的瘾又上来了,果不其然,我还没有看完man,就来了这个信息:

$ ~/code/ccode/test/get_mem_pagesize
memory page size is 4096


这家伙,手脚也太灵活了吧,这代码就出来了。

我仍然倔强的说,不行,我不要写代码。我要从系统里揪出这个值,肯定有。

于是又开始大海捞针了。

许久未果,我和wf得到一个结论--我们还是看内核源代码吧,那里总能找到(开源的好处又被利用了一次)。

无奈,两人对内核源代码结构都不熟悉,就像两个瞎子(sorry to wf)进入了浩大的迷宫,幸好我们还有一个最后的救命稻草。
牺牲了一些PU资源后,wf最终找到了这个page_size的定义。

#grep "PAGE_SIZE" -B3 -A2  page.h  

/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT      12
#define PAGE_SIZE       (1UL << PAGE_SHIFT)
#define PAGE_MASK       (~(PAGE_SIZE-1))

#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)


#pwd
/usr/src/linux-2.6.18-1.2798.fc6/include/asm-i386


似乎寻找PAGE_SIZE到这里结束了。wf的担心是,大部分情况下安装了内核源代码吗?

而我的说法却是:命令之所以不出来,是因为用户管理员 需要知道参数吗?而如果程序员 需要知道这个值,那他当然会去看源代码或者写程序来校验。

这估计把wf气坏了,心想,那你丫到底想怎么样呀?

呵呵,不想怎么样,只是想找找。

| | |

pczou
2007/04/12 22:34
time也可以呀:
/usr/bin/time -f %Z true
只是不要用bash内置的time。
回复于 2007/04/12 22:57
最开始我找到了time可以做到这点,但是你看我上面的输出,告诉我不对。
我给忘记了我用的是bash里的time,我还用which查了一下路径。

汗颜呀!
UP
2007/04/12 20:57
mlsx真够折腾的呀。
我觉得,如果系统管理员需要知道这个值的时候,他可能不做系统管理了。
或许mlsx也准备提升了?
回复于 2007/04/12 22:59
不敢。
写前面那篇文章的时候,需要确定一下pagesize的大小,于是就引发了这个插曲。
wf
2007/04/12 11:06
当时我们就想到要从可执行程序入手,因为一个进程肯定是需要知道分页大小的. 可是没有去想elf文件的头信息. 的确是应该查查的.
wf
2007/04/12 10:03
[root@localhost ~]# LD_SHOW_AUXV=1 ls
AT_SYSINFO:      0xde2400
AT_SYSINFO_EHDR: 0xde2000
AT_HWCAP:    fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe
AT_PAGESZ:       4096
AT_CLKTCK:       100
AT_PHDR:         0x8048034
AT_PHENT:        32
AT_PHNUM:        8
AT_BASE:         0x0
AT_FLAGS:        0x0
AT_ENTRY:        0x8049a30
AT_UID:          0
AT_EUID:         0
AT_GID:          0
AT_EGID:         0
AT_SECURE:       0
AT_PLATFORM:     i686

这些AT参数是干嘛的?还有LD_SHOW_AUXV环境变量那里知道?非要看内核代码?呵呵~~
pczou
2007/04/12 00:25
getpagesize()应该是正解,PAGE_SIZE/PAGE_SHIFT之类的东西不可靠(比如IA64,PPC64等平台的PAGE_SHIFT是和内核配置相关的,从asm/page.h中读到的是不准确的)。

如果一定要维护系统管理员的尊严和纯正血统而弃用 的本来已经够简单的程序,那么可以试试这个:
# LD_SHOW_AUXV=1 /bin/ls | grep PAGESZ | awk {'print $2'}
回复于 2007/04/12 08:50
谢谢!
果然被 言中了,她说,你信不信,如果pczou看了你的这篇文章,肯定会给你一特简单的答案。
我就知道您最后能给出一特简单的方法得到这个效果,所以昨天憋着不敢问您。
不过问题来了,我先查查这个环境变量是干什么的吧?

其他平台(IA64,PowerPC,etc)架构中因为是变长的PAGE_SIZE。所以他给出了很多的PAGE_SHIFT,似乎在内核编译的时候可以指定。
由此看来写程序验证和您说的这个方法最简单和最正确了。


在page.h 中找到 它的定义。在include 目录下
阅读(631) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~