Skip to content

Commit

Permalink
wip: boot to novashell started (#918)
Browse files Browse the repository at this point in the history
* feat: add options for socket

* feat: print prettier

* add cloud-seed

* feat: improve debug logging for syscall_handler

* 修复mprotect系统调用未正确设置vm_flags的错误 (#847)

* fix(time): modify update wall time (#836)

更改了时间子系统的update_wall_time函数,通过读取当前周期数,计算delta值进行更新,而不是通过传入delta值进行更新

* chore: 调整triagebot.toml以适应新的组织架构 (#848)

* doc: 完善README.md (#849)

* doc: 完善README.md

* chore: 更新sphinx相关配置,适应read the docs的更新 (#850)

根据read the docs在7月15日blog,进行此修改

https://about.readthedocs.com/blog/2024/07/addons-by-default/

* feat(driver/net): 实现Loopback网卡接口 (#845)

* 初步实现loopback设备

* fix: build-scripts和tools目录下的make check指定工具链版本 (#861)

* fix: tcp poll没有正确处理posix socket的listen状态的问题 (#859)

* chore: 将工具链更新到2024-07-23 (#864)

* chore: 将工具链更新到2024-07-23

* remove uneccecary import

* feat(fs): add eventfd syscall support (#858)

* feat(fs): add eventfd syscall support

* refactor: 删除过时的va-pa转换函数,改为统一使用MMArch (#862)

* 默认nightly-2024-07-23 & config改为config.toml (#872)

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。 (#870)

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。

* make some updates

* chore: 将工具链更新到2024-07-23 (#864)

* chore: 将工具链更新到2024-07-23

* feat(fs): add eventfd syscall support (#858)

* feat(fs): add eventfd syscall support

* refactor: 删除过时的va-pa转换函数,改为统一使用MMArch (#862)

* 默认nightly-2024-07-23 & config改为config.toml (#872)

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。 (#870)

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。

* feat(cred): 初步实现Cred (#846)

* 初步实现Cred

* 添加seteuid和setegid

* 添加cred测试程序

* 修改Cred::fscmp返回结果为CredFsCmp枚举

* 完善root用户相关信息

* feat: alloc 127.0.0.2 ~ 127.0.0.8 to loopback device

* chore: 将工具链更新到2024-07-23 (#864)

* chore: 将工具链更新到2024-07-23

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。 (#870)

* fix: 修复由于升级到2024-07-23工具链之后,某些机器上面内核运行一直fault的问题。

* feat(cred): 初步实现Cred (#846)

* 初步实现Cred

* 添加seteuid和setegid

* 添加cred测试程序

* 修改Cred::fscmp返回结果为CredFsCmp枚举

* 完善root用户相关信息

* allow deadcode

* allign syscall print

* change iface (origin netdevice)

* dev: rebuild net day1

* fix: 修复键盘码解析器没能正确处理类似ctrl C的控制字符的问题 (#877)

* fix: 修复键盘码解析器没能正确处理类似ctrl C的控制字符的问题

* fix: 解决ntty潜在的panic问题

* 重写datagram,构建inet socket底层

* feat: add tcp, add udp poll

* feat: redefine socket interface

* ci: enable ci workflow on branches other than master (#891)

* 修复unlink、unlinkat系统调用的路径错误 (#892)

* fix: socket shutdown wrong implement (#893)

* implment methods with poll_iface, and complete udp tcp poll.

* feat: add tcp connecting middle state

* fix: correct tcp connect state machine

* feat: tcp connect check

* feat: add inet socket iface

* fix net iface poll

* feat: 增加tokio异步运行时支持 (#894)

* fix the EventFdFlags error

* feat: support tokio (Single thread version)

Fix deadlock issue on closing file.
Add function for PipeInode and EventFdInode.

* fix font size problem

* fix: pipe 读取/写入阻塞时,无法kill进程的问题 (#889)

* diable file autoSave on FocusChange, fix tcp method logics

* fix: change back socket inode design.
必须要有一个SocketInode承担IndexNode操作与Socket层之间的交互。
然后发现fcntl是无法将nonblock等flag传入socket层的,需要再改。

* feat: define socket trait, move unused definitions into socket/define

* feat: add recv_msg and send_msg method

* fix: syscalls

* feat: 精简 epoll items

* feat: a "should be able to go though compilation" commit

* feat: more implement on inet poll notification chain

* fix: make fmt

* fix: complete socket startup module

* disable dhcp initialization

---------

Co-authored-by: MemoryShore <[email protected]>
Co-authored-by: 黄铭涛 <[email protected]>
Co-authored-by: LoGin <[email protected]>
Co-authored-by: SMALLC <[email protected]>
Co-authored-by: linfeng <[email protected]>
Co-authored-by: Jomo <[email protected]>
Co-authored-by: Chiichen <[email protected]>
  • Loading branch information
8 people committed Sep 9, 2024
1 parent 703b8e1 commit 06ac60f
Show file tree
Hide file tree
Showing 46 changed files with 1,329 additions and 1,151 deletions.
33 changes: 13 additions & 20 deletions kernel/src/arch/x86_64/syscall/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -105,26 +105,27 @@ pub extern "sysv64" fn syscall_handler(frame: &mut TrapFrame) {
];
mfence();
let pid = ProcessManager::current_pcb().pid();
let mut show =
// false;
(syscall_num != SYS_SCHED) && (pid.data() >= 7) ;
// let mut show = (syscall_num != SYS_SCHED) && (pid.data() >= 7);
let mut show = true;
// false;

let to_print = SysCall::try_from(syscall_num);
if let Ok(to_print) = to_print {
use SysCall::*;
match to_print {
SYS_ACCEPT | SYS_ACCEPT4 | SYS_BIND | SYS_CONNECT | SYS_SHUTDOWN | SYS_LISTEN => {
show &= true;
},
SYS_RECVFROM | SYS_SENDTO | SYS_SENDMSG | SYS_RECVMSG => {
}
SYS_RECVFROM | SYS_SENDTO | SYS_SENDMSG | SYS_RECVMSG => {
show &= true;
},
SYS_SOCKET | SYS_GETSOCKNAME | SYS_GETPEERNAME | SYS_SOCKETPAIR | SYS_SETSOCKOPT | SYS_GETSOCKOPT => {
}
SYS_SOCKET | SYS_GETSOCKNAME | SYS_GETPEERNAME | SYS_SOCKETPAIR | SYS_SETSOCKOPT
| SYS_GETSOCKOPT => {
show &= true;
},
}
_ => {
show &= false;
},
show &= true;
}
}
if show {
debug!("[SYS] [Pid: {:?}] [Call: {:?}]", pid, to_print);
Expand All @@ -141,19 +142,11 @@ pub extern "sysv64" fn syscall_handler(frame: &mut TrapFrame) {
);
}
SYS_ARCH_PRCTL => {
normal_syscall_return!(
Syscall::arch_prctl(args[0], args[1]),
frame,
show
);
normal_syscall_return!(Syscall::arch_prctl(args[0], args[1]), frame, show);
}
_ => {}
}
normal_syscall_return!(
Syscall::handle(syscall_num, &args, frame),
frame,
show
);
normal_syscall_return!(Syscall::handle(syscall_num, &args, frame), frame, show);
}

/// 系统调用初始化
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/arch/x86_64/syscall/nr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -732,4 +732,4 @@ impl From<SysCall> for usize {
fn from(value: SysCall) -> Self {
<SysCall as ToPrimitive>::to_usize(&value).unwrap()
}
}
}
23 changes: 19 additions & 4 deletions kernel/src/driver/acpi/sysfs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,10 +117,25 @@ impl AcpiManager {
self.acpi_table_data_init(&header)?;
}
// TODO:UEVENT
unsafe{
let _ = kobject_uevent(acpi_tables_kset.clone() as Arc<dyn KObject>, KobjectAction::KOBJADD);
let _ = kobject_uevent( __ACPI_TABLES_DATA_KSET_INSTANCE.as_ref().map(|kset| kset.clone() as Arc<dyn KObject>).unwrap(), KobjectAction::KOBJADD);
let _ = kobject_uevent(__ACPI_TABLES_DYNAMIC_KSET_INSTANCE.as_ref().map(|kset| kset.clone() as Arc<dyn KObject>).unwrap(), KobjectAction::KOBJADD);
unsafe {
let _ = kobject_uevent(
acpi_tables_kset.clone() as Arc<dyn KObject>,
KobjectAction::KOBJADD,
);
let _ = kobject_uevent(
__ACPI_TABLES_DATA_KSET_INSTANCE
.as_ref()
.map(|kset| kset.clone() as Arc<dyn KObject>)
.unwrap(),
KobjectAction::KOBJADD,
);
let _ = kobject_uevent(
__ACPI_TABLES_DYNAMIC_KSET_INSTANCE
.as_ref()
.map(|kset| kset.clone() as Arc<dyn KObject>)
.unwrap(),
KobjectAction::KOBJADD,
);
}
return Ok(());
}
Expand Down
20 changes: 11 additions & 9 deletions kernel/src/driver/base/uevent/kobject_uevent.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ pub static UEVENT_SUPPRESS: i32 = 1;
// to be adjust
pub const BUFFERSIZE: usize = 666;


/*
kobject_uevent_env,以envp为环境变量,上报一个指定action的uevent。环境变量的作用是为执行用户空间程序指定运行环境。具体动作如下:
Expand Down Expand Up @@ -148,9 +147,7 @@ pub fn kobject_uevent_env(
}

/* skip the event, if the filter returns zero. */
if kset.as_ref().unwrap().uevent_ops.is_some()
&& kset.as_ref().unwrap().uevent_ops.is_none()
{
if kset.as_ref().unwrap().uevent_ops.is_some() && kset.as_ref().unwrap().uevent_ops.is_none() {
log::info!("filter caused the event to drop!");
return Ok(0);
}
Expand Down Expand Up @@ -458,11 +455,16 @@ pub fn uevent_net_broadcast_untagged(
continue;
}
}
retval =
match netlink_broadcast(&ue_sk.get_sk().upgrade().unwrap(), Arc::clone(&skb), 0, 1, 1) {
Ok(_) => 0,
Err(err) => err.to_posix_errno(),
};
retval = match netlink_broadcast(
&ue_sk.get_sk().upgrade().unwrap(),
Arc::clone(&skb),
0,
1,
1,
) {
Ok(_) => 0,
Err(err) => err.to_posix_errno(),
};

// ENOBUFS should be handled in userspace
if retval == SystemError::ENOBUFS.to_posix_errno()
Expand Down
5 changes: 1 addition & 4 deletions kernel/src/driver/net/e1000e/e1000e_driver.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,7 @@ use core::{
ops::{Deref, DerefMut},
};
use log::info;
use smoltcp::{
phy,
wire::HardwareAddress,
};
use smoltcp::{phy, wire::HardwareAddress};
// use system_error::SystemError;

use super::e1000e::{E1000EBuffer, E1000EDevice};
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/driver/net/loopback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,7 @@ impl LoopbackInterface {
.expect("Push ipCidr failed: full");
}
});

Arc::new(LoopbackInterface {
driver: LoopbackDriverWapper(UnsafeCell::new(driver)),
common: IfaceCommon::new(iface_id, iface),
Expand Down
20 changes: 11 additions & 9 deletions kernel/src/driver/net/mod.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
use alloc::{fmt, string::String, sync::Arc, vec::Vec};

use alloc::{sync::Arc, string::String, fmt, vec::Vec};

use crate::{
libs::{rwlock::RwLock, spinlock::SpinLock},
net::socket::inet::{common::PortManager, InetSocket},
};
use smoltcp;
use system_error::SystemError;
use crate::{libs::{rwlock::RwLock, spinlock::SpinLock}, net::socket::inet::{common::PortManager, InetSocket}};

mod dma;
pub mod e1000e;
Expand All @@ -17,21 +19,21 @@ pub trait Iface: crate::driver::base::device::Device {
/// 获取网卡的公共信息
fn common(&self) -> &IfaceCommon;

/// # `mac`
/// # `mac`
/// 获取网卡的MAC地址
fn mac(&self) -> smoltcp::wire::EthernetAddress;

/// # `name`
/// 获取网卡名
fn name(&self) -> String;

/// # `nic_id`
/// # `nic_id`
/// 获取网卡id
fn nic_id(&self) -> usize {
self.common().iface_id
}

/// # `poll`
/// # `poll`
/// 用于轮询接口的状态。
/// ## 参数
/// - `sockets` :一个可变引用到 `smoltcp::iface::SocketSet`,表示要轮询的套接字集
Expand All @@ -40,7 +42,7 @@ pub trait Iface: crate::driver::base::device::Device {
/// - 如果轮询失败,返回 `Err(SystemError::EAGAIN_OR_EWOULDBLOCK)`,表示需要再次尝试或者操作会阻塞
fn poll(&self);

/// # `update_ip_addrs`
/// # `update_ip_addrs`
/// 用于更新接口的 IP 地址
/// ## 参数
/// - `ip_addrs` :一个包含 `smoltcp::wire::IpCidr` 的切片,表示要设置的 IP 地址和子网掩码
Expand Down Expand Up @@ -76,7 +78,7 @@ pub struct IfaceCommon {
/// 存smoltcp网卡的套接字集
sockets: SpinLock<smoltcp::iface::SocketSet<'static>>,
/// 存 kernel wrap smoltcp socket 的集合
bounds: RwLock<Vec<Arc<InetSocket>>>,
bounds: RwLock<Vec<Arc<dyn InetSocket>>>,
/// 端口管理器
port_manager: PortManager,
/// 下次轮询的时间
Expand Down Expand Up @@ -182,7 +184,7 @@ impl IfaceCommon {
}

// 需要bounds储存具体的Inet Socket信息,以提供不同种类inet socket的事件分发
pub fn bind_socket(&self, socket: Arc<InetSocket>) {
pub fn bind_socket(&self, socket: Arc<dyn InetSocket>) {
self.bounds.write().push(socket);
}
}
4 changes: 4 additions & 0 deletions kernel/src/net/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
//! # 网络模块
//! 注意,net模块下,为了方便导入,模块细分,且共用部分模块直接使用
//! `pub use`导出,导入时也常见`use crate::net::socket::*`的写法,
//! 敬请注意。
use core::{
fmt::{self, Debug},
sync::atomic::AtomicUsize,
Expand Down
10 changes: 4 additions & 6 deletions kernel/src/net/net_core.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ use crate::{

use super::{
event_poll::{EPollEventType, EventPoll},
socket::{
inet::TcpSocket, netlink::skbuff::SkBuff
},
socket::{inet::TcpSocket, netlink::skbuff::SkBuff},
};

/// The network poll function, which will be called by timer.
Expand All @@ -36,7 +34,7 @@ impl TimerFunction for NetWorkPollFunc {
}

pub fn net_init() -> Result<(), SystemError> {
dhcp_query()?;
// dhcp_query()?;
// Init poll timer function
// let next_time = next_n_ms_timer_jiffies(5);
// let timer = Timer::new(Box::new(NetWorkPollFunc), next_time);
Expand All @@ -46,7 +44,7 @@ pub fn net_init() -> Result<(), SystemError> {

fn dhcp_query() -> Result<(), SystemError> {
let binding = NET_DEVICES.write_irqsave();

log::debug!("binding: {:?}", *binding);
//由于现在os未实现在用户态为网卡动态分配内存,而lo网卡的id最先分配且ip固定不能被分配
//所以特判取用id为1的网卡(也就是virto_net)
let net_face = binding.get(&1).ok_or(SystemError::ENODEV)?.clone();
Expand All @@ -62,7 +60,7 @@ fn dhcp_query() -> Result<(), SystemError> {
// IMPORTANT: This should be removed in production.
dhcp_socket.set_max_lease_duration(Some(smoltcp::time::Duration::from_secs(10)));

let sockets = || { net_face.sockets().lock_irqsave() };
let sockets = || net_face.sockets().lock_irqsave();

// let dhcp_handle = SOCKET_SET.lock_irqsave().add(dhcp_socket);
let dhcp_handle = sockets().add(dhcp_socket);
Expand Down
Loading

0 comments on commit 06ac60f

Please sign in to comment.