寻找 PAGEZ_SIZE

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

于是我要找一个局外人,ping了一下Rachel ,问问她这个问题如何解决。结果她大智若愚的回答我,“我不知道内存分页是什么意思”,难道是我描述本身就有问题?算了,她忙于做经理要做的事情--协调资源。所以还是我和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气坏了,心想,那你丫到底想怎么样呀?

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

Linux技术 | 评论(7) | 引用(0) | 阅读(479)

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

汗颜呀!
UP
2007/04/12 20:57
mlsx真够折腾的呀。
我觉得,如果系统管理员需要知道这个值的时候,他可能不做系统管理了。
或许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中读到的是不准确的)。

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

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


在page.h 中找到 它的定义。在include 目录下
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值