Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xv6-public
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
OS Lab Group
奖励实验
xv6-public
提交
b5ee5165
提交
b5ee5165
7月 17, 2006
创建
作者:
rsc
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add uint and standardize on typedefs instead of unsigned
上级
857d60cb
隐藏空白字符变更
内嵌
并排
正在显示
15 个修改的文件
包含
84 行增加
和
82 行删除
+84
-82
bootmain.c
bootmain.c
+1
-1
console.c
console.c
+3
-3
defs.h
defs.h
+6
-6
ide.c
ide.c
+3
-3
kalloc.c
kalloc.c
+2
-2
main.c
main.c
+3
-3
mmu.h
mmu.h
+26
-26
mp.c
mp.c
+2
-2
proc.c
proc.c
+6
-6
proc.h
proc.h
+3
-3
spinlock.h
spinlock.h
+2
-2
string.c
string.c
+6
-6
syscall.c
syscall.c
+10
-10
trap.c
trap.c
+3
-3
types.h
types.h
+8
-6
没有找到文件。
bootmain.c
浏览文件 @
b5ee5165
...
...
@@ -61,7 +61,7 @@ cmain(void)
bad:
outw
(
0x8A00
,
0x8A00
);
outw
(
0x8A00
,
0x8E00
);
while
(
1
)
while
(
1
)
/* do nothing */
;
}
...
...
console.c
浏览文件 @
b5ee5165
...
...
@@ -28,7 +28,7 @@ static void
real_cons_putc
(
int
c
)
{
int
crtport
=
0x3d4
;
// io port of CGA
u
nsigned
short
*
crt
=
(
unsigned
shor
t
*
)
0xB8000
;
// base of CGA memory
u
int16_t
*
crt
=
(
uint16_
t
*
)
0xB8000
;
// base of CGA memory
int
ind
;
if
(
panicked
){
...
...
@@ -85,7 +85,7 @@ printint(int xx, int base, int sgn)
char
buf
[
16
];
char
digits
[]
=
"0123456789ABCDEF"
;
int
i
=
0
,
neg
=
0
;
u
nsigned
int
x
;
uint
x
;
if
(
sgn
&&
xx
<
0
){
neg
=
1
;
...
...
@@ -111,7 +111,7 @@ void
cprintf
(
char
*
fmt
,
...)
{
int
i
,
state
=
0
,
c
;
u
nsigned
int
*
ap
=
(
unsigned
int
*
)(
void
*
)
&
fmt
+
1
;
u
int
*
ap
=
(
u
int
*
)(
void
*
)
&
fmt
+
1
;
if
(
use_console_lock
)
acquire
(
&
console_lock
);
...
...
defs.h
浏览文件 @
b5ee5165
...
...
@@ -32,10 +32,10 @@ void tvinit(void);
void
idtinit
(
void
);
// string.c
void
*
memset
(
void
*
dst
,
int
c
,
u
nsigned
n
);
int
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
nsigned
n
);
void
*
memmove
(
void
*
dst
,
const
void
*
src
,
u
nsigned
n
);
int
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
nsigned
n
);
void
*
memset
(
void
*
dst
,
int
c
,
u
int
n
);
int
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
int
n
);
void
*
memmove
(
void
*
dst
,
const
void
*
src
,
u
int
n
);
int
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
int
n
);
// syscall.c
void
syscall
(
void
);
...
...
@@ -68,7 +68,7 @@ void acquire1(struct spinlock * lock, struct proc *);
void
release1
(
struct
spinlock
*
lock
,
struct
proc
*
);
// main.c
void
load_icode
(
struct
proc
*
p
,
uint8_t
*
binary
,
u
nsigned
size
);
void
load_icode
(
struct
proc
*
p
,
uint8_t
*
binary
,
u
int
size
);
// pipe.c
struct
pipe
;
...
...
@@ -89,6 +89,6 @@ void fd_incref(struct fd *fd);
// ide.c
void
ide_init
(
void
);
void
ide_intr
(
void
);
void
*
ide_start_read
(
uint32_t
secno
,
void
*
dst
,
u
nsigned
nsecs
);
void
*
ide_start_read
(
uint32_t
secno
,
void
*
dst
,
u
int
nsecs
);
int
ide_finish_read
(
void
*
);
ide.c
浏览文件 @
b5ee5165
...
...
@@ -19,7 +19,7 @@
struct
ide_request
{
uint32_t
secno
;
void
*
dst
;
u
nsigned
nsecs
;
u
int
nsecs
;
};
struct
ide_request
request
[
NREQUEST
];
int
head
,
tail
;
...
...
@@ -104,7 +104,7 @@ ide_start_request (void)
}
void
*
ide_start_read
(
uint32_t
secno
,
void
*
dst
,
u
nsigned
nsecs
)
ide_start_read
(
uint32_t
secno
,
void
*
dst
,
u
int
nsecs
)
{
struct
ide_request
*
r
;
...
...
@@ -149,7 +149,7 @@ ide_finish_read(void *c)
}
int
ide_write
(
uint32_t
secno
,
const
void
*
src
,
u
nsigned
nsecs
)
ide_write
(
uint32_t
secno
,
const
void
*
src
,
u
int
nsecs
)
{
int
r
;
...
...
kalloc.c
浏览文件 @
b5ee5165
...
...
@@ -34,11 +34,11 @@ void
kinit
(
void
)
{
extern
int
end
;
u
nsigned
mem
;
u
int
mem
;
char
*
start
;
start
=
(
char
*
)
&
end
;
start
=
(
char
*
)
(((
u
nsigned
)
start
+
PAGE
)
&
~
(
PAGE
-
1
));
start
=
(
char
*
)
(((
u
int
)
start
+
PAGE
)
&
~
(
PAGE
-
1
));
mem
=
256
;
// XXX
cprintf
(
"mem = %d
\n
"
,
mem
*
PAGE
);
kfree
(
start
,
mem
*
PAGE
);
...
...
main.c
浏览文件 @
b5ee5165
...
...
@@ -81,8 +81,8 @@ main0(void)
p
=
copyproc
(
&
proc
[
0
]);
load_icode
(
p
,
_binary_usertests_start
,
(
u
nsigned
)
_binary_usertests_size
);
//load_icode(p, _binary_userfs_start, (u
nsigned
) _binary_userfs_size);
load_icode
(
p
,
_binary_usertests_start
,
(
u
int
)
_binary_usertests_size
);
//load_icode(p, _binary_userfs_start, (u
int
) _binary_userfs_size);
p
->
state
=
RUNNABLE
;
cprintf
(
"loaded userfs
\n
"
);
...
...
@@ -107,7 +107,7 @@ mpmain(void)
}
void
load_icode
(
struct
proc
*
p
,
uint8_t
*
binary
,
u
nsigned
size
)
load_icode
(
struct
proc
*
p
,
uint8_t
*
binary
,
u
int
size
)
{
int
i
;
struct
Elf
*
elf
;
...
...
mmu.h
浏览文件 @
b5ee5165
...
...
@@ -61,19 +61,19 @@
// Segment Descriptors
struct
Segdesc
{
u
nsigned
lim_15_0
:
16
;
// Low bits of segment limit
u
nsigned
base_15_0
:
16
;
// Low bits of segment base address
u
nsigned
base_23_16
:
8
;
// Middle bits of segment base address
u
nsigned
type
:
4
;
// Segment type (see STS_ constants)
u
nsigned
s
:
1
;
// 0 = system, 1 = application
u
nsigned
dpl
:
2
;
// Descriptor Privilege Level
u
nsigned
p
:
1
;
// Present
u
nsigned
lim_19_16
:
4
;
// High bits of segment limit
u
nsigned
avl
:
1
;
// Unused (available for software use)
u
nsigned
rsv1
:
1
;
// Reserved
u
nsigned
db
:
1
;
// 0 = 16-bit segment, 1 = 32-bit segment
u
nsigned
g
:
1
;
// Granularity: limit scaled by 4K when set
u
nsigned
base_31_24
:
8
;
// High bits of segment base address
u
int
lim_15_0
:
16
;
// Low bits of segment limit
u
int
base_15_0
:
16
;
// Low bits of segment base address
u
int
base_23_16
:
8
;
// Middle bits of segment base address
u
int
type
:
4
;
// Segment type (see STS_ constants)
u
int
s
:
1
;
// 0 = system, 1 = application
u
int
dpl
:
2
;
// Descriptor Privilege Level
u
int
p
:
1
;
// Present
u
int
lim_19_16
:
4
;
// High bits of segment limit
u
int
avl
:
1
;
// Unused (available for software use)
u
int
rsv1
:
1
;
// Reserved
u
int
db
:
1
;
// 0 = 16-bit segment, 1 = 32-bit segment
u
int
g
:
1
;
// Granularity: limit scaled by 4K when set
u
int
base_31_24
:
8
;
// High bits of segment base address
};
// Null segment
#define SEG_NULL (struct Segdesc){ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
...
...
@@ -82,12 +82,12 @@ struct Segdesc {
// Normal segment
#define SEG(type, base, lim, dpl) (struct Segdesc) \
{ ((lim) >> 12) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \
type, 1, dpl, 1, (u
nsigned
) (lim) >> 28, 0, 0, 1, 1, \
(u
nsigned
) (base) >> 24 }
type, 1, dpl, 1, (u
int
) (lim) >> 28, 0, 0, 1, 1, \
(u
int
) (base) >> 24 }
#define SEG16(type, base, lim, dpl) (struct Segdesc) \
{ (lim) & 0xffff, (base) & 0xffff, ((base) >> 16) & 0xff, \
type, 1, dpl, 1, (u
nsigned
) (lim) >> 16, 0, 0, 1, 0, \
(u
nsigned
) (base) >> 24 }
type, 1, dpl, 1, (u
int
) (lim) >> 16, 0, 0, 1, 0, \
(u
int
) (base) >> 24 }
#endif
/* !__ASSEMBLER__ */
...
...
@@ -165,15 +165,15 @@ struct Taskstate {
// Gate descriptors for interrupts and traps
struct
Gatedesc
{
u
nsigned
off_15_0
:
16
;
// low 16 bits of offset in segment
u
nsigned
ss
:
16
;
// segment selector
u
nsigned
args
:
5
;
// # args, 0 for interrupt/trap gates
u
nsigned
rsv1
:
3
;
// reserved(should be zero I guess)
u
nsigned
type
:
4
;
// type(STS_{TG,IG32,TG32})
u
nsigned
s
:
1
;
// must be 0 (system)
u
nsigned
dpl
:
2
;
// descriptor(meaning new) privilege level
u
nsigned
p
:
1
;
// Present
u
nsigned
off_31_16
:
16
;
// high bits of offset in segment
u
int
off_15_0
:
16
;
// low 16 bits of offset in segment
u
int
ss
:
16
;
// segment selector
u
int
args
:
5
;
// # args, 0 for interrupt/trap gates
u
int
rsv1
:
3
;
// reserved(should be zero I guess)
u
int
type
:
4
;
// type(STS_{TG,IG32,TG32})
u
int
s
:
1
;
// must be 0 (system)
u
int
dpl
:
2
;
// descriptor(meaning new) privilege level
u
int
p
:
1
;
// Present
u
int
off_31_16
:
16
;
// high bits of offset in segment
};
// Set up a normal interrupt/trap gate descriptor.
...
...
mp.c
浏览文件 @
b5ee5165
...
...
@@ -205,8 +205,8 @@ mp_startthem(void)
for
(
c
=
0
;
c
<
ncpu
;
c
++
){
if
(
c
==
cpu
())
continue
;
cprintf
(
"starting processor %d
\n
"
,
c
);
*
(
u
nsigned
*
)(
APBOOTCODE
-
4
)
=
(
unsigned
)
(
cpus
[
c
].
mpstack
)
+
MPSTACK
;
// tell it what to use for %esp
*
(
u
nsigned
*
)(
APBOOTCODE
-
8
)
=
(
unsigned
)
mpmain
;
// tell it where to jump to
*
(
u
int
*
)(
APBOOTCODE
-
4
)
=
(
uint
)
(
cpus
[
c
].
mpstack
)
+
MPSTACK
;
// tell it what to use for %esp
*
(
u
int
*
)(
APBOOTCODE
-
8
)
=
(
uint
)
mpmain
;
// tell it where to jump to
lapic_startap
(
cpus
[
c
].
apicid
,
(
uint32_t
)
APBOOTCODE
);
}
}
proc.c
浏览文件 @
b5ee5165
...
...
@@ -26,18 +26,18 @@ setupsegs(struct proc *p)
{
memset
(
&
p
->
ts
,
0
,
sizeof
(
struct
Taskstate
));
p
->
ts
.
ss0
=
SEG_KDATA
<<
3
;
p
->
ts
.
esp0
=
(
u
nsigned
)(
p
->
kstack
+
KSTACKSIZE
);
p
->
ts
.
esp0
=
(
u
int
)(
p
->
kstack
+
KSTACKSIZE
);
// XXX it may be wrong to modify the current segment table!
p
->
gdt
[
0
]
=
SEG_NULL
;
p
->
gdt
[
SEG_KCODE
]
=
SEG
(
STA_X
|
STA_R
,
0
,
0xffffffff
,
0
);
p
->
gdt
[
SEG_KDATA
]
=
SEG
(
STA_W
,
0
,
0xffffffff
,
0
);
p
->
gdt
[
SEG_TSS
]
=
SEG16
(
STS_T32A
,
(
u
nsigned
)
&
p
->
ts
,
p
->
gdt
[
SEG_TSS
]
=
SEG16
(
STS_T32A
,
(
u
int
)
&
p
->
ts
,
sizeof
(
p
->
ts
),
0
);
p
->
gdt
[
SEG_TSS
].
s
=
0
;
p
->
gdt
[
SEG_UCODE
]
=
SEG
(
STA_X
|
STA_R
,
(
u
nsigned
)
p
->
mem
,
p
->
sz
,
3
);
p
->
gdt
[
SEG_UDATA
]
=
SEG
(
STA_W
,
(
u
nsigned
)
p
->
mem
,
p
->
sz
,
3
);
p
->
gdt
[
SEG_UCODE
]
=
SEG
(
STA_X
|
STA_R
,
(
u
int
)
p
->
mem
,
p
->
sz
,
3
);
p
->
gdt
[
SEG_UDATA
]
=
SEG
(
STA_W
,
(
u
int
)
p
->
mem
,
p
->
sz
,
3
);
}
// Look in the process table for an UNUSED proc.
...
...
@@ -108,8 +108,8 @@ copyproc(struct proc* p)
// Set up new jmpbuf to start executing at forkret (see below).
memset
(
&
np
->
jmpbuf
,
0
,
sizeof
np
->
jmpbuf
);
np
->
jmpbuf
.
eip
=
(
u
nsigned
)
forkret
;
np
->
jmpbuf
.
esp
=
(
u
nsigned
)
np
->
tf
;
np
->
jmpbuf
.
eip
=
(
u
int
)
forkret
;
np
->
jmpbuf
.
esp
=
(
u
int
)
np
->
tf
;
// Copy file descriptors
for
(
i
=
0
;
i
<
NOFILE
;
i
++
){
...
...
proc.h
浏览文件 @
b5ee5165
...
...
@@ -37,7 +37,7 @@ enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE };
struct
proc
{
char
*
mem
;
// start of process's physical memory
u
nsigned
sz
;
// total size of mem, including kernel stack
u
int
sz
;
// total size of mem, including kernel stack
char
*
kstack
;
// kernel stack, separate from mem so it doesn't move
enum
proc_state
state
;
enum
proc_state
newstate
;
// desired state after swtch()
...
...
@@ -50,8 +50,8 @@ struct proc{
struct
Taskstate
ts
;
// only to give cpu address of kernel stack
struct
Segdesc
gdt
[
NSEGS
];
u
nsigned
esp
;
// kernel stack pointer
u
nsigned
ebp
;
// kernel frame pointer
u
int
esp
;
// kernel stack pointer
u
int
ebp
;
// kernel frame pointer
struct
jmpbuf
jmpbuf
;
...
...
spinlock.h
浏览文件 @
b5ee5165
struct
spinlock
{
u
nsigned
int
locked
;
u
nsigned
locker_pc
;
uint
locked
;
u
int
locker_pc
;
};
string.c
浏览文件 @
b5ee5165
...
...
@@ -2,7 +2,7 @@
#include "defs.h"
void
*
memset
(
void
*
dst
,
int
c
,
u
nsigned
n
)
memset
(
void
*
dst
,
int
c
,
u
int
n
)
{
char
*
d
=
(
char
*
)
dst
;
...
...
@@ -13,7 +13,7 @@ memset(void *dst, int c, unsigned n)
}
int
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
nsigned
n
)
memcmp
(
const
void
*
v1
,
const
void
*
v2
,
u
int
n
)
{
const
uint8_t
*
s1
=
(
const
uint8_t
*
)
v1
;
const
uint8_t
*
s2
=
(
const
uint8_t
*
)
v2
;
...
...
@@ -28,7 +28,7 @@ memcmp(const void *v1, const void *v2, unsigned n)
}
void
*
memmove
(
void
*
dst
,
const
void
*
src
,
u
nsigned
n
)
memmove
(
void
*
dst
,
const
void
*
src
,
u
int
n
)
{
const
char
*
s
;
char
*
d
;
...
...
@@ -48,14 +48,14 @@ memmove(void *dst, const void *src, unsigned n)
}
int
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
nsigned
n
)
strncmp
(
const
char
*
p
,
const
char
*
q
,
u
int
n
)
{
while
(
n
>
0
&&
*
p
&&
*
p
==
*
q
)
n
--
,
p
++
,
q
++
;
if
(
n
==
0
)
return
0
;
else
return
(
int
)
((
u
nsigned
char
)
*
p
-
(
unsigned
char
)
*
q
);
return
(
int
)
((
u
int8_t
)
*
p
-
(
uint8_t
)
*
q
);
}
// Memcpy is deprecated and should NOT be called.
...
...
@@ -64,7 +64,7 @@ strncmp(const char *p, const char *q, unsigned n)
// Memcpy is here only because gcc compiles some
// structure assignments into calls to memcpy.
void
*
memcpy
(
void
*
dst
,
void
*
src
,
u
nsigned
n
)
memcpy
(
void
*
dst
,
void
*
src
,
u
int
n
)
{
char
*
d
=
(
char
*
)
dst
;
char
*
s
=
(
char
*
)
src
;
...
...
syscall.c
浏览文件 @
b5ee5165
...
...
@@ -24,7 +24,7 @@
* returns 0 if addr was OK, -1 if illegal.
*/
int
fetchint
(
struct
proc
*
p
,
u
nsigned
addr
,
int
*
ip
)
fetchint
(
struct
proc
*
p
,
u
int
addr
,
int
*
ip
)
{
*
ip
=
0
;
...
...
@@ -37,7 +37,7 @@ fetchint(struct proc *p, unsigned addr, int *ip)
// Fetch byte from a user-supplied pointer.
// Returns 0 on success, -1 if pointer is illegal.
int
fetchbyte
(
struct
proc
*
p
,
u
nsigned
addr
,
char
*
c
)
fetchbyte
(
struct
proc
*
p
,
u
int
addr
,
char
*
c
)
{
if
(
addr
>=
p
->
sz
)
return
-
1
;
...
...
@@ -49,14 +49,14 @@ fetchbyte(struct proc *p, unsigned addr, char* c)
int
fetcharg
(
int
argno
,
void
*
ip
)
{
u
nsigned
esp
;
u
int
esp
;
esp
=
(
u
nsigned
)
curproc
[
cpu
()]
->
tf
->
esp
;
esp
=
(
u
int
)
curproc
[
cpu
()]
->
tf
->
esp
;
return
fetchint
(
curproc
[
cpu
()],
esp
+
4
+
4
*
argno
,
ip
);
}
int
putint
(
struct
proc
*
p
,
u
nsigned
addr
,
int
ip
)
putint
(
struct
proc
*
p
,
u
int
addr
,
int
ip
)
{
if
(
addr
>
p
->
sz
-
4
)
return
-
1
;
...
...
@@ -70,7 +70,7 @@ sys_pipe(void)
struct
fd
*
rfd
=
0
,
*
wfd
=
0
;
int
f1
=
-
1
,
f2
=
-
1
;
struct
proc
*
p
=
curproc
[
cpu
()];
u
nsigned
fdp
;
u
int
fdp
;
if
(
pipe_alloc
(
&
rfd
,
&
wfd
)
<
0
)
goto
oops
;
...
...
@@ -105,7 +105,7 @@ int
sys_write
(
void
)
{
int
fd
,
n
,
ret
;
u
nsigned
addr
;
u
int
addr
;
struct
proc
*
p
=
curproc
[
cpu
()];
if
(
fetcharg
(
0
,
&
fd
)
<
0
||
fetcharg
(
1
,
&
addr
)
<
0
||
fetcharg
(
2
,
&
n
)
<
0
)
...
...
@@ -124,7 +124,7 @@ int
sys_read
(
void
)
{
int
fd
,
n
,
ret
;
u
nsigned
addr
;
u
int
addr
;
struct
proc
*
p
=
curproc
[
cpu
()];
if
(
fetcharg
(
0
,
&
fd
)
<
0
||
fetcharg
(
1
,
&
addr
)
<
0
||
fetcharg
(
2
,
&
n
)
<
0
)
...
...
@@ -209,7 +209,7 @@ sys_cons_puts(void)
{
char
buf
[
256
];
int
i
;
u
nsigned
addr
;
u
int
addr
;
struct
proc
*
cp
=
curproc
[
cpu
()];
if
(
fetcharg
(
0
,
&
addr
)
<
0
)
...
...
@@ -251,7 +251,7 @@ int
sys_panic
(
void
)
{
struct
proc
*
p
=
curproc
[
cpu
()];
u
nsigned
int
addr
;
uint
addr
;
if
(
fetcharg
(
0
,
&
addr
)
<
0
)
return
-
1
;
...
...
trap.c
浏览文件 @
b5ee5165
...
...
@@ -8,7 +8,7 @@
#include "syscall.h"
struct
Gatedesc
idt
[
256
];
extern
u
nsigned
vectors
[];
/* vectors.S, array of 256 entry point addresses */
extern
u
int
vectors
[];
/* vectors.S, array of 256 entry point addresses */
extern
void
trapenter
(
void
);
extern
void
trapenter1
(
void
);
...
...
@@ -56,8 +56,8 @@ trap(struct Trapframe *tf)
}
if
((
read_eflags
()
&
FL_IF
)
==
0
)
panic
(
"syscall returning but FL_IF clear"
);
if
(
read_esp
()
<
(
u
nsigned
)
cp
->
kstack
||
read_esp
()
>=
(
u
nsigned
)
cp
->
kstack
+
KSTACKSIZE
)
if
(
read_esp
()
<
(
u
int
)
cp
->
kstack
||
read_esp
()
>=
(
u
int
)
cp
->
kstack
+
KSTACKSIZE
)
panic
(
"trap ret esp wrong"
);
if
(
cp
->
killed
)
proc_exit
();
...
...
types.h
浏览文件 @
b5ee5165
typedef
unsigned
int
uint
;
typedef
unsigned
long
long
uint64_t
;
typedef
unsigned
int
uint32_t
;
typedef
unsigned
short
uint16_t
;
typedef
unsigned
char
uint8_t
;
typedef
uint32_t
uintptr_t
;
typedef
uint32_t
physadd
r_t
;
typedef
u
nsigned
int
uin
t
;
typedef
unsigned
int
uint32_t
;
typedef
unsigned
short
uint16_t
;
typedef
unsigned
char
uint8_t
;
typedef
uint32_t
uintpt
r_t
;
typedef
u
int32_t
physaddr_
t
;
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论