diff --git a/kernel/include/process.hpp b/kernel/include/process.hpp index 0139fbe7..aef1528a 100644 --- a/kernel/include/process.hpp +++ b/kernel/include/process.hpp @@ -68,6 +68,8 @@ struct process_t { volatile interrupt::syscall_regs* context; std::vector segments; + + std::string name; }; constexpr const size_t program_base = 0x8000000000; diff --git a/kernel/include/scheduler.hpp b/kernel/include/scheduler.hpp index 7d96bb69..da1a551f 100644 --- a/kernel/include/scheduler.hpp +++ b/kernel/include/scheduler.hpp @@ -56,8 +56,8 @@ void set_working_directory(const std::vector& directory); void block_process_light(pid_t pid); //TODO Maybe do that for unblock as well! -process_t& create_kernel_task(char* user_stack, char* kernel_stack, void (*fun)()); -process_t& create_kernel_task_args(char* user_stack, char* kernel_stack, void (*fun)(void*), void* data); +process_t& create_kernel_task(const char* name, char* user_stack, char* kernel_stack, void (*fun)()); +process_t& create_kernel_task_args(const char* name, char* user_stack, char* kernel_stack, void (*fun)(void*), void* data); void queue_system_process(pid_t pid); /*! diff --git a/kernel/src/fs/procfs.cpp b/kernel/src/fs/procfs.cpp index afc7f690..3cbc1164 100644 --- a/kernel/src/fs/procfs.cpp +++ b/kernel/src/fs/procfs.cpp @@ -46,6 +46,8 @@ std::string get_value(uint64_t pid, const std::string& name){ return process.process.system ? "true" : "false"; } else if(name == "priority"){ return std::to_string(process.process.priority); + } else if(name == "name"){ + return process.process.name; } else { return ""; } @@ -63,6 +65,7 @@ procfs::procfs_file_system::procfs_file_system(std::string mp) : mount_point(mp) standard_contents.emplace_back("state", false, false, false, 0); standard_contents.emplace_back("system", false, false, false, 0); standard_contents.emplace_back("priority", false, false, false, 0); + standard_contents.emplace_back("name", false, false, false, 0); } procfs::procfs_file_system::~procfs_file_system(){ diff --git a/kernel/src/network.cpp b/kernel/src/network.cpp index fb4e961a..124e8c8c 100644 --- a/kernel/src/network.cpp +++ b/kernel/src/network.cpp @@ -107,8 +107,8 @@ void network::finalize(){ auto* tx_user_stack = new char[scheduler::user_stack_size]; auto* tx_kernel_stack = new char[scheduler::kernel_stack_size]; - auto& rx_process = scheduler::create_kernel_task_args(rx_user_stack, rx_kernel_stack, &rx_thread, &interface); - auto& tx_process = scheduler::create_kernel_task_args(tx_user_stack, tx_kernel_stack, &tx_thread, &interface); + auto& rx_process = scheduler::create_kernel_task_args("net_rx", rx_user_stack, rx_kernel_stack, &rx_thread, &interface); + auto& tx_process = scheduler::create_kernel_task_args("net_tx", tx_user_stack, tx_kernel_stack, &tx_thread, &interface); rx_process.ppid = 1; tx_process.ppid = 1; diff --git a/kernel/src/scheduler.cpp b/kernel/src/scheduler.cpp index 12d4096e..4248067b 100644 --- a/kernel/src/scheduler.cpp +++ b/kernel/src/scheduler.cpp @@ -229,7 +229,7 @@ void queue_process(scheduler::pid_t pid){ } void create_idle_task(){ - auto& idle_process = scheduler::create_kernel_task(new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &idle_task); + auto& idle_process = scheduler::create_kernel_task("idle", new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &idle_task); idle_process.ppid = 0; idle_process.priority = scheduler::MIN_PRIORITY; @@ -240,7 +240,7 @@ void create_idle_task(){ } void create_init_task(){ - auto& init_process = scheduler::create_kernel_task(new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &init_task); + auto& init_process = scheduler::create_kernel_task("init", new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &init_task); init_process.ppid = 0; init_process.priority = scheduler::MIN_PRIORITY + 1; @@ -249,7 +249,7 @@ void create_init_task(){ } void create_gc_task(){ - auto& gc_process = scheduler::create_kernel_task(new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &gc_task); + auto& gc_process = scheduler::create_kernel_task("gc", new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &gc_task); gc_process.ppid = 1; gc_process.priority = scheduler::MIN_PRIORITY + 1; @@ -260,7 +260,7 @@ void create_gc_task(){ } void create_post_init_task(){ - auto& post_init_process = scheduler::create_kernel_task(new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &post_init_task); + auto& post_init_process = scheduler::create_kernel_task("post_init", new char[scheduler::user_stack_size], new char[scheduler::kernel_stack_size], &post_init_task); post_init_process.ppid = 1; post_init_process.priority = scheduler::MAX_PRIORITY; @@ -632,6 +632,8 @@ int64_t scheduler::exec(const std::string& file, const std::vector& auto& process = new_process(); + process.name = file; + if(!create_paging(buffer, process)){ logging::log(logging::log_level::DEBUG, "scheduler:exec: Impossible to create paging\n"); @@ -896,12 +898,13 @@ void scheduler::set_working_directory(const std::vector& directory) pcb[current_pid].working_directory = directory; } -scheduler::process_t& scheduler::create_kernel_task(char* user_stack, char* kernel_stack, void (*fun)()){ +scheduler::process_t& scheduler::create_kernel_task(const char* name, char* user_stack, char* kernel_stack, void (*fun)()){ auto& process = new_process(); process.system = true; process.physical_cr3 = paging::get_physical_pml4t(); process.paging_size = 0; + process.name = name; // Directly uses memory of the executable process.physical_user_stack = 0; @@ -931,8 +934,8 @@ scheduler::process_t& scheduler::create_kernel_task(char* user_stack, char* kern return process; } -scheduler::process_t& scheduler::create_kernel_task_args(char* user_stack, char* kernel_stack, void (*fun)(void*), void* data){ - auto& process = scheduler::create_kernel_task(user_stack, kernel_stack, reinterpret_cast(fun)); +scheduler::process_t& scheduler::create_kernel_task_args(const char* name, char* user_stack, char* kernel_stack, void (*fun)(void*), void* data){ + auto& process = scheduler::create_kernel_task(name, user_stack, kernel_stack, reinterpret_cast(fun)); // rdi is the first register used for integers parameter passing process.context->rdi = reinterpret_cast(data); diff --git a/kernel/src/thor_acpi.cpp b/kernel/src/thor_acpi.cpp index 5ba12e31..a0165e10 100644 --- a/kernel/src/thor_acpi.cpp +++ b/kernel/src/thor_acpi.cpp @@ -186,7 +186,7 @@ ACPI_STATUS AcpiOsExecute(ACPI_EXECUTE_TYPE /*type*/, ACPI_OSD_EXEC_CALLBACK fun auto* user_stack = new char[scheduler::user_stack_size]; auto* kernel_stack = new char[scheduler::kernel_stack_size]; - auto& process = scheduler::create_kernel_task_args(user_stack, kernel_stack, function, context); + auto& process = scheduler::create_kernel_task_args("acpi", user_stack, kernel_stack, function, context); process.ppid = scheduler::get_pid(); logging::logf(logging::log_level::DEBUG, "ACPICA new process %u\n", process.pid); diff --git a/programs/ps/src/main.cpp b/programs/ps/src/main.cpp index f4f0ac1c..d6b32336 100644 --- a/programs/ps/src/main.cpp +++ b/programs/ps/src/main.cpp @@ -58,7 +58,7 @@ const char* state_str(uint64_t state){ case 1: return "NEW"; case 2: - return "READ"; + return "READY"; case 3: return "RUNNING"; case 4: @@ -79,6 +79,8 @@ const char* state_str(uint64_t state){ int main(int /*argc*/, char* /*argv*/[]){ auto fd = open("/proc/"); + printf("PID PPID Pri State Name\n"); + if(fd.valid()){ auto info = stat(*fd); @@ -101,11 +103,12 @@ int main(int /*argc*/, char* /*argv*/[]){ auto system = read_file(base_path + entry_name + "/system") == "true"; auto priority = parse(read_file(base_path + entry_name + "/priority")); auto state = parse(read_file(base_path + entry_name + "/state")); + auto name = read_file(base_path + entry_name + "/name"); if(system){ - printf("%u %u %u %s [kernel]\n", pid, ppid, priority, state_str(state)); + printf("%3u %4u %3u %10s %s [kernel]\n", pid, ppid, priority, state_str(state), name.c_str()); } else { - printf("%u %u %u %s \n", pid, ppid, priority, state_str(state)); + printf("%3u %4u %3u %10s %s \n", pid, ppid, priority, state_str(state), name.c_str()); } if(!entry->offset_next){