mirror of
https://github.com/sgmarz/osblog.git
synced 2024-11-27 20:03:32 +04:00
Merge branch 'next'
This commit is contained in:
commit
17303a0d63
@ -242,5 +242,19 @@ pub fn get_mtime() -> usize {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copy one data from one memory location to another.
|
||||||
|
pub unsafe fn memcpy(dest: *mut u8, src: *const u8, bytes: usize) {
|
||||||
|
let bytes_as_8 = bytes / 8;
|
||||||
|
let bytes_as_1 = bytes % 8;
|
||||||
|
let dest_as_8 = dest as *mut u64;
|
||||||
|
let src_as_8 = src as *const u64;
|
||||||
|
|
||||||
|
for i in 0..bytes_as_8 {
|
||||||
|
*(dest_as_8.add(i)) = *(src_as_8.add(i));
|
||||||
|
}
|
||||||
|
let bytes_remaining = bytes_as_8 * 8;
|
||||||
|
for i in bytes_remaining..bytes_remaining+bytes_as_1 {
|
||||||
|
*(dest.add(i)) = *(src.add(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -5,9 +5,10 @@
|
|||||||
|
|
||||||
use crate::{fs::{Descriptor, FileSystem, FsError, Stat},
|
use crate::{fs::{Descriptor, FileSystem, FsError, Stat},
|
||||||
kmem::{kfree, kmalloc, talloc, tfree},
|
kmem::{kfree, kmalloc, talloc, tfree},
|
||||||
process::{add_kernel_process_args, set_running, set_waiting, get_by_pid},
|
process::{add_kernel_process_args, get_by_pid, set_running, set_waiting},
|
||||||
syscall::syscall_block_read};
|
syscall::syscall_block_read};
|
||||||
|
|
||||||
|
use crate::cpu::memcpy;
|
||||||
use alloc::string::String;
|
use alloc::string::String;
|
||||||
use core::{mem::size_of, ptr::null_mut};
|
use core::{mem::size_of, ptr::null_mut};
|
||||||
|
|
||||||
@ -156,10 +157,9 @@ impl FileSystem for MinixFileSystem {
|
|||||||
fn read(desc: &Descriptor, buffer: *mut u8, size: u32, offset: u32) -> u32 {
|
fn read(desc: &Descriptor, buffer: *mut u8, size: u32, offset: u32) -> u32 {
|
||||||
let mut blocks_seen = 0u32;
|
let mut blocks_seen = 0u32;
|
||||||
let offset_block = offset / BLOCK_SIZE;
|
let offset_block = offset / BLOCK_SIZE;
|
||||||
let offset_byte = offset % BLOCK_SIZE;
|
let mut offset_byte = offset % BLOCK_SIZE;
|
||||||
|
|
||||||
let inode_result = Self::get_inode(desc, desc.node);
|
let inode_result = Self::get_inode(desc, desc.node);
|
||||||
let mut block_buffer = BlockBuffer::new(BLOCK_SIZE);
|
|
||||||
if inode_result.is_none() {
|
if inode_result.is_none() {
|
||||||
// The inode couldn't be read, for some reason.
|
// The inode couldn't be read, for some reason.
|
||||||
return 0;
|
return 0;
|
||||||
@ -174,8 +174,9 @@ impl FileSystem for MinixFileSystem {
|
|||||||
else {
|
else {
|
||||||
size
|
size
|
||||||
};
|
};
|
||||||
let mut bytes_left = 0;
|
println!("Bytes left = {}", bytes_left);
|
||||||
let mut bytes_read = 0u32;
|
let mut bytes_read = 0u32;
|
||||||
|
let mut block_buffer = BlockBuffer::new(BLOCK_SIZE);
|
||||||
// In Rust, our for loop automatically "declares" i from 0 to < 7. The syntax
|
// In Rust, our for loop automatically "declares" i from 0 to < 7. The syntax
|
||||||
// 0..7 means 0 through to 7 but not including 7. If we want to include 7, we
|
// 0..7 means 0 through to 7 but not including 7. If we want to include 7, we
|
||||||
// would use the syntax 0..=7.
|
// would use the syntax 0..=7.
|
||||||
@ -198,6 +199,27 @@ impl FileSystem for MinixFileSystem {
|
|||||||
let zone_offset = zone_num * BLOCK_SIZE;
|
let zone_offset = zone_num * BLOCK_SIZE;
|
||||||
println!("Zone #{} -> #{} -> {}", i, zone_num, zone_offset);
|
println!("Zone #{} -> #{} -> {}", i, zone_num, zone_offset);
|
||||||
syc_read(desc, block_buffer.get_mut(), BLOCK_SIZE, zone_offset);
|
syc_read(desc, block_buffer.get_mut(), BLOCK_SIZE, zone_offset);
|
||||||
|
|
||||||
|
let read_this_many = if BLOCK_SIZE - offset_byte > bytes_left {
|
||||||
|
bytes_left
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
BLOCK_SIZE - offset_byte
|
||||||
|
};
|
||||||
|
println!("Copy {} bytes", read_this_many);
|
||||||
|
unsafe {
|
||||||
|
memcpy(
|
||||||
|
buffer.add(bytes_read as usize,),
|
||||||
|
block_buffer.get().add(offset_byte as usize,),
|
||||||
|
read_this_many as usize,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
offset_byte = 0;
|
||||||
|
bytes_read += read_this_many;
|
||||||
|
bytes_left -= read_this_many;
|
||||||
|
if bytes_left == 0 {
|
||||||
|
return bytes_read;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
blocks_seen += 1;
|
blocks_seen += 1;
|
||||||
}
|
}
|
||||||
@ -245,7 +267,7 @@ fn read_proc(args_addr: usize) {
|
|||||||
size: 500,
|
size: 500,
|
||||||
pid: args.pid, };
|
pid: args.pid, };
|
||||||
|
|
||||||
let bytes = MinixFileSystem::read(&desc, args.buffer, args.offset, args.size);
|
let bytes = MinixFileSystem::read(&desc, args.buffer, args.size, args.offset);
|
||||||
|
|
||||||
// Let's write the return result into regs[10], which is A0.
|
// Let's write the return result into regs[10], which is A0.
|
||||||
let ptr = unsafe { get_by_pid(args.pid) };
|
let ptr = unsafe { get_by_pid(args.pid) };
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
// 27 Nov 2019
|
// 27 Nov 2019
|
||||||
|
|
||||||
use crate::{cpu::{build_satp, get_mtime, satp_fence_asid, CpuMode, SatpMode, TrapFrame},
|
use crate::{cpu::{build_satp, get_mtime, satp_fence_asid, CpuMode, SatpMode, TrapFrame},
|
||||||
page::{alloc, dealloc, map, unmap, zalloc, EntryBits, Table, PAGE_SIZE}};
|
page::{alloc, dealloc, map, unmap, zalloc, EntryBits, Table, PAGE_SIZE},
|
||||||
use crate::syscall::syscall_exit;
|
syscall::syscall_exit};
|
||||||
use alloc::collections::vec_deque::VecDeque;
|
use alloc::collections::vec_deque::VecDeque;
|
||||||
use core::ptr::null_mut;
|
use core::ptr::null_mut;
|
||||||
|
|
||||||
@ -152,15 +152,13 @@ fn init_process() {
|
|||||||
// We can't do much here until we have system calls because
|
// We can't do much here until we have system calls because
|
||||||
// we're running in User space.
|
// we're running in User space.
|
||||||
loop {
|
loop {
|
||||||
// Eventually, this will be a sleep system call.
|
// Alright, I forgot. We cannot put init to sleep since the
|
||||||
unsafe {
|
// scheduler will loop until it finds a process to run. Since
|
||||||
extern "C" {
|
// the scheduler is called in an interrupt context, nothing else
|
||||||
fn make_syscall(sysno: usize, duration: usize) -> usize;
|
// can happen until a process becomes available.
|
||||||
}
|
|
||||||
println!("Init is still here :), alright, back to sleep.");
|
println!("Init is still here :), alright, back to sleep.");
|
||||||
for _ in 0..500 {
|
for _ in 0..500 {
|
||||||
llvm_asm!("wfi");
|
unsafe { asm!("wfi") };
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,7 +244,9 @@ pub fn add_kernel_process(func: fn()) -> u16 {
|
|||||||
// Now, we no longer need the owned Deque, so we hand it
|
// Now, we no longer need the owned Deque, so we hand it
|
||||||
// back by replacing the PROCESS_LIST's None with the
|
// back by replacing the PROCESS_LIST's None with the
|
||||||
// Some(pl).
|
// Some(pl).
|
||||||
unsafe { PROCESS_LIST.replace(pl); }
|
unsafe {
|
||||||
|
PROCESS_LIST.replace(pl);
|
||||||
|
}
|
||||||
my_pid
|
my_pid
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -258,6 +258,11 @@ pub fn add_kernel_process(func: fn()) -> u16 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A kernel process is just a function inside of the kernel. Each
|
||||||
|
/// function will perform a "ret" or return through the return address
|
||||||
|
/// (ra) register. This function address is what it will return to, which
|
||||||
|
/// in turn calls exit. If we don't exit, the process will most likely
|
||||||
|
/// fault.
|
||||||
fn ra_delete_proc() {
|
fn ra_delete_proc() {
|
||||||
syscall_exit();
|
syscall_exit();
|
||||||
}
|
}
|
||||||
@ -316,7 +321,9 @@ pub fn add_kernel_process_args(func: fn(args_ptr: usize), args: usize) -> u16 {
|
|||||||
// Now, we no longer need the owned Deque, so we hand it
|
// Now, we no longer need the owned Deque, so we hand it
|
||||||
// back by replacing the PROCESS_LIST's None with the
|
// back by replacing the PROCESS_LIST's None with the
|
||||||
// Some(pl).
|
// Some(pl).
|
||||||
unsafe { PROCESS_LIST.replace(pl); }
|
unsafe {
|
||||||
|
PROCESS_LIST.replace(pl);
|
||||||
|
}
|
||||||
my_pid
|
my_pid
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -328,7 +335,6 @@ pub fn add_kernel_process_args(func: fn(args_ptr: usize), args: usize) -> u16 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// This should only be called once, and its job is to create
|
/// This should only be called once, and its job is to create
|
||||||
/// the init process. Right now, this process is in the kernel,
|
/// the init process. Right now, this process is in the kernel,
|
||||||
/// but later, it should call the shell.
|
/// but later, it should call the shell.
|
||||||
@ -360,7 +366,6 @@ pub fn init() -> usize {
|
|||||||
// Waiting - means that the process is waiting on I/O
|
// Waiting - means that the process is waiting on I/O
|
||||||
// Dead - We should never get here, but we can flag a process as Dead and clean
|
// Dead - We should never get here, but we can flag a process as Dead and clean
|
||||||
// it out of the list later.
|
// it out of the list later.
|
||||||
#[repr(u8)]
|
|
||||||
pub enum ProcessState {
|
pub enum ProcessState {
|
||||||
Running,
|
Running,
|
||||||
Sleeping,
|
Sleeping,
|
||||||
@ -368,12 +373,6 @@ pub enum ProcessState {
|
|||||||
Dead,
|
Dead,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let's represent this in C ABI. We do this
|
|
||||||
// because we need to access some of the fields
|
|
||||||
// in assembly. Rust gets to choose how it orders
|
|
||||||
// the fields unless we represent the structure in
|
|
||||||
// C-style ABI.
|
|
||||||
#[repr(C)]
|
|
||||||
pub struct Process {
|
pub struct Process {
|
||||||
frame: *mut TrapFrame,
|
frame: *mut TrapFrame,
|
||||||
stack: *mut u8,
|
stack: *mut u8,
|
||||||
|
@ -7,7 +7,7 @@ pub fn test_block() {
|
|||||||
let buffer = crate::kmem::kmalloc(1024);
|
let buffer = crate::kmem::kmalloc(1024);
|
||||||
println!("Started test block process, buffer is at {:p}.", buffer);
|
println!("Started test block process, buffer is at {:p}.", buffer);
|
||||||
unsafe {
|
unsafe {
|
||||||
syscall_fs_read(8, 1, buffer, 0, 1024);
|
syscall_fs_read(8, 12, buffer, 1024, 0);
|
||||||
for i in 0..32 {
|
for i in 0..32 {
|
||||||
print!("{:02x} ", buffer.add(i).read());
|
print!("{:02x} ", buffer.add(i).read());
|
||||||
if (i+1) % 16 == 0 {
|
if (i+1) % 16 == 0 {
|
||||||
|
Loading…
Reference in New Issue
Block a user