| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1471 人关注过本帖
标题:怎样获得Pages 笔记
只看楼主 加入收藏
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
结帖率:98.63%
收藏
 问题点数:0 回复次数:0 
怎样获得Pages 笔记
内核通过pages,zones之类来管理内存

内核提供了一个底层的机制来获得内存,

很多函数都被定已在<linux/gfp.h>中

比如300行到304行
程序代码:
300static inline struct page *
 301alloc_pages(gfp_t gfp_mask, unsigned int order)
 302{
 303        return alloc_pages_current(gfp_mask, order);
 304}

这个函数分配2^order个连续physical pages,返回值当然是指向第一个page的指针

如果想把page转换成它的虚拟地址的话用函数用下面的函数,定义在<mm/highmem.c>中

程序代码:
325/**
 326 * page_address - get the mapped virtual address of a page
 327 * @page: &struct page to get the virtual address of
 328 *
 329 * Returns the page's virtual address.
 330 */
 331void *page_address(struct page *page)
 332{
 333        unsigned long flags;
 334        void *ret;
 335        struct page_address_slot *pas;
 336
 337        if (!PageHighMem(page))
 338                return lowmem_page_address(page);
 339
 340        pas = page_slot(page);
 341        ret = NULL;
 342        spin_lock_irqsave(&pas->lock, flags);
 343        if (!list_empty(&pas->lh)) {
 344                struct page_address_map *pam;
 345
 346                list_for_each_entry(pam, &pas->lh, list) {
 347                        if (pam->page == page) {
 348                                ret = pam->virtual;
 349                                goto done;
 350                        }
 351                }
 352        }
 353done:
 354        spin_unlock_irqrestore(&pas->lock, flags);
 355        return ret;
 356}


它返回一个指向logical address的指针

如果你不需要一个实际的 struct page,

(if you have no need for the actual struct page,这句话到底是怎么一回事,不明白)


则可以用下面的函数__get_free_pages()

在mm/page_alloc.c文件中
程序代码:
1969/*
1970 * Common helper functions.
1971 */
1972unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)
1973{
1974        struct page *page;
1975
1976        /*
1977         * __get_free_pages() returns a 32-bit address, which cannot represent
1978         * a highmem page
1979         */
1980        VM_BUG_ON((gfp_mask & __GFP_HIGHMEM) != 0);
1981
1982        page = alloc_pages(gfp_mask, order);
1983        if (!page)
1984                return 0;
1985        return (unsigned long) page_address(page);
1986}

如果只需要一个页的话
则是struct page * alloc_page(gfp_t gfp_mask)

unsigned long __get_free_page(gfp_t gfp_mask)


[ 本帖最后由 madfrogme 于 2012-8-1 02:45 编辑 ]
搜索更多相关主题的帖子: return physical 内存 
2012-07-31 17:58
快速回复:怎样获得Pages 笔记
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013372 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved