Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
70d922ff
提交
70d922ff
4月 06, 2012
创建
作者:
Austin Clements
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Introduce a userptr template for pointers to user data
These are compatible with regular pointers, but can't be dereferenced without checks.
上级
62b28770
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
49 行增加
和
0 行删除
+49
-0
userptr.hh
include/userptr.hh
+46
-0
syscall.cc
kernel/syscall.cc
+3
-0
没有找到文件。
include/userptr.hh
0 → 100644
浏览文件 @
70d922ff
#pragma once
// A protected pointer to user data. These act like pointers (and
// their in-memory representation is identical), but userptr's cannot
// be dereferenced without explicit checks.
template
<
typename
T
>
class
userptr
{
T
*
ptr
;
public
:
explicit
userptr
(
T
*
p
)
:
ptr
(
p
)
{
}
explicit
userptr
(
uptr
p
)
:
ptr
((
T
*
)
p
)
{
}
userptr
()
=
default
;
userptr
(
const
userptr
<
T
>
&
o
)
=
default
;
userptr
(
userptr
<
T
>
&&
o
)
=
default
;
T
*
unsafe_get
()
const
{
return
ptr
;
}
// Allow implicit conversion to userptr<void> (mirroring C++'s
// implicit casts to void*)
operator
userptr
<
void
>
()
const
{
return
userptr
<
void
>
{
ptr
};
}
// Allow implicit casts to uptr. Often it makes sense to treat a
// user pointer as an opaque number and a lot of existing code uses
// this convention. (XXX(austin) this means we can't have things
// like operator+, which would probably subsume our current uses of
// uptr anyway.)
operator
uptr
()
const
{
return
(
uptr
)
ptr
;
}
};
// For userptr to be passed like a regular pointer, its representation
// must be the same as a pointer (obviously) and, furthermore, the
// AMD64 ABI requires that it have a trivial copy construct and
// trivial destructor.
static_assert
(
sizeof
(
userptr
<
void
>
)
==
sizeof
(
void
*
),
"userptr is wrong size"
);
static_assert
(
__is_pod
(
userptr
<
void
>
),
"userptr is not a POD"
);
kernel/syscall.cc
浏览文件 @
70d922ff
...
...
@@ -14,6 +14,9 @@ extern "C" int __uaccess_mem(void* dst, const void* src, u64 size);
extern
"C"
int
__uaccess_str
(
char
*
dst
,
const
char
*
src
,
u64
size
);
extern
"C"
int
__uaccess_int64
(
uptr
addr
,
u64
*
ip
);
// XXX(austin) Many of these functions should take userptr<void>
// instead of regular pointers
int
fetchmem
(
void
*
dst
,
const
void
*
usrc
,
u64
size
)
{
...
...
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论