Add: basic scheduler
This commit is contained in:
		
							
								
								
									
										11
									
								
								src/isr.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/isr.c
									
									
									
									
									
								
							| @@ -4,6 +4,7 @@ | |||||||
| #include "pic_controler.h" | #include "pic_controler.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
| #include "syscall.h" | #include "syscall.h" | ||||||
|  | #include "userland.h" | ||||||
|  |  | ||||||
| void isr_default_int(void) | void isr_default_int(void) | ||||||
| { | { | ||||||
| @@ -17,7 +18,15 @@ void isr_page_fault(void) | |||||||
|  |  | ||||||
| void isr_clock_int(void) | void isr_clock_int(void) | ||||||
| { | { | ||||||
|     DEBUG_INFO("Enterring clock interrupt handler."); |     DEBUG_INFO("Clock interrupt handler."); | ||||||
|  |     for (int i = (userland_data->curent_process + 1) % 128; i != userland_data->curent_process; i = (i + 1) % 128) | ||||||
|  |     { | ||||||
|  |         if (userland_data->active_process[i / 32] & (1 << (i % 32))) | ||||||
|  |         { | ||||||
|  |             switch_to_process(i); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void isr_kbd_int(void) | void isr_kbd_int(void) | ||||||
|   | |||||||
| @@ -22,8 +22,12 @@ void main(void) | |||||||
|     char *data_end       = _binary_a_out_end; |     char *data_end       = _binary_a_out_end; | ||||||
|     size_t data_size  = (size_t)_binary_a_out_size; |     size_t data_size  = (size_t)_binary_a_out_size; | ||||||
|  |  | ||||||
|  | 	u16 tss = 0x28; | ||||||
|  |  | ||||||
| 	create_process(0, data_start); | 	create_process(0, data_start); | ||||||
| 	switch_to_process(0); | 	create_process(1, data_start); | ||||||
|  | 	userland_data->active_process[0] |= 1 << (1 % 32); | ||||||
|  | 	switch_to_ring_3(0); | ||||||
|  |  | ||||||
| 	for (;;) | 	for (;;) | ||||||
| 	{ | 	{ | ||||||
|   | |||||||
| @@ -2,32 +2,33 @@ | |||||||
|  |  | ||||||
| #include "tss.h" | #include "tss.h" | ||||||
| #include "debug.h" | #include "debug.h" | ||||||
|  | #include "userland.h" | ||||||
|  |  | ||||||
| void launch_process(u16 tss, int memory_start, int userland_stack, int userland_code, u16 userland_data) | void launch_process(u16 tss, int memory_start, int userland_stack, int userland_code, u16 userland_data_seg) | ||||||
| { | { | ||||||
|     // Setting DPL and GDT bits |     // Setting DPL and GDT bits | ||||||
|     userland_stack += 3; |     userland_stack += 3; | ||||||
|     userland_code += 3; |     userland_code += 3; | ||||||
|     userland_data += 3; |     userland_data_seg += 3; | ||||||
|  |  | ||||||
|     DEBUG_INFO("LAUCHING USER LAND PROCESS"); |     DEBUG_INFO("LAUCHING USER LAND PROCESS"); | ||||||
|  |  | ||||||
|     asm volatile ("             \n \ |     asm volatile ("         \n \ | ||||||
|         mov %0, %%ax            \n \ |         mov %0, %%ax	    \n \ | ||||||
|         ltr %%ax                \n \ |         ltr %%ax            \n \ | ||||||
|         movw %%ss, %1           \n \ |         movw %%ss, %1       \n \ | ||||||
|         movl %%esp, %2          \n \ |         movl %%esp, %2      \n \ | ||||||
|         movw $0x23, %%ax            \n \ |         movw $0x23, %%ax    \n \ | ||||||
|         movw %%ax, %%ds         \n \ |         movw %%ax, %%ds     \n \ | ||||||
|         movw %%ax, %%es         \n \ |         movw %%ax, %%es     \n \ | ||||||
|         movw %%ax, %%fs         \n \ |         movw %%ax, %%fs     \n \ | ||||||
|         movw %%ax, %%gs         \n \ |         movw %%ax, %%gs     \n \ | ||||||
|         mov %%esp, %%eax         \n \ |         mov %%esp, %%eax    \n \ | ||||||
|         push $0x23                 \n \ |         push $0x23          \n \ | ||||||
|         push $0x7FFFEFFF         \n \ |         push $0x7FFFEFFF    \n \ | ||||||
|         pushfl                  \n \ |         pushfl              \n \ | ||||||
|         push $0x1B                 \n \ |         push $0x1B          \n \ | ||||||
|         push $0x6000000         \n \ |         push $0x6000000     \n \ | ||||||
|         iret" : "+r" (tss), |         iret" : "+r" (tss), | ||||||
|                 "=m" (user_land_tss.ss0), |                 "=m" (user_land_tss.ss0), | ||||||
|                 "=m" (user_land_tss.esp0)); |                 "=m" (user_land_tss.esp0)); | ||||||
|   | |||||||
| @@ -101,6 +101,8 @@ void pic_init(void) | |||||||
|         IRQ_set_mask(i); |         IRQ_set_mask(i); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     DEBUG_INFO("Unmasking IRQ 0 - Clock"); | ||||||
|  |     IRQ_clear_mask(0); | ||||||
|     DEBUG_INFO("Unmasking IRQ 1 - Keyboard"); |     DEBUG_INFO("Unmasking IRQ 1 - Keyboard"); | ||||||
|     IRQ_clear_mask(1); |     IRQ_clear_mask(1); | ||||||
|      |      | ||||||
|   | |||||||
| @@ -30,6 +30,21 @@ int create_process(int uid, char *data_start) | |||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int switch_to_ring_3(int uid){ | ||||||
|  |     DEBUG_INFO("SWITCHING TO RING 3"); | ||||||
|  |     void *process_page_dir_adress = userland_data->userland_data[uid].page_directories; | ||||||
|  |  | ||||||
|  |     // load cr3 | ||||||
|  |     asm volatile ("                 \ | ||||||
|  |         mov %0, %%eax     \n \ | ||||||
|  |         mov %%eax, %%cr3" : "+r" (process_page_dir_adress)); | ||||||
|  |  | ||||||
|  |     userland_data->curent_process = uid; | ||||||
|  |     userland_data->active_process[uid / 32] |= 1 << (uid % 32); | ||||||
|  |  | ||||||
|  |     launch_process(0x28, 0x6000000, 0x20, 0x18, 0x20); | ||||||
|  | } | ||||||
|  |  | ||||||
| int switch_to_process(int uid) | int switch_to_process(int uid) | ||||||
| { | { | ||||||
|     DEBUG_INFO("SWITCHING TO PROCESS"); |     DEBUG_INFO("SWITCHING TO PROCESS"); | ||||||
| @@ -40,6 +55,8 @@ int switch_to_process(int uid) | |||||||
|         mov %0, %%eax     \n \ |         mov %0, %%eax     \n \ | ||||||
|         mov %%eax, %%cr3" : "+r" (process_page_dir_adress)); |         mov %%eax, %%cr3" : "+r" (process_page_dir_adress)); | ||||||
|  |  | ||||||
|     // TODO : once data by process has been implemented, load the right one |     userland_data->curent_process = uid; | ||||||
|     launch_process(0x28, 0x6000000, 0x20, 0x18, 0x20); |     userland_data->active_process[uid / 32] |= 1 << (uid % 32); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -10,17 +10,19 @@ struct userland_data | |||||||
| { | { | ||||||
|     struct page_directory_entry page_directories[1024]; |     struct page_directory_entry page_directories[1024]; | ||||||
|     struct page_table_entry page_table[1024]; |     struct page_table_entry page_table[1024]; | ||||||
| }; | } __attribute__((packed)); | ||||||
|  |  | ||||||
|  |  | ||||||
| struct userlands_data { | struct userlands_data { | ||||||
|     struct userland_data userland_data[128]; |     struct userland_data userland_data[128]; | ||||||
|     u32 page_dir[4]; |     int curent_process; | ||||||
| }; |     u32 active_process[4]; | ||||||
|  | } __attribute__((packed)); | ||||||
|  |  | ||||||
| extern struct userlands_data *userland_data; | extern struct userlands_data *userland_data; | ||||||
|  |  | ||||||
| int create_process(int uid, char *data_start); | int create_process(int uid, char *data_start); | ||||||
|  | int switch_to_ring_3(int uid); | ||||||
| int switch_to_process(int uid); | int switch_to_process(int uid); | ||||||
|  |  | ||||||
| #endif /*   !USERLAND_H */ | #endif /*   !USERLAND_H */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user