recalled the uchar modification

This commit is contained in:
FactorialN 2023-11-11 14:54:22 -08:00
parent 359521e12e
commit 23c5b4da6f
5 changed files with 44 additions and 46 deletions

View File

@ -15,23 +15,23 @@ one inode equipped with one 512 bytes block
class SuperBlock{ class SuperBlock{
public: public:
SuperBlock(const uchar *directory){ SuperBlock(const char *directory){
} }
~SuperBlock(){ ~SuperBlock(){
} }
static u_int64_t getFreeListHead(RawDisk &disk){ static u_int64_t getFreeListHead(RawDisk &disk){
uchar buffer[8] = {0}; char buffer[8] = {0};
disk.rawdisk_read(0, buffer, sizeof(buffer)); disk.rawdisk_read(0, buffer, sizeof(buffer));
u_int64_t t = 0; u_int64_t t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t = t | (((u_int64_t)buffer[j])<<(8*j)); t = t | (((u_int64_t)(unsigned char)buffer[j])<<(8*j));
return t; return t;
} }
static void writeFreeListHead(RawDisk &disk, u_int64_t t){ static void writeFreeListHead(RawDisk &disk, u_int64_t t){
uchar buffer[8] = {0}; char buffer[8] = {0};
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
buffer[j] = (t >> (8 * j)) & 0xFF; buffer[j] = (t >> (8 * j)) & 0xFF;
} }
@ -39,16 +39,16 @@ public:
} }
static u_int64_t getFreeINodeHead(RawDisk &disk){ static u_int64_t getFreeINodeHead(RawDisk &disk){
uchar buffer[8] = {0}; char buffer[8] = {0};
disk.rawdisk_read(8, buffer, sizeof(buffer)); disk.rawdisk_read(8, buffer, sizeof(buffer));
u_int64_t t = 0; u_int64_t t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t = t | (((u_int64_t)buffer[j])<<(8*j)); t = t | (((u_int64_t)(unsigned char)buffer[j])<<(8*j));
return t; return t;
} }
static void writeFreeINodeHead(RawDisk &disk, u_int64_t t){ static void writeFreeINodeHead(RawDisk &disk, u_int64_t t){
uchar buffer[8] = {0}; char buffer[8] = {0};
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
buffer[j] = (t >> (8 * j)) & 0xFF; buffer[j] = (t >> (8 * j)) & 0xFF;
} }
@ -70,22 +70,22 @@ class INode{
u_int64_t block_number; u_int64_t block_number;
public: public:
void read_get_byte(u_int64_t &t, int &current_pos, uchar *buffer){ void read_get_byte(u_int64_t &t, int &current_pos, char *buffer){
t = 0; t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t = t | (((u_int64_t)buffer[j+current_pos])<<(8*j)); t = t | (((u_int64_t)(unsigned char)buffer[j+current_pos])<<(8*j));
current_pos += 8; current_pos += 8;
} }
static u_int64_t read_byte_at(int current_pos, uchar *buffer){ static u_int64_t read_byte_at(int current_pos, char *buffer){
u_int64_t t = 0; u_int64_t t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t = t | (((u_int64_t)buffer[j+current_pos])<<(8*j)); t = t | (((u_int64_t)(unsigned char)buffer[j+current_pos])<<(8*j));
return t; return t;
} }
void inode_construct(u_int64_t blockNumber, RawDisk &disk){ void inode_construct(u_int64_t blockNumber, RawDisk &disk){
uchar buffer[SECTOR_SIZE] = {0}; char buffer[SECTOR_SIZE] = {0};
disk.rawdisk_read(blockNumber*SECTOR_SIZE, buffer, sizeof(buffer)); disk.rawdisk_read(blockNumber*SECTOR_SIZE, buffer, sizeof(buffer));
block_number = blockNumber; block_number = blockNumber;
int current_pos = 0; int current_pos = 0;
@ -102,7 +102,7 @@ public:
read_get_byte(size, current_pos, buffer); read_get_byte(size, current_pos, buffer);
} }
void write_get_byte(u_int64_t t, int &current_pos, uchar *buffer){ void write_get_byte(u_int64_t t, int &current_pos, char *buffer){
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
buffer[j+current_pos] = t & (((u_int64_t)1<<(8))-1); buffer[j+current_pos] = t & (((u_int64_t)1<<(8))-1);
t >>= 8; t >>= 8;
@ -110,7 +110,7 @@ public:
current_pos += 8; current_pos += 8;
} }
static void write_byte_at(u_int64_t t, int current_pos, uchar *buffer){ static void write_byte_at(u_int64_t t, int current_pos, char *buffer){
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
buffer[j+current_pos] = t & (((u_int64_t)1<<(8))-1); buffer[j+current_pos] = t & (((u_int64_t)1<<(8))-1);
t >>= 8; t >>= 8;
@ -118,7 +118,7 @@ public:
} }
void inode_save(RawDisk &disk){ void inode_save(RawDisk &disk){
uchar buffer[SECTOR_SIZE] = {0}; char buffer[SECTOR_SIZE] = {0};
int current_pos = 0; int current_pos = 0;
for (int i = 0; i < 48; i++){ for (int i = 0; i < 48; i++){
write_get_byte(blocks[i], current_pos, buffer); write_get_byte(blocks[i], current_pos, buffer);
@ -141,7 +141,7 @@ public:
2. data block starting position 2. data block starting position
3. r/w between storage and rawdisk to maintain 3. r/w between storage and rawdisk to maintain
*/ */
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
u_int64_t freeBlockNum = 0; u_int64_t freeBlockNum = 0;
disk.rawdisk_read(freeListHead, buffer, sizeof(buffer)); disk.rawdisk_read(freeListHead, buffer, sizeof(buffer));
for (int i = 8; i < 264; i++){ for (int i = 8; i < 264; i++){
@ -176,7 +176,7 @@ public:
single_i = datablock_allocate_in_list(disk); single_i = datablock_allocate_in_list(disk);
} }
bool inSingle = false; bool inSingle = false;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
disk.rawdisk_read(single_i, buffer, sizeof(buffer)); disk.rawdisk_read(single_i, buffer, sizeof(buffer));
for (int i = 0; i < IO_BLOCK_SIZE; i+=8){ for (int i = 0; i < IO_BLOCK_SIZE; i+=8){
u_int64_t addr = read_byte_at(i, buffer); u_int64_t addr = read_byte_at(i, buffer);
@ -195,7 +195,7 @@ public:
double_i = datablock_allocate_in_list(disk); double_i = datablock_allocate_in_list(disk);
} }
bool inDouble = false; bool inDouble = false;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
disk.rawdisk_read(double_i, buffer, sizeof(buffer)); disk.rawdisk_read(double_i, buffer, sizeof(buffer));
for (int i = 0; i < IO_BLOCK_SIZE; i+=8){ for (int i = 0; i < IO_BLOCK_SIZE; i+=8){
u_int64_t addr = read_byte_at(i, buffer); u_int64_t addr = read_byte_at(i, buffer);
@ -215,7 +215,7 @@ public:
triple_i = datablock_allocate_in_list(disk); triple_i = datablock_allocate_in_list(disk);
} }
bool inTriple = false; bool inTriple = false;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
disk.rawdisk_read(triple_i, buffer, sizeof(buffer)); disk.rawdisk_read(triple_i, buffer, sizeof(buffer));
for (int i = 0; i < IO_BLOCK_SIZE; i+=8){ for (int i = 0; i < IO_BLOCK_SIZE; i+=8){
u_int64_t addr = read_byte_at(i, buffer); u_int64_t addr = read_byte_at(i, buffer);
@ -265,7 +265,7 @@ public:
u_int64_t freeBlockHead = ((freeBlockNum/SECTOR_SIZE-MAX_INODE)/(8*2048)*(8*2048)+MAX_INODE)*SECTOR_SIZE; u_int64_t freeBlockHead = ((freeBlockNum/SECTOR_SIZE-MAX_INODE)/(8*2048)*(8*2048)+MAX_INODE)*SECTOR_SIZE;
// mark it alive in its bitmap // mark it alive in its bitmap
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
bool notEmpty = false; bool notEmpty = false;
disk.rawdisk_read(freeBlockHead, buffer, sizeof(buffer)); disk.rawdisk_read(freeBlockHead, buffer, sizeof(buffer));
for (int i = 8; i < 264; i++){ for (int i = 8; i < 264; i++){
@ -290,7 +290,7 @@ public:
return 0; return 0;
} }
u_int64_t freeBlockNum = 0; u_int64_t freeBlockNum = 0;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
int delpoint = -1; int delpoint = -1;
disk.rawdisk_read(single_i, buffer, sizeof(buffer)); disk.rawdisk_read(single_i, buffer, sizeof(buffer));
for (int i=4088; i >= 0; i--){ for (int i=4088; i >= 0; i--){
@ -317,7 +317,7 @@ public:
return false; return false;
} }
u_int64_t freeBlockNum = 0; u_int64_t freeBlockNum = 0;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
int delpoint = -1; int delpoint = -1;
disk.rawdisk_read(double_i, buffer, sizeof(buffer)); disk.rawdisk_read(double_i, buffer, sizeof(buffer));
for (int i=4088; i >= 0; i-=8){ for (int i=4088; i >= 0; i-=8){
@ -344,7 +344,7 @@ public:
return false; return false;
} }
u_int64_t freeBlockNum = 0; u_int64_t freeBlockNum = 0;
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
int delpoint = -1; int delpoint = -1;
disk.rawdisk_read(triple_i, buffer, sizeof(buffer)); disk.rawdisk_read(triple_i, buffer, sizeof(buffer));
for (int i=4088; i >= 0; i-=8){ for (int i=4088; i >= 0; i-=8){
@ -402,7 +402,7 @@ public:
// initialize Inode list head // initialize Inode list head
SuperBlock::writeFreeINodeHead(disk, 1); SuperBlock::writeFreeINodeHead(disk, 1);
for (u_int64_t i = 1; i < MAX_INODE; i++){ for (u_int64_t i = 1; i < MAX_INODE; i++){
uchar buffer[SECTOR_SIZE] = {0}; char buffer[SECTOR_SIZE] = {0};
u_int64_t t = i + 1; u_int64_t t = i + 1;
if (t < MAX_INODE){ if (t < MAX_INODE){
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
@ -414,7 +414,7 @@ public:
SuperBlock::writeFreeListHead(disk, MAX_INODE*SECTOR_SIZE); // maximum inode number 2^19 0x80000 SuperBlock::writeFreeListHead(disk, MAX_INODE*SECTOR_SIZE); // maximum inode number 2^19 0x80000
//Have tested this initialize function but MAX_BLOCK too much, MAX_INODE*2 works //Have tested this initialize function but MAX_BLOCK too much, MAX_INODE*2 works
for (u_int64_t i = MAX_INODE; i < MAX_BLOCKNUM-4096; i += 2048*8){ for (u_int64_t i = MAX_INODE; i < MAX_BLOCKNUM-4096; i += 2048*8){
uchar buffer[IO_BLOCK_SIZE] = {0}; char buffer[IO_BLOCK_SIZE] = {0};
u_int64_t t = (i + 2048*8)*SECTOR_SIZE; u_int64_t t = (i + 2048*8)*SECTOR_SIZE;
//t is address, storing in to buffer //t is address, storing in to buffer
for (int j = 0; j < 8; j++){ for (int j = 0; j < 8; j++){
@ -428,7 +428,7 @@ public:
// the i-th inode is in the i-th block // the i-th inode is in the i-th block
u_int64_t inode_allocate(RawDisk &disk){ u_int64_t inode_allocate(RawDisk &disk){
u_int64_t freeINodeHead = SuperBlock::getFreeINodeHead(disk); u_int64_t freeINodeHead = SuperBlock::getFreeINodeHead(disk);
uchar buffer[SECTOR_SIZE] = {0}; char buffer[SECTOR_SIZE] = {0};
disk.rawdisk_read(freeINodeHead*SECTOR_SIZE, buffer, sizeof(buffer)); disk.rawdisk_read(freeINodeHead*SECTOR_SIZE, buffer, sizeof(buffer));
u_int64_t newINodeHead = INode::read_byte_at(0, buffer); u_int64_t newINodeHead = INode::read_byte_at(0, buffer);
// deal with no more INode // deal with no more INode
@ -442,7 +442,7 @@ public:
// free the inode and add it to the free inode list head // free the inode and add it to the free inode list head
void inode_free(RawDisk &disk, u_int64_t INodeNumber){ void inode_free(RawDisk &disk, u_int64_t INodeNumber){
u_int64_t freeINodeHead = SuperBlock::getFreeINodeHead(disk); u_int64_t freeINodeHead = SuperBlock::getFreeINodeHead(disk);
uchar buffer[SECTOR_SIZE] = {0}; char buffer[SECTOR_SIZE] = {0};
INode::write_byte_at(freeINodeHead, 0, buffer); INode::write_byte_at(freeINodeHead, 0, buffer);
disk.rawdisk_write(INodeNumber*SECTOR_SIZE, buffer, sizeof(buffer)); disk.rawdisk_write(INodeNumber*SECTOR_SIZE, buffer, sizeof(buffer));
SuperBlock::writeFreeINodeHead(disk, INodeNumber); SuperBlock::writeFreeINodeHead(disk, INodeNumber);

View File

@ -6,17 +6,15 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <linux/fs.h> #include <linux/fs.h>
typedef unsigned char uchar;
class RawDisk{ class RawDisk{
int fd; int fd;
const uchar* dir; const char* dir;
u_int64_t numSectors; u_int64_t numSectors;
u_int64_t diskSize; u_int64_t diskSize;
public: public:
RawDisk(const uchar *directory) : fd(-1), dir(nullptr), numSectors(0), diskSize(0) { RawDisk(const char *directory) : fd(-1), dir(nullptr), numSectors(0), diskSize(0) {
dir = directory; dir = directory;
/*dir = strdup("/dev/vdc"); /*dir = strdup("/dev/vdc");
numSectors = 62914560; numSectors = 62914560;
@ -50,7 +48,7 @@ public:
} }
} }
int rawdisk_read(u_int64_t offset, uchar *buffer, size_t length) { int rawdisk_read(u_int64_t offset, char *buffer, size_t length) {
if (lseek(fd, offset, SEEK_SET) == (u_int64_t)-1) { if (lseek(fd, offset, SEEK_SET) == (u_int64_t)-1) {
perror("Error seeking to offset"); perror("Error seeking to offset");
return -1; return -1;
@ -66,7 +64,7 @@ public:
} }
// Write a specified number of bytes at a given byte offset // Write a specified number of bytes at a given byte offset
int rawdisk_write(u_int64_t offset, uchar *buffer, size_t length) { int rawdisk_write(u_int64_t offset, char *buffer, size_t length) {
if (lseek(fd, offset, SEEK_SET) == (u_int64_t)-1) { if (lseek(fd, offset, SEEK_SET) == (u_int64_t)-1) {
perror("Error seeking to offset"); perror("Error seeking to offset");
return -1; return -1;

View File

@ -4,7 +4,7 @@
int main(){ int main(){
fischl *F = new fischl; fischl *F = new fischl;
F->init(); F->init();
uchar *d = strdup("/dev/vdc"); char *d = strdup("/dev/vdc");
RawDisk *H = new RawDisk(d); RawDisk *H = new RawDisk(d);
return 0; return 0;
} }

View File

@ -3,13 +3,13 @@
#include <assert.h> #include <assert.h>
#include "rawdisk.h" #include "rawdisk.h"
int main(int argc, uchar *argv[]) { int main(int argc, char *argv[]) {
const uchar* d = (argc < 2) ? "/dev/vdc" : argv[1]; const char* d = (argc < 2) ? "/dev/vdc" : argv[1];
RawDisk *H = new RawDisk(d); RawDisk *H = new RawDisk(d);
uchar *buf = "iloveosdfjlseirfnerig"; char *buf = "iloveosdfjlseirfnerig";
uchar readBuffer[512] = {0}; // Initialize to zeros char readBuffer[512] = {0}; // Initialize to zeros
//printf("dir %s, numSectors %lld, diskSize %lld \n", H->dir, H->numSectors, H->diskSize); //printf("dir %s, numSectors %lld, diskSize %lld \n", H->dir, H->numSectors, H->diskSize);

View File

@ -4,27 +4,27 @@
#include "fs.h" #include "fs.h"
#include <inttypes.h> #include <inttypes.h>
int main(int argc, uchar *argv[]) { int main(int argc, char *argv[]) {
const uchar* d = (argc < 2) ? "/dev/vdc" : argv[1]; const char* d = (argc < 2) ? "/dev/vdc" : argv[1];
RawDisk *H = new RawDisk(d); RawDisk *H = new RawDisk(d);
printf("test inode\n"); printf("test inode\n");
INodeOperation inop; INodeOperation inop;
inop.initialize(*H); inop.initialize(*H);
uchar buffer[8] = {0}; char buffer[8] = {0};
//test the begining of inode 1~524287 //test the begining of inode 1~524287
H->rawdisk_read((1) * SECTOR_SIZE, buffer, sizeof(buffer)); H->rawdisk_read((1) * SECTOR_SIZE, buffer, sizeof(buffer));
u_int64_t t = 0; u_int64_t t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t |= ((u_int64_t)(uchar)buffer[j]) << (8 * j); t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j);
assert(t == 2); assert(t == 2);
//test the number before end of inode 524286 //test the number before end of inode 524286
H->rawdisk_read((MAX_INODE - 2) * SECTOR_SIZE, buffer, sizeof(buffer)); H->rawdisk_read((MAX_INODE - 2) * SECTOR_SIZE, buffer, sizeof(buffer));
t = 0; t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t |= ((u_int64_t)(uchar)buffer[j]) << (8 * j); t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j);
fprintf(stderr,"[t %llu,%d]\n",t,__LINE__); fprintf(stderr,"[t %llu,%d]\n",t,__LINE__);
assert(t == MAX_INODE - 1); assert(t == MAX_INODE - 1);
@ -32,21 +32,21 @@ int main(int argc, uchar *argv[]) {
H->rawdisk_read((MAX_INODE - 1) * SECTOR_SIZE, buffer, sizeof(buffer)); H->rawdisk_read((MAX_INODE - 1) * SECTOR_SIZE, buffer, sizeof(buffer));
t = 0; t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t |= ((u_int64_t)(uchar)buffer[j]) << (8 * j); t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j);
assert(t == 0); assert(t == 0);
//test the begining of datablock //test the begining of datablock
H->rawdisk_read((MAX_INODE) * SECTOR_SIZE, buffer, sizeof(buffer)); H->rawdisk_read((MAX_INODE) * SECTOR_SIZE, buffer, sizeof(buffer));
t = 0; t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t |= ((u_int64_t)(uchar)buffer[j]) << (8 * j); t |= ((u_int64_t)(unsigned char)buffer[j]) << (8 * j);
assert(t == (MAX_INODE+2048*8)*SECTOR_SIZE); assert(t == (MAX_INODE+2048*8)*SECTOR_SIZE);
//test the end of the datablock //test the end of the datablock
H->rawdisk_read((MAX_BLOCKNUM - 2048*8) * SECTOR_SIZE, buffer, sizeof(buffer)); H->rawdisk_read((MAX_BLOCKNUM - 2048*8) * SECTOR_SIZE, buffer, sizeof(buffer));
t = 0; t = 0;
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
t |= ((u_int64_t)(uchar)buffer[j]) << (8 * j); t |= ((u_int64_t)(char)buffer[j]) << (8 * j);
assert(t == (MAX_BLOCKNUM)*SECTOR_SIZE); assert(t == (MAX_BLOCKNUM)*SECTOR_SIZE);
//initialize //initialize