uint32_t offset = pos & (PAGE_SIZE - 1);
size_t left = size;
+ ssize_t read_bytes = 0;
+
while (left > 0) {
page_t* page = NULL;
uint32_t end_index = inode->i_size >> PAGE_SHIFT;
// copy data
bytes = bytes < left ? bytes : left;
+ read_bytes += bytes;
void* addr = page2va(page);
// printk("memcpy bytes %u index %u\n", bytes, index);
// printk("read addr %x bytes %u index %u offset %u\n", addr, bytes, index, offset);
no_cached_page_in_hash:
page = alloc_one_page(0);
if (page == NULL) {
- return ENOMEM;
+ return -ENOMEM;
}
// TODO:可能已经有其它进程已经把数据读入内存了
assert(mapping->a_ops->read_page != NULL);
ret = mapping->a_ops->read_page(file, page);
if (0 != ret) {
- return EIO;
+ return -EIO;
}
//
add_page_to_hash(page, mapping, index);
}
- return ret;
+ return read_bytes;
}
ssize_t sysc_read(int fd, void* buf, size_t count) {
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
-typedef unsigned long u32;
typedef unsigned long long u64;
typedef signed char s8_t;
panic("local apic not supported\n");
}
- // 开房时钟中断
+ // 开启时钟中断
lapic_t* lapic = system.lapic;
uint32_t apic_base = 0;
// 在qemu启动后如果gdb有加断点,就很会一直触发中断重入
reenter++;
- reenter_count += reenter == 0 ? 0 : 1;
+ if (reenter > 1) {
+ reenter_count++;
+ }
assert(irq_disabled());
assert(reenter >= 0);
assert(reenter <= 1);
file.f_dentry = ni.path.dentry;
file.f_ops = file.f_dentry->d_inode->i_fops;
- vfs_generic_file_write(&file, "aaa1234567", 10, &file.f_pos);
+ const char* init_elf_data = "aaa1234567abcdIII";
+ vfs_generic_file_write(&file, init_elf_data, strlen(init_elf_data), &file.f_pos);
file.f_pos = 0;
char buf[128] = {'b', 'u', 'f'};
- vfs_generic_file_read(&file, buf, 4, &file.f_pos);
- for (int i = 0; i < 16; i++) {
- printk("%c ", buf[i]);
+ ssize_t ret = vfs_generic_file_read(&file, buf, 128, &file.f_pos);
+ for (int i = 0; i < ret; i++) {
+ printk("%c", buf[i]);
}
printk("\n");
}
// 2. 拷贝页表
pte_t* oldaddr = pa2va(PAGE_ALIGN(page_dir[npde]));
memcpy((void*)newaddr, (void*)oldaddr, PAGE_SIZE);
-
// 3. 解除PTE的写保护
*pte |= PTE_RW;
}