🆕 转换为grub2引导(尚未更正mm模块,且目前无法将内核链接到线性地址0xffffx处)

This commit is contained in:
fslongjin
2022-02-21 22:59:57 +08:00
parent 0b0cce9326
commit d9d83335af
16 changed files with 672 additions and 698 deletions

View File

@ -2,64 +2,48 @@
/**
* @file boot_info.h
* @brief 启动信息接口
* @author Zone.N (Zone.Niuzh@hotmail.com)
* @version 1.0
* @date 2021-09-18
* @copyright MIT LICENSE
* https://github.com/Simple-XX/SimpleKernel
* @par change log:
* <table>
* <tr><th>Date<th>Author<th>Description
* <tr><td>2021-09-18<td>digmouse233<td>迁移到 doxygen
* </table>
*/
#ifndef _BOOT_INFO_H_
#define _BOOT_INFO_H_
#include "stdint.h"
//#include "resource.h"
#pragma once
#include "glib.h"
/**
* @brief 启动信息接口
* 由引导传递的机器信息处理
* 如 grub2 传递的 multiboot2 结构
* opensbi 传递的 dtb 结构
* 注意这部分是通过内存传递的,在重新保存之前不能被覆盖
* 架构专有的数据在 dtb.h 或 multiboot2.h
* 实现在 dtb.cpp 或 multiboot2.cpp
*/
namespace BOOT_INFO {
/// 声明,定义在具体的实现中
/// 地址
extern "C" uintptr_t boot_info_addr;
extern uintptr_t boot_info_addr;
/// 长度
extern size_t boot_info_size;
extern unsigned int boot_info_size;
/**
* @brief 初始化,定义在具体实现中
* @return true 成功
* @return false 成功
*/
extern bool init(void);
extern int init(void);
/**
* @brief 获取物理内存信息
* @return resource_t 物理内存资源信息
*/
extern resource_t get_memory(void);
//extern resource_t get_memory(void);
/**
* @brief 获取 clint 信息
* @return resource_t clint 资源信息
*/
extern resource_t get_clint(void);
//extern resource_t get_clint(void);
/**
* @brief 获取 plic 信息
* @return resource_t plic 资源信息
*/
extern resource_t get_plic(void);
};
//extern resource_t get_plic(void);
#endif /* _BOOT_INFO_H_ */

View File

@ -23,6 +23,7 @@
: "memory") // 在sfence指令前的写操作必须在sfence指令后的写操作前完成
#define io_lfence() __asm__ __volatile__("lfence\n\t" :: \
: "memory") // 在lfence指令前的读操作必须在lfence指令后的读操作前完成。
/**
* @brief 根据结构体变量内某个成员变量member的基地址计算出该结构体变量的基地址
* @param ptr 指向结构体变量内的成员变量member的指针
@ -50,6 +51,18 @@ ul round(double x)
return (ul)(x + 0.5);
}
/**
* @brief 地址按照align进行对齐
*
* @param addr
* @param _align
* @return ul 对齐后的地址
*/
ul ALIGN(const ul addr, const ul _align)
{
return (ul)((addr+_align-1)&(~(_align-1)));
}
//链表数据结构
struct List
{

View File

@ -2,6 +2,8 @@
// Created by longjin on 2022/1/22.
//
#include "printk.h"
#include "../driver/multiboot2/multiboot2.h"
#include "../mm/mm.h"
//#include "linkage.h"
struct screen_info pos;
@ -34,22 +36,25 @@ int calculate_max_charNum(int len, int size)
return len / size;
}
int init_printk(const int width, const int height, unsigned int *FB_address, const int FB_length, const int char_size_x, const int char_size_y)
int init_printk(const int char_size_x, const int char_size_y)
{
pos.width = width;
pos.height = height;
struct multiboot_tag_framebuffer_info_t info;
int reserved;
multiboot2_iter(multiboot2_get_Framebuffer_info, &info, &reserved);
pos.width = info.framebuffer_width;
pos.height = info.framebuffer_height;
pos.char_size_x = char_size_x;
pos.char_size_y = char_size_y;
pos.max_x = calculate_max_charNum(width, char_size_x);
pos.max_y = calculate_max_charNum(height, char_size_y);
pos.FB_address = FB_address;
pos.FB_length = FB_length;
pos.max_x = calculate_max_charNum(pos.width, char_size_x);
pos.max_y = calculate_max_charNum(pos.height, char_size_y);
// @todo:将来需要将帧缓冲区物理地址填写到这个地址的页表项中
pos.FB_address = 0xa00000;
pos.FB_length = info.framebuffer_pitch - info.framebuffer_addr;
pos.x = 0;
pos.y = 0;
return 0;
}
@ -81,7 +86,7 @@ void auto_newline()
{
/**
* @brief 超过每行最大字符数,自动换行
*
*
*/
if (pos.x > pos.max_x)
{
@ -314,7 +319,7 @@ static int vsprintf(char *buf, const char *fmt, va_list args)
case 'x':
flags |= SMALL;
case 'X':
//flags |= SPECIAL;
// flags |= SPECIAL;
if (qualifier == 'l')
str = write_num(str, va_arg(args, ull), 16, field_width, precision, flags);
else
@ -352,13 +357,13 @@ static int vsprintf(char *buf, const char *fmt, va_list args)
break;
case 'f':
// 默认精度为3
//printk("1111\n");
//va_arg(args, double);
//printk("222\n");
// printk("1111\n");
// va_arg(args, double);
// printk("222\n");
if (precision < 0)
precision = 3;
str = write_float_point_num(str, va_arg(args, double), field_width, precision, flags);
break;
@ -383,11 +388,11 @@ static char *write_num(char *str, ull num, int base, int field_width, int precis
{
/**
* @brief 将数字按照指定的要求转换成对应的字符串
*
*
* @param str 要返回的字符串
* @param num 要打印的数值
* @param base 基数
* @param field_width 区域宽度
* @param field_width 区域宽度
* @param precision 精度
* @param flags 标志位
*/
@ -486,10 +491,10 @@ static char *write_float_point_num(char *str, double num, int field_width, int p
{
/**
* @brief 将浮点数按照指定的要求转换成对应的字符串
*
*
* @param str 要返回的字符串
* @param num 要打印的数值
* @param field_width 区域宽度
* @param field_width 区域宽度
* @param precision 精度
* @param flags 标志位
*/
@ -578,7 +583,7 @@ static void putchar(unsigned int *fb, int Xsize, int x, int y, unsigned int FRco
{
/**
* @brief 在屏幕上指定位置打印字符
*
*
* @param fb 帧缓存线性地址
* @param Xsize 行分辨率
* @param x 左上角列像素点位置
@ -617,7 +622,7 @@ int printk_color(unsigned int FRcolor, unsigned int BKcolor, const char *fmt, ..
{
/**
* @brief 格式化打印字符串
*
*
* @param FRcolor 前景色
* @param BKcolor 背景色
* @param ... 格式化字符串

View File

@ -57,14 +57,10 @@ char buf[4096]; //vsprintf()的缓冲区
/**
* @brief 初始化printk的屏幕信息
*
* @param width 屏幕宽度
* @param height 屏幕高度
* @param FB_address 帧缓冲区地址
* @param FB_length 帧缓冲区长度
* @param char_size_x 字符的列坐标
* @param char_size_y 字符的行坐标
*/
int init_printk(const int width, const int height, unsigned int *FB_address, const int FB_length, const int char_size_x, const int char_size_y);
int init_printk(const int char_size_x, const int char_size_y);
/**
* @brief Set the printk pos object
*