Initial commit

This commit is contained in:
Vinicius Silva 2024-03-22 21:32:30 -03:00
commit c0251a8ae0
17 changed files with 330 additions and 0 deletions

7
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,7 @@
{
"files.associations": {
"ipc.h": "c",
"shm.h": "c",
"process.h": "c"
}
}

42
CMakeLists.txt Normal file
View File

@ -0,0 +1,42 @@
cmake_minimum_required(VERSION 2.8)
project(ipc)
set(INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
set(SRC_DIR ${CMAKE_SOURCE_DIR}/src)
execute_process(
COMMAND mkdir -p bin
COMMAND mkdir -p /usr/include/ipc/
)
include_directories(${INCLUDE_DIR})
set(INCLUDE_FILES
${INCLUDE_DIR}/utils/kassert
${INCLUDE_DIR}/utils/kpanic
${INCLUDE_DIR}/utils/kprint
${INCLUDE_DIR}/utils/null
${INCLUDE_DIR}/ipc
${INCLUDE_DIR}/pm
${INCLUDE_DIR}/process
${INCLUDE_DIR}/semaphore
${INCLUDE_DIR}/shm
)
set(SOURCE_FILES
${SRC_DIR}/ipc.c
${SRC_DIR}/pm.c
${SRC_DIR}/process.c
${SRC_DIR}/semaphore.c
${SRC_DIR}/shm.c
)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native")
add_executable(./bin/kmain ${SOURCE_FILES} ./src/kmain.c)
target_include_directories(./bin/kmain PUBLIC ${INCLUDE_DIR})

29
include/ipc.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef __IPC_H__
#include "process.h"
#include "shm.h"
#include <stdint.h>
#include <stddef.h>
#define QEQUE_SIZE 16
typedef struct ipc_message {
__pid_t pid;
size_t size;
char* message;
} ipc_message_t;
typedef struct ipc {
__pid_t first_pid;
__pid_t second_pid;
shmseg *shm;
ipc_message_t qeque[QEQUE_SIZE];
} ipc_t;
extern void ipc_init();
extern void ipc_send(ipc_t ipc, struct process process);
extern void ipc_receive(ipc_t ipc, struct process process);
extern void ipc_destroy(ipc_t ipc);
#endif // __IPC_H__

7
include/pm.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef __PM_H__
extern void pm_init();
extern void pm_destroy();
extern void pm_create_process();
#endif // __PM_H__

20
include/process.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef __PROCESS_H__
#include <stdint.h>
#include <stdbool.h>
typedef struct process {
uint32_t pid;
char* name;
uint32_t priority;
bool alive;
bool state;
uint32_t next;
}process_t;
extern void process_init();
extern void process_destroy(__pid_t pid);
extern __pid_t process_create();
extern void exit_all_process();
#endif // __PROCESS_H__

14
include/semaphore.h Normal file
View File

@ -0,0 +1,14 @@
#ifndef __SEMAPHORE_H__
typedef struct semaphore{
int value;
int waiting;
int* queue;
}sem_t;
extern void semaphore_init(sem_t sem, int value);
extern void semaphore_wait(sem_t sem);
extern void semaphore_signal(sem_t sem);
extern void semaphore_destroy(sem_t sem);
#endif // __SEMAPHORE_H__

20
include/shm.h Normal file
View File

@ -0,0 +1,20 @@
#ifndef __SHM_H__
#include <stdint.h>
#include <stddef.h>
typedef unsigned int shm_id_t;
#define SHM_SIZE 4096
typedef struct shm_segment{
size_t size;
shm_id_t id;
uint32_t buff[SHM_SIZE];
}shmseg;
extern shmseg *shm_init();
extern void shm_write(shmseg *shm, uint8_t data[]);
extern void shm_destroy(shmseg *shm);
#endif // __SHM_H__

7
include/utils/kassert.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef __KASSERT_H__
#include "kpanic.h"
#define KASSERT(exp, failed_msg) exp ? 0 : kpanic("ASSERTION FAILED! " failed_msg)
#endif // __KASSERT_H__

5
include/utils/kpanic.h Normal file
View File

@ -0,0 +1,5 @@
#ifndef __PANIC_H__
#define kpanic(x) printf("panic: %s\n", x); while(1);
#endif // __PANIC_H__

6
include/utils/kprint.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __KPRINT_H__
#include <stdio.h>
#define kprint(msg) printf("%s", msg);
#endif // __KPRINT_H__

4
include/utils/null.h Normal file
View File

@ -0,0 +1,4 @@
#ifndef __KNULL_H__
#define KNULL ((void*)0)
#endif // __KNULL_H__

32
src/ipc.c Normal file
View File

@ -0,0 +1,32 @@
#include "../include/ipc.h"
#include "../include/shm.h"
static void ipc_init()
{
ipc_t ipc;
ipc.first_pid = 0;
ipc.second_pid = 0;
ipc.shm = shm_init();
}
static void ipc_send(ipc_t ipc, struct process process)
{
}
static void ipc_receive(ipc_t ipc, struct process process)
{
}
static void ipc_destroy(ipc_t ipc)
{
process_destroy(ipc.first_pid);
process_destroy(ipc.second_pid);
free(ipc.qeque);
shm_destroy(ipc.shm);
free(ipc);
}

5
src/kmain.c Normal file
View File

@ -0,0 +1,5 @@
int main(int argc, int *argv[])
{
return 0;
}

18
src/pm.c Normal file
View File

@ -0,0 +1,18 @@
#include "../include/pm.h"
#include "../include/process.h"
static void pm_init()
{
kprint("Initializing process manager");
process_init();
}
static void pm_destroy()
{
exit_all_process();
}
__pid_t pm_create_process()
{
__pid_t pid = process_create();
return pid;
}

56
src/process.c Normal file
View File

@ -0,0 +1,56 @@
#include "../include/process.h"
#include "../include/utils/null.h"
#include <stdbool.h>
#define MAX_PROCESSES 16
#define ROOT_PID 1
process_t processes[MAX_PROCESSES];
static __pid_t next_pid = 0;
void process_init()
{
process_create();
processes[ROOT_PID-1].alive = true;
for (int i = 1; i < MAX_PROCESSES; i++)
{
process_create();
}
}
void process_destroy(__pid_t pid)
{
KASSERT(pid >= ROOT_PID && pid <= MAX_PROCESSES, "Invalid pid");
KASSERT(pid != ROOT_PID, "Cannot destroy root process");
processes[pid-1].pid = 0;
processes[pid-1].name = NULL;
processes[pid-1].priority = 0;
processes[pid-1].state = false;
processes[pid-1].next = 0;
}
void exit_all_process()
{
for(int curr_pid = ROOT_PID; curr_pid < MAX_PROCESSES; curr_pid++)
{
process_destroy(curr_pid);
}
}
__pid_t process_create()
{
KASSERT((++next_pid) < MAX_PROCESSES, "Max processes reached");
process_t process;
process.pid = ++next_pid;
process.name = NULL;
process.priority = 0;
process.state = false;
process.next = 0;
processes[process.pid-1] = process;
return process.pid;
}

21
src/semaphore.c Normal file
View File

@ -0,0 +1,21 @@
#include "../include/semaphore.h"
static void semaphore_init(sem_t sem, int value)
{
}
static void semaphore_wait(sem_t sem)
{
}
static void semaphore_signal(sem_t sem)
{
}
static void semaphore_destroy(sem_t sem)
{
}

37
src/shm.c Normal file
View File

@ -0,0 +1,37 @@
#include "../include/shm.h"
#include "../include/utils/kassert.h"
#include <sys/shm.h>
#define BUF_SIZE 1024
#define SHM_KEY 0x1234
static shmseg *shm_init()
{
shm_id_t shmid;
shmseg *shmp;
shmid = shmget(SHM_KEY, sizeof(shmseg), 0644|IPC_CREAT);
KASSERT(shmid != -1, "Shared memory creation error!");
// Attach to the segment to get a pointer to it.
shmp = shmat(shmid, NULL, 0);
KASSERT(shmp != (void*) -1, "Shared memory attach error!");
shmp->size = 0;
shmp->id = shmid;
return shmp;
}
static void shm_write(shmseg *shm, uint8_t data[])
{
}
static void shm_destroy(shmseg *shm)
{
shmctl(shm->id, IPC_RMID, NULL);
free(shm);
}