]> Zhao Yanbai Git Server - kernel.git/commitdiff
ata_read_ext2_sb use block_read
authoracevest <zhaoyanbai@126.com>
Thu, 22 Jun 2023 00:18:32 +0000 (08:18 +0800)
committeracevest <zhaoyanbai@126.com>
Thu, 22 Jun 2023 00:18:32 +0000 (08:18 +0800)
drivers/ata.c
drivers/block.c
include/disk.h
include/fs.h

index 2384f4ac8e9ea41dc2137ce415e2cfbe43e418b7..0df04fa82082ed6941c47fcdf0919982cb218f7c 100644 (file)
@@ -8,7 +8,6 @@
  */
 #include <ata.h>
 #include <disk.h>
-#include <ext2.h>
 #include <ide.h>
 #include <io.h>
 #include <irq.h>
@@ -90,31 +89,6 @@ void ata_read_partions(ide_part_t *part, const char *buf) {
     }
 }
 
-// 读hda0 的 super block
-void ata_read_ext2_sb() {
-    ide_part_t *part = ide_drives[0].partions + 1;
-    const int size = 1024;
-    const int offset = 1024;
-    char *buf = kmalloc(size, 0);
-    disk_request_t r;
-    r.dev = MAKE_DEV(DEV_MAJOR_IDE0, 1);
-    r.command = DISK_REQ_READ;
-    r.pos = part->lba_start + offset / SECT_SIZE;
-    r.count = size / SECT_SIZE;
-    r.buf = buf;
-    send_disk_request(&r);
-    ext2_sb_t *p = (ext2_sb_t *)buf;
-    printk("inodes count %u inodes per group %u free %u\n", p->s_inodes_count, p->s_inodes_per_group,
-           p->s_free_inodes_count);
-    printk("blocks count %u blocks per group %u free %u magic %04x\n", p->s_blocks_count, p->s_blocks_per_group,
-           p->s_free_blocks_count, p->s_magic);
-    printk("first ino %u inode size %u first data block %u\n", p->s_first_ino, p->s_inode_size, p->s_first_data_block);
-    printk("log block size %u write time %u\n", p->s_log_block_size, p->s_wtime);
-    p->s_volume_name[63] = 0;
-    printk("volume %s\n", p->s_volume_name);
-    kfree(buf);
-}
-
 // 《AT Attachment 8 - ATA/ATAPI Command Set》
 void ide_ata_init() {
     for (int i = 0; i < MAX_IDE_DRIVE_CNT; i++) {
@@ -265,15 +239,15 @@ void ide_read_partions() {
     }
 }
 
-void ide_disk_read(dev_t dev, uint32_t block, uint32_t size, char *buf) {
+void ide_disk_read(dev_t dev, uint32_t sect_nr, uint32_t count, char *buf) {
     ide_drive_t *drv = ide_get_drive(dev);
     uint64_t lba_offset = drv->partions[DEV_MINOR((dev))].lba_start;
 
     disk_request_t r;
     r.dev = dev;
     r.command = DISK_REQ_READ;
-    r.pos = lba_offset + block / SECT_SIZE;
-    r.count = size / SECT_SIZE;
+    r.pos = lba_offset + sect_nr;
+    r.count = count;
     r.buf = buf;
     send_disk_request(&r);
 }
index 6cf9a0053c8f53e837df3a1ca9521560f24f147a..ed538dd9fcfcf9780cf8fcda1c6f25cc2d7b36df 100644 (file)
 #include <fs.h>
 #include <ide.h>
 
-blk_buffer_t *block_read(dev_t dev, uint32_t block, uint32_t size) {
+#define BLOCK_BUFFER_HASH_TABLE_SIZE 37
+atomic_t hash_cnt;
+blk_buffer_t *block_buffer_hash_table[BLOCK_BUFFER_HASH_TABLE_SIZE] = {
+    0,
+};
+
+int hash(dev_t dev, uint32_t block) { return ((co ~dev) ^ block) % BLOCK_BUFFER_HASH_TABLE_SIZE; }
+
+blk_buffer_t *get_hash_block_buffer(dev_t dev, uint32_t block, uint16_t size) {}
+
+blk_buffer_t *block_read(dev_t dev, uint32_t block) {
     blk_buffer_t *bb = 0;
 
     assert(DEV_MAJOR(dev) == DEV_MAJOR_IDE0);
@@ -20,7 +30,37 @@ blk_buffer_t *block_read(dev_t dev, uint32_t block, uint32_t size) {
     // 目前不提供hash表组强起来的缓冲功能
     // 直接读
 
-    ide_disk_read(dev, block, size, bb->data);
+    // TODO:根据dev得到正确的blocksize
+    const int blocksize = 1024;
+
+    bb->data = kmalloc(blocksize, 0);  // debug
+
+    ide_disk_read(dev, block * blocksize / 512, 1, bb->data);
 
     return bb;
 }
+
+#include <ext2.h>
+// 读hda1 的 super block
+void ata_read_ext2_sb() {
+    // 初始默认blocksize = 1024
+    // 则ext2_superblock应该在第1个block的offset为0的位置
+    // ext2_superblock默认大小1024
+
+    const int offset = 0;
+    const int size = offset + 1024;
+    const int block = 1;
+
+    blk_buffer_t *bb = block_read(MAKE_DEV(DEV_MAJOR_IDE0, 1), block);
+
+    ext2_sb_t *p = (ext2_sb_t *)(bb->data + offset);
+    printk("inodes count %u inodes per group %u free %u\n", p->s_inodes_count, p->s_inodes_per_group,
+           p->s_free_inodes_count);
+    printk("blocks count %u blocks per group %u free %u magic %04x\n", p->s_blocks_count, p->s_blocks_per_group,
+           p->s_free_blocks_count, p->s_magic);
+    printk("first ino %u inode size %u first data block %u\n", p->s_first_ino, p->s_inode_size, p->s_first_data_block);
+    printk("log block size %u write time %u\n", p->s_log_block_size, p->s_wtime);
+    p->s_volume_name[63] = 0;
+    printk("volume %s\n", p->s_volume_name);
+    kfree(bb->data);
+}
index 76d382cb61b39d74a0e570ad39c975bb5f74ac5c..5c3894954545a9f188f1d10fceb7d071c1db7062 100644 (file)
@@ -47,4 +47,4 @@ typedef struct {
 
 void send_disk_request(disk_request_t *r);
 
-void ide_disk_read(dev_t dev, uint32_t block, uint32_t size, char *buf);
+void ide_disk_read(dev_t dev, uint32_t sect_nr, uint32_t count, char *buf);
index b9057b58c2eecb48fec080aecce259a659f37b6e..6cfc1813d2cc7dfc8a9da7b6075f0f111d0d0e64 100644 (file)
@@ -109,12 +109,14 @@ static inline pInode find_empty_inode()
 
 typedef uint32_t dev_t;
 
-typedef struct blk_bufer {
-    uint32_t blocknr;  // block number
-    char *data;        //
-    uint16_t size;     // block size
+typedef struct blk_buffer {
+    uint32_t block;       // block number
+    char *data;           //
+    uint16_t block_size;  // block size
     dev_t dev;
     page_t *page;
+    struct blk_buffer *next;
+    struct blk_buffer *hash_next;
 } blk_buffer_t;
 
 #endif  //_FS_H