delog show ascii

This commit is contained in:
w-mj committed 2019-06-18 16:06:34 +08:00
1 parent aa6fefff5c
commit 0fde9f5a7c
3 files changed
+66 -11

No files matched your search

+46 -5
View File
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <ctype.h>
#include "delog.h"
#define wmj_null (_I)-1
@@ -289,6 +290,8 @@ _wmj_delog_END:
#define fmt_ext_hex(s, n) fmt_str(s, n, "XX ")
#define fmt_continue(s, n, num) fmt_str(s, n, ".. (mode %d bytes not show)\n", num)
#define fmt_new_line(s, n, addr) fmt_str(s, n, "\n0x%08x : ", _Lclr(addr, 4))
#define fmt_ascii(s, n, d) fmt_str(s, n, "%c", isprint(d)?(_u8)(d):'.')
#define fmt_dot(s, n) fmt_str(s, n, "x")
#define DEF_SHOW_MAX 256
#define LINEBSIZE 4
@@ -300,17 +303,28 @@ _I print_bin(_s s, _I size, _u8 *p, _I len) {
_I suffixnum;
_I i = 0, j = 0, re = 0, n = size;
if (prefixnum) {
// 有前缀X
fmt_new_line(s, n, (_u32)(_i64)(p + i));
}
//printf("%x\n%s\n", prefixnum, ms_buf);
//printf("%x\n%s\n", prefixnum, ms_buf);
while (i < prefixnum) {
// 打印X
fmt_ext_hex(s, n);
i++;
}
_I last_i = i;
while ((i < DEF_SHOW_MAX) && (len > 0)) {
if ((i & _BITS_MASK(LINEBSIZE)) == 0) {
last_i = LINENUM;
if (j > 0 && j < LINENUM + 1) {
for (int t = 0; t < LINENUM - j; t++)
fmt_dot(s, n);
last_i = j;
}
while (j > 0 && last_i--) {
fmt_ascii(s, n, p[j - last_i - 1]);
}
fmt_new_line(s, n, (_u32)(_i64)(p + i));
}
fmt_one_hex(s, n, p[j]);
@@ -318,10 +332,37 @@ _I print_bin(_s s, _I size, _u8 *p, _I len) {
j++;
len--;
}
suffixnum = _LNclr(LINENUM - i, 4);
while (suffixnum) {
i = suffixnum = _LNclr(LINENUM - i, 4);
i = 0;
while (i < suffixnum) {
fmt_ext_hex(s, n);
suffixnum--;
i++;
}
i = 0;
if (len) {
last_i = LINENUM;
if (j > 0 && j < LINENUM + 1) {
for (int t = 0; t < LINENUM - j; t++)
fmt_dot(s, n);
last_i = j;
}
while (j > 0 && last_i--) {
fmt_ascii(s, n, p[j - last_i - 1]);
}
} else {
last_i = LINENUM - suffixnum;
if (j < LINENUM)
last_i -= prefixnum;
if (j + prefixnum < LINENUM)
while(prefixnum--)
fmt_dot(s, n);
while (last_i--) {
fmt_ascii(s, n, p[j - last_i]);
}
}
while (suffixnum--) {
fmt_dot(s, n);
}
if (len > 0) {
fmt_new_line(s, n, (_u32)(_i64)(p + i));
+17 -5
View File
@@ -16,12 +16,12 @@ void EXT2_FS::printFS() {
using namespace std;
cout << endl;
cout << "文件系统中Inode数量 " << sb->inodes_count << endl;
cout << "文件系统中总块数 " << sb->blocks_count << endl;
cout << "以块为单位的文件系统大小 " << sb->blocks_count << endl;
cout << "文件系统中保留块数目 " << sb->r_blocks_count << endl;
cout << "文件系统中空闲块数目 " << sb->free_blocks_count << endl;
cout << "文件系统中空闲Inode数量 " << sb->free_inodes_count << endl;
cout << "第一个数据块的位置 " << sb->first_data_block << endl;
cout << "块大小 " << 1024 * pow(2, sb->log_block_size) << endl;
cout << "第一个使用的块号 " << sb->first_data_block << endl;
cout << "块大小 " << 1024 * (1 << sb->log_block_size) << endl;
cout << "逻辑片大小 " << sb->log_frag_size << endl;
cout << "每组块数 " << sb->blocks_per_group << endl;
cout << "每组碎片数 " << sb->frags_per_group << endl;
@@ -45,6 +45,10 @@ void EXT2_FS::printFS() {
}
}
int EXT2_FS::block_to_pos(int block) {
return (block - 1) * sb->log_block_size + 1024;
}
void EXT2_FS::mount() {
sb = new SuperBlock();
dev->seek(1024); // 跳过引导块
@@ -55,16 +59,24 @@ void EXT2_FS::mount() {
_si(sb->log_block_size);
_si(sb->blocks_count);
_si(sb->blocks_per_group);
// 1024 * (1 << sb->log_block_size) * 8;
dev->seek(1024 * (1 << sb->log_block_size) + 1024); // 指向GDT
int group_cnt = sb->blocks_count / sb->blocks_per_group;
int group_cnt = 8 * sb->blocks_count / sb->blocks_per_group;
for (int i = 0; i < group_cnt; i++) {
GroupDescriptor* gtp = new GroupDescriptor();
dev->read(sb_buf, sizeof(GroupDescriptor));
memmove(gtp, sb_buf.data, 1024);
memmove(gtp, sb_buf.data, sizeof(GroupDescriptor));
gdt_list.push_back(gtp);
}
// 数据块位图
dev->seek(block_to_pos(gdt_list.front()->block_bitmap));
dev->read(sb_buf, sb->log_block_size);
_sa(sb_buf.data + 5, 5);
printFS();
}
+3 -1
View File
@@ -159,8 +159,10 @@ struct DirEntry {
class EXT2_FS: VFS::FS {
std::list<GroupDescriptor*> gdt_list;
void printFS();
SuperBlock* sb;
void printFS();
int block_to_pos(int block);
public:
EXT2_FS(Dev::BlockDevice* dev);
void mount();