Source code for ssd.nand_driver

from pathlib import Path
from typing import Union

from ssd.common import convert_hex_to_str, LBA_SIZE, LBA_UPPER_LIMIT

[docs] NAND_INITIAL_VALUE = '0x00000000'
[docs] NAND_FILE_PATH = Path(__file__).parent / 'nand.txt'
[docs] class NandDriver: """ NandDriver 클래스는 nand.txt 파일을 기반으로 NAND 읽기, 쓰기 및 삭제 기능을 제공합니다. Attributes: nand_file_path (Path): NAND 파일 경로 """ def __init__(self, nand_file_path: Union[Path, str] = NAND_FILE_PATH): """ NandDriver 클래스의 생성자. NAND 파일 경로를 설정하고 초기화합니다. Args: nand_file_path (Union[Path, str], optional): NAND 파일 경로. 기본값은 NAND_FILE_PATH. """
[docs] self.nand_file_path: Path = Path(nand_file_path)
self.initialize()
[docs] def initialize(self) -> None: """ 만일 nand.txt 파일이 없으면, 초기화된 파일을 생성합니다. """ if not self.nand_file_path.exists(): with open(self.nand_file_path, 'w', encoding='utf-8') as f: f.write('\n'.join([NAND_INITIAL_VALUE] * LBA_SIZE))
[docs] def read(self, lba: int) -> int: """ 주어진 LBA에서 값을 읽어 반환합니다. Args: lba (int): 논리 블록 주소 Returns: int: 읽은 값 (정수 형식) """ with open(self.nand_file_path, 'r', encoding='utf-8') as f: lines = f.readlines() return int(lines[lba].strip(), 16)
[docs] def write(self, lba: int, value: int) -> None: """ 주어진 LBA에 값을 씁니다. Args: lba (int): 논리 블록 주소 value (int): 쓸 값 (정수 형식) """ with open(self.nand_file_path, 'r', encoding='utf-8') as f: lines = f.readlines() lines[lba] = convert_hex_to_str(value) + '\n' with open(self.nand_file_path, 'w', encoding='utf-8') as f: f.writelines(lines)
[docs] def erase(self, lba: int, n_value: int) -> None: """ 주어진 LBA부터 n_value 개의 블록을 삭제합니다. Args: lba (int): 논리 블록 주소 n_value (int): 삭제할 블록 수 """ LAST_LBA = min(lba + n_value - 1, LBA_UPPER_LIMIT) with open(self.nand_file_path, 'r', encoding='utf-8') as f: lines = f.readlines() for idx_lba in range(lba, LAST_LBA +1): lines[idx_lba] = NAND_INITIAL_VALUE + '\n' with open(self.nand_file_path, 'w', encoding='utf-8') as f: f.writelines(lines)