在2.4.20-8中找不到pte_offset()

lysliberty 2003-10-16 10:47:43
在2.4.20-8pgtable中找不到pte_offset(dir,addr)这个函数,但是有许多pte_offset_xxxx()之类的函数,xxxx是指kernel map 等等, 但是不知道那个函数可以用来代替pte_offset?多谢了!
...全文
108 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lysliberty 2003-10-21
  • 打赏
  • 举报
回复
上面的那个问题搞定了,是page_address的问题。
在2.4.20中,page_address是这样定义的,看不懂,尤其是page的virtual项,老大能够解释一下,多谢!
#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)

#define page_address(page) ((page)->virtual)

#else /* CONFIG_HIGHMEM || WANT_PAGE_VIRTUAL */

#define page_address(page) \
__va( (((page) - page_zone(page)->zone_mem_map) << PAGE_SHIFT) \
+ page_zone(page)->zone_start_paddr)
CoolQ 2003-10-21
  • 打赏
  • 举报
回复
你在一个帖子里一下子问这么多问题?真是服了U
上边不是写得很清楚么?
#if defined(CONFIG_HIGHMEM) || defined(WANT_PAGE_VIRTUAL)
//如果定义了CONFIG_HIGHMEM或者WANT_PAGE_VIRTUAL宏
#define page_address(page) ((page)->virtual)
//page_address就是page->virtual,因为这个时候page结构里就有地址的信息,也就是virtual
#else /* CONFIG_HIGHMEM || WANT_PAGE_VIRTUAL */
//如果没有定义上边的两个宏
#define page_address(page) \
__va( (((page) - page_zone(page)->zone_mem_map) << PAGE_SHIFT) \
+ page_zone(page)->zone_start_paddr)
//__va是一个宏,作用就是将物理地址转换成虚拟地址,具体的定义自己GREP一下
//page本身就是一个zone_mem_map数组的一个元素,(page) - page_zone(page)->zone_mem_map就是page在整个数组中的偏移量,也就是数组的下标,然后左移以后就是页面的长度,再加上本身这个页面所在区的起始地址,就是page的物理地址了,然后用__va转换一下就完事了
CoolQ 2003-10-20
  • 打赏
  • 举报
回复
报什么错?
lysliberty 2003-10-20
  • 打赏
  • 举报
回复
上面的那个问题解决了。我换成pte_offset_kernel(dir, address)就ok了。
我的内存应该是非PAE的。
还有一个问题,请大侠指点一二:
就是我通过上面的
pte=pte_offset_kernel(pmd, address),
我想利用获得的pte得到对应的物理地址,我是用下面这条语句实现的:
(char *) page_address(pte_page(*pte)) + (addr & ~PAGE_MASK);
但是系统老报错,不知道是为什么?
lysliberty 2003-10-20
  • 打赏
  • 举报
回复
忘了说了,我的机器是P4的。
CoolQ 2003-10-20
  • 打赏
  • 举报
回复
也就是说,如果你选的是4G的支持,就是二级页表
如果是64G的支持,就是三级页表
CoolQ 2003-10-20
  • 打赏
  • 举报
回复
一般默认的内核都是非PAE的,如果你内核时的选项是64G,那么就是PAE模式的
lysliberty 2003-10-18
  • 打赏
  • 举报
回复
这个我有所了解,就是说pentium Pro以上的可以支持三级页表,你说得PAE模式,是指的一种编译选项吧?那我如何判断我的系统用的两级页表还是三级页表?多谢!
CoolQ 2003-10-17
  • 打赏
  • 举报
回复
i386同时支持二级页表,PentiumPro也支持三级页表
所以有两个文件pgtable-2level.h和pgtable-3level.h
当处于PAE模式下,就include <pgtable-3level.h>
否则,就include <pgtable-2level.h>
二级页表时pmd和pgd是一个东西
CoolQ 2003-10-17
  • 打赏
  • 举报
回复
不好意思没有看清楚
2.4.18下
#define __pte_offset(address) \
((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
#define pte_offset(dir, address) ((pte_t *) pmd_page(*(dir)) + \
__pte_offset(address))
2.4.20下
#define __pte_offset(address) \
((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
具体在2.4.20下pte_offset对应什么,我也不是很清楚
lysliberty 2003-10-17
  • 打赏
  • 举报
回复
还有,有那位大侠知道在2.4.20中采用的两级页目录还是三级页目录?
CoolQ 2003-10-16
  • 打赏
  • 举报
回复
直接用__pte_offset就行了。
CoolQ 2003-10-16
  • 打赏
  • 举报
回复
在2.4.20-8中有pte_offset(dir,add)阿,不过不是函数,是一个宏而已,具体的定义是:
#define __pte_offset(address) \
((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
跟以前各版本的定义是一样的
lysliberty 2003-10-16
  • 打赏
  • 举报
回复
我的函数有两个输入参数,而__pte_offset()只有一个输入参数,好像这样不行。

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧