Finished tool?
This commit is contained in:
parent
e0d138ea86
commit
bb4692b00b
5
makefile
5
makefile
|
|
@ -8,10 +8,9 @@ OBJS := $(patsubst src/kernel/%.c, bin/kernel/%.o, $(SRCS))
|
||||||
all: bootloader tools kernel
|
all: bootloader tools kernel
|
||||||
cp bin/bootloader.bin image.bin
|
cp bin/bootloader.bin image.bin
|
||||||
qemu-img resize -f raw image.bin 512M
|
qemu-img resize -f raw image.bin 512M
|
||||||
./diskwrite -v kernel.elf idm.elf -o image.bin
|
./diskwrite -v -l kernel.elf idm.elf -o image.bin
|
||||||
# ./diskwrite -v idm.elf -o image.bin
|
# ./diskwrite -v idm.elf -o image.bin
|
||||||
# ./diskwrite -v test.txt -o image.bin
|
qemu-system-i386 -hda image.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio -D intlog.txt -d int
|
||||||
# qemu-system-i386 -hda image.bin --no-reboot --no-shutdown -m 32m -smp 2 -serial mon:stdio -D intlog.txt -d int
|
|
||||||
tools:
|
tools:
|
||||||
$(CC) tools/diskwrite.c -o diskwrite
|
$(CC) tools/diskwrite.c -o diskwrite
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -337,7 +337,7 @@ part_2:
|
||||||
|
|
||||||
jc load_fail
|
jc load_fail
|
||||||
.find_fs_driver_no_disk:
|
.find_fs_driver_no_disk:
|
||||||
mov ax, 0xe41
|
mov ax, 0xe44
|
||||||
int 0x10
|
int 0x10
|
||||||
.find_fs_driver:
|
.find_fs_driver:
|
||||||
mov edi, fs_module_file
|
mov edi, fs_module_file
|
||||||
|
|
@ -355,7 +355,7 @@ part_2:
|
||||||
|
|
||||||
jc load_fail
|
jc load_fail
|
||||||
.start32_no_fs:
|
.start32_no_fs:
|
||||||
mov ax, 0xe42
|
mov ax, 0xe46
|
||||||
int 0x10
|
int 0x10
|
||||||
.start32:
|
.start32:
|
||||||
; debug
|
; debug
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ extern void kmain(kernel_info_t *kernel_info){
|
||||||
//TODO: Map and load filesystem and disk modules
|
//TODO: Map and load filesystem and disk modules
|
||||||
//TODO: Start Initial Process
|
//TODO: Start Initial Process
|
||||||
|
|
||||||
|
printf("%x", kernel_info->loaded_modules->type);
|
||||||
|
|
||||||
init_scheduler();
|
init_scheduler();
|
||||||
thread_start(pid0);
|
thread_start(pid0);
|
||||||
enable_interrupts();
|
enable_interrupts();
|
||||||
|
|
|
||||||
|
|
@ -57,13 +57,6 @@ typedef struct{
|
||||||
uint32_t trail_sig;
|
uint32_t trail_sig;
|
||||||
}fsinfo_t;
|
}fsinfo_t;
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
fat_bpb_t bpb;
|
|
||||||
fsinfo_t fsinfo;
|
|
||||||
uint32_t *file_table;
|
|
||||||
uint32_t file_table_size_sectors;
|
|
||||||
}fat_info;
|
|
||||||
|
|
||||||
typedef struct{
|
typedef struct{
|
||||||
char filename[8];
|
char filename[8];
|
||||||
char ext[3];
|
char ext[3];
|
||||||
|
|
@ -80,6 +73,14 @@ typedef struct{
|
||||||
uint32_t size_bytes;
|
uint32_t size_bytes;
|
||||||
}__attribute__((packed)) file_t;
|
}__attribute__((packed)) file_t;
|
||||||
|
|
||||||
|
typedef struct{
|
||||||
|
fat_bpb_t bpb;
|
||||||
|
fsinfo_t fsinfo;
|
||||||
|
uint32_t *file_table;
|
||||||
|
uint32_t file_table_size_sectors;
|
||||||
|
file_t *root_dir;
|
||||||
|
}fat_info;
|
||||||
|
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
|
||||||
int read_sector(FILE *file, uint32_t sector_start, uint32_t count, buffer_t buf){
|
int read_sector(FILE *file, uint32_t sector_start, uint32_t count, buffer_t buf){
|
||||||
|
|
@ -128,28 +129,12 @@ void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){
|
||||||
info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value;
|
info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//read size bytes into buffer. If file is null, will read from root directory.
|
//read cluster - returns next cluster in chain
|
||||||
int read_file(fat_info *info, file_t *file, buffer_t buffer, size_t size, FILE *disk){
|
uint32_t read_cluster(fat_info *info, uint32_t cluster, buffer_t buffer, size_t size, FILE *disk){
|
||||||
if(!file){
|
// uint8_t *new_buffer = calloc(4096, 1 * (info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster));
|
||||||
file_t root_file = {0};
|
read_sector(disk, info->bpb.reserved_sectors + info->file_table_size_sectors + info->bpb.partition_start + (cluster * info->bpb.sectors_per_cluster), info->bpb.sectors_per_cluster, buffer);
|
||||||
root_file.start_cluster_high = info->bpb.root_dir_cluster>>16;
|
// memcpy(buffer, new_buffer, size);
|
||||||
root_file.start_cluster_low = info->bpb.root_dir_cluster&0xffff;
|
return info->file_table[cluster];
|
||||||
file = &root_file;
|
|
||||||
}
|
|
||||||
uint32_t first_cluster = file->start_cluster_low | (file->start_cluster_high << 16);
|
|
||||||
uint32_t clusters = (size / (info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster )) + 1;
|
|
||||||
uint8_t *new_buffer = calloc(1, clusters * (info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster));
|
|
||||||
uint32_t cluster = first_cluster;
|
|
||||||
for(uint32_t i = 0; i < clusters; i++){
|
|
||||||
if(cluster = -1){
|
|
||||||
return i * info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster;
|
|
||||||
}
|
|
||||||
printf("Reading cluster: %d\n", cluster);
|
|
||||||
read_sector(disk, info->bpb.reserved_sectors + info->file_table_size_sectors + info->bpb.partition_start + (cluster * info->bpb.sectors_per_cluster), info->bpb.sectors_per_cluster, new_buffer + (i *info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster));
|
|
||||||
cluster = info->file_table[cluster];
|
|
||||||
verbose && printf("Next cluster: %d\n", cluster);
|
|
||||||
}
|
|
||||||
memcpy(buffer, new_buffer, size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//write size bytes to file from buffer. no value may be zero or null. If file is null, will write to root directory
|
//write size bytes to file from buffer. no value may be zero or null. If file is null, will write to root directory
|
||||||
|
|
@ -185,7 +170,8 @@ int write_file(fat_info *info, file_t *file, buffer_t buffer, size_t size, FILE
|
||||||
|
|
||||||
int create_file(char *path, fat_info *info, FILE *file, FILE *disk){
|
int create_file(char *path, fat_info *info, FILE *file, FILE *disk){
|
||||||
file_t *root_files = calloc(4096, sizeof(file_t));
|
file_t *root_files = calloc(4096, sizeof(file_t));
|
||||||
read_file(info, 0, (buffer_t)root_files, (uint32_t)4096, disk);
|
// read_file(info, 0, (buffer_t)root_files, (uint32_t)4096, disk);
|
||||||
|
read_cluster(info, info->bpb.root_dir_cluster, (buffer_t)root_files, 4096, disk);
|
||||||
uint32_t index = 0;
|
uint32_t index = 0;
|
||||||
while(root_files[index].filename[0]){
|
while(root_files[index].filename[0]){
|
||||||
index++;
|
index++;
|
||||||
|
|
@ -250,6 +236,7 @@ int detect_repair_fs(FILE *file, fat_info *info){
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv){
|
||||||
|
char list_root_dir = 0;
|
||||||
char **files = malloc(512);
|
char **files = malloc(512);
|
||||||
int filec = 0;
|
int filec = 0;
|
||||||
FILE *output_file = 0;
|
FILE *output_file = 0;
|
||||||
|
|
@ -264,6 +251,10 @@ int main(int argc, char **argv){
|
||||||
printf("-v: Verbose\n");
|
printf("-v: Verbose\n");
|
||||||
}
|
}
|
||||||
for(int i = 1; i < argc; i++){
|
for(int i = 1; i < argc; i++){
|
||||||
|
if(!strcmp(argv[i], "-l")){
|
||||||
|
list_root_dir = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if(!strcmp(argv[i], "-o")){
|
if(!strcmp(argv[i], "-o")){
|
||||||
i++;
|
i++;
|
||||||
if(i >= argc){
|
if(i >= argc){
|
||||||
|
|
@ -296,6 +287,17 @@ int main(int argc, char **argv){
|
||||||
create_file(files[i], &info, f, output_file);
|
create_file(files[i], &info, f, output_file);
|
||||||
fclose(f);
|
fclose(f);
|
||||||
}
|
}
|
||||||
|
if(list_root_dir){
|
||||||
|
buffer_t buf = calloc(4096, 1);
|
||||||
|
read_cluster(&info, 2, buf, 4096, output_file);
|
||||||
|
file_t *root = (void *)buf;
|
||||||
|
uint32_t index = 0;
|
||||||
|
while(root[index].filename[0]){
|
||||||
|
printf("%s", root[index].filename);
|
||||||
|
printf(".%s\n", root[index].ext);
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
fat_write_back(output_file, &info);
|
fat_write_back(output_file, &info);
|
||||||
verbose && printf("Finished. Exiting...\n");
|
verbose && printf("Finished. Exiting...\n");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue