Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
K
kernel
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
abinade2
kernel
Commits
8924d5d9
Commit
8924d5d9
authored
7 years ago
by
kexu6
Browse files
Options
Downloads
Patches
Plain Diff
add comments and bug log
parent
6e7f5573
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
student-distrib/proc.c
+10
-8
10 additions, 8 deletions
student-distrib/proc.c
student-distrib/syscall.c
+34
-76
34 additions, 76 deletions
student-distrib/syscall.c
with
44 additions
and
84 deletions
student-distrib/proc.c
+
10
−
8
View file @
8924d5d9
...
...
@@ -35,7 +35,8 @@ int32_t fd_check(int32_t fd)
if
(
fd
>=
MIN_FILE_NUM
&&
fd
<
MAX_FILE_NUM
)
{
/* Now check if file is present */
if
(
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
!=
0
)
// // use running_terminal instead of visible_terminal !!!
if
(
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
!=
0
)
return
0
;
}
return
-
1
;
...
...
@@ -44,13 +45,14 @@ int32_t fd_check(int32_t fd)
//clearing fd
void
fd_clear
(
int32_t
fd
)
{
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
read
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
write
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
open
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
close
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
inode_index
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
file_pos
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
=
0
;
// use running_terminal instead of visible_terminal !!!
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
read
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
write
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
open
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
close
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
inode_index
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
file_pos
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
=
0
;
return
;
}
...
...
This diff is collapsed.
Click to expand it.
student-distrib/syscall.c
+
34
−
76
View file @
8924d5d9
...
...
@@ -6,20 +6,16 @@
*
* DESCRIPTION: This function terminates a process, returning the specified value to its parent process.
*
* INPUT: status
--
* INPUT: status
*
* RETURN:
* RETURN:
always return 0
*/
int32_t
halt
(
uint8_t
status
)
{
int32_t
halt
(
uint8_t
status
)
{
int
i
;
cli
();
pcb_t
*
pcb_cur
=
terminal
[
running_terminal
].
pcb
;
// printf("[halt] running_terminal = %d\n", running_terminal);
pcb_t
*
pcb_prev
=
pcb_cur
->
parent_pcb
;
/* set all present flags in PCB to "Not In Use" */
...
...
@@ -38,6 +34,7 @@ int32_t halt (uint8_t status)
terminal
[
pcb_cur
->
running_terminal
].
terminal_prog_count
--
;
}
// exiting "root shell"
if
(
terminal
[
running_terminal
].
terminal_prog_count
==
0
)
{
printf
(
"[halt] executing new shell...
\n
"
);
...
...
@@ -57,13 +54,12 @@ int32_t halt (uint8_t status)
clear_pid
(
pcb_cur
->
pid
);
//------------------ Jump to execute return --------------------------------
asm
volatile
(
"movl %0, %%eax;"
"movl %1, %%esp;"
"movl %2, %%ebp;"
"movl %1, %%esp;"
// restore parent_esp
"movl %2, %%ebp;"
// restore parent_ebp
"jmp exec_ret"
:
:
"r"
((
uint32_t
)
status
),
"r"
(
pcb_cur
->
parent_esp
),
"r"
(
pcb_cur
->
parent_ebp
)
...
...
@@ -94,18 +90,12 @@ int32_t execute(const uint8_t* command)
cli
();
// i
f
command
== NULL, abort
// i
nvalid
command
if
(
command
==
NULL
)
return
-
1
;
// if(strncmp("\n", command, 1) == 0)
// return 0;
if
(
strlen
((
int8_t
*
)
command
)
==
1
)
return
0
;
// printf("[EXE] running_terminal = %d\n", running_terminal);
// printf("[EXE] (command) = %s\n", command);
//------------------ 0 : Parse args ----------------------------------------
uint8_t
parsed_cmd
[
MAX_COMMAND_SIZE
];
...
...
@@ -116,24 +106,15 @@ int32_t execute(const uint8_t* command)
ret
=
parse_cmd
(
command
,
parsed_cmd
,
argv
);
/* For keyboard interrupts */
//sti();
//set argument number for pcb initialization
// set argument number for pcb initialization
arg_num
=
(
ret
>
-
1
)
?
ret
:
0
;
if
(
ret
==
-
1
)
return
-
1
;
else
if
(
ret
==
-
2
)
if
(
ret
==
-
1
)
return
-
1
;
exit
();
if
(
ret
==
-
2
)
exit
();
//------------------ 1: Executable check -----------------------------------
// if cpu reaches its maximum control, abort
if
(
total_prog_count
>=
MAX_PROCESS
)
{
printf
(
"[execute] Reached maximum number of processes %d
\n
"
,
MAX_PROCESS
);
...
...
@@ -153,20 +134,19 @@ int32_t execute(const uint8_t* command)
{
return
-
1
;
}
// if not an executable file
if
(
(
buf
[
0
]
!=
AS_DEL
)
||
(
buf
[
1
]
!=
AS_E
)
||
(
buf
[
2
]
!=
AS_L
)
||
(
buf
[
3
]
!=
AS_F
)
)
{
return
-
1
;
}
// Get
free PID index
// Get
a new pid
pid
=
set_pid
();
/* Test variables */
total_prog_count
++
;
terminal
[
running_terminal
].
terminal_prog_count
++
;
//get entry point from bytes 24 to 27 in exe file
read_data
(
dentry
.
inode_index
,
ENTRY_POINT
,
buf
,
4
);
entry_point
=
*
((
uint32_t
*
)
buf
);
//-------------------- 3: Paging -------------------------------------------
...
...
@@ -215,16 +195,7 @@ int32_t execute(const uint8_t* command)
if
(
strncmp
(
"shell"
,
(
int8_t
*
)
parsed_cmd
,
5
)
==
0
)
terminal
[
running_terminal
].
pcb
->
shell_flag
=
1
;
//printf("[EXE] using pcb = %x\n", terminal[running_terminal].pcb);
//printf("[EXE] set pcb ebp to %x , esp to %x\n", terminal[running_terminal].pcb->current_ebp, terminal[running_terminal].pcb->current_esp);
//printf("[EXE] should be ebp %x , esp %x\n", temp_ebp, temp_esp);
//--------------------- 6: scheduling initilization -----------------------
//--------------------- 7: context switch-----------------------------------
//--------------------- 6: context switch-----------------------------------
// update SS0 and ESP0 in Task State Segment when switching context
tss
.
ss0
=
KERNEL_DS
;
...
...
@@ -308,8 +279,6 @@ int32_t write (int32_t fd, const void* buf, int32_t nbytes){
int32_t
ret
;
//printf("[sys write] before = %d\n", running_terminal);
if
(
fd_check
(
fd
)
<
0
||
fd
==
STDIN_FD
)
return
-
1
;
// invalid fd
if
(
buf
==
NULL
)
return
-
1
;
// invalid buf
...
...
@@ -318,8 +287,6 @@ int32_t write (int32_t fd, const void* buf, int32_t nbytes){
ret
=
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
write
(
fd
,
buf
,
nbytes
);
//printf("[sys write] after = %d\n", running_terminal);
return
ret
;
}
...
...
@@ -339,41 +306,38 @@ int32_t open (const uint8_t* filename){
int
i
;
int
fd
=
-
1
;
int
type
;
dentry_t
dentry
;
//terminal[ running_terminal].pcb = current_pcb();
/* Valid file name check */
// invalid file name
if
(
strlen
(
(
char
*
)
filename
)
==
0
)
return
-
1
;
/* File does not exist */
if
(
read_dentry_by_name
(
filename
,
&
(
dentry
))
!=
0
)
return
-
1
;
/* File type checks */
type
=
dentry
.
file_type
;
if
(
type
<
0
||
type
>
2
)
return
-
1
;
if
(
dentry
.
file_type
<
0
||
dentry
.
file_type
>
2
)
return
-
1
;
/* Looking for available space in FD table */
for
(
i
=
USER_FILE_START
;
i
<
MAX_FILE_NUM
;
i
++
){
/
* Check if FD table entry is unused */
/
/ if we can find a free fd
if
(
terminal
[
running_terminal
].
pcb
->
fd
[
i
].
flags
==
0
)
{
fd
=
i
;
break
;
}
/
* FD table is full */
/
/ no free fd
if
(
i
==
MAX_FILE_NUM
-
1
)
return
-
1
;
}
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
inode_index
=
(
type
==
2
)
?
dentry
.
inode_index
:
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
file_pos
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
=
1
;
// only regular file has inode, for other file types, set inode to 0
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
inode_index
=
(
dentry
.
file_type
==
2
)
?
dentry
.
inode_index
:
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
file_pos
=
0
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
flags
=
1
;
switch
(
type
)
{
// insert file specific operation table
switch
(
dentry
.
file_type
)
{
case
0
:
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
=
rtc_jumptable
;
break
;
...
...
@@ -385,9 +349,7 @@ int32_t open (const uint8_t* filename){
break
;
}
//sti();
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
open
(
filename
);
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
open
(
filename
);
return
fd
;
}
...
...
@@ -408,8 +370,10 @@ int32_t open (const uint8_t* filename){
*/
int32_t
close
(
int32_t
fd
)
{
// invalid fd
if
(
fd_check
(
fd
)
<
0
||
fd
<
USER_FILE_START
)
return
-
1
;
// invalid fd
return
-
1
;
terminal
[
running_terminal
].
pcb
->
fd
[
fd
].
fileop_ptr
.
close
(
fd
);
...
...
@@ -437,25 +401,19 @@ int32_t getargs (uint8_t* buf, int32_t nbytes){
uint8_t
*
argument
;
//terminal[ running_terminal].pcb = current_pcb();
argument
=
(
uint8_t
*
)
(
terminal
[
running_terminal
].
pcb
->
argv
);
if
(
terminal
[
running_terminal
].
pcb
->
arg_num
==
0
||
nbytes
<=
0
)
//If there are no arguments
if
(
terminal
[
running_terminal
].
pcb
->
arg_num
==
0
||
nbytes
<=
0
)
{
//printf("[getargs] return -1\n");
return
-
1
;
//If there are no arguments
return
-
1
;
}
//if the arguments and a terminal NULL (0-byte) do not fit in the buffer.
//
if the arguments and a terminal NULL (0-byte) do not fit in the buffer.
nbytes
=
(
nbytes
>
MAX_ARGUMENT_SIZE
*
MAX_ARGUMENT_NUM
)
?
MAX_ARGUMENT_SIZE
*
MAX_ARGUMENT_NUM
:
nbytes
;
memcpy
(
buf
,
argument
,
nbytes
);
// uint32_t i;
// //printf("[getargs] argument number = %d\n", terminal[ running_terminal].pcb->arg_num);
// for(i = 0; i < terminal[ running_terminal].pcb->arg_num; i++)
// //printf("[getargs] buf[%d] = %s\n", i, buf+i*MAX_ARGUMENT_SIZE);
//printf("[getargs] return 0\n");
return
0
;
}
...
...
@@ -467,7 +425,7 @@ int32_t getargs (uint8_t* buf, int32_t nbytes){
* Although the address returned is always the same, it should be written into the memory
* location provided by the caller (which must be checked for validity).
*
* INPUT: screen_start
--
* INPUT: screen_start
*
* RETURN: -1 If the location is invalid.
*
...
...
@@ -492,7 +450,7 @@ int32_t vidmap (uint8_t** screen_start)
remap_vidmem
();
*
screen_start
=
(
uint8_t
*
)(
0x8400000
);
*
screen_start
=
(
uint8_t
*
)(
0x8400000
);
// 132MB, video memory starting address
return
0x8400000
;
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment