2019.11.03
This commit is contained in:
@@ -12,7 +12,7 @@
|
||||
|
||||
#### 1.1 方式一
|
||||
|
||||
可以选择已创建好的docker镜像作为实验环境(人生苦短,我用容器)。linux用户可以通过挂载将本地项目目录挂载到容器中,windows或mac用户可以在容器内重新git clone一份(因为不区分文件名大小写会导致挂载出错)。
|
||||
可以选择已创建好的docker镜像作为实验环境(人生苦短,我用容器)。linux用户可以通过挂载将本地项目目录挂载到容器中,windows或mac用户可以在容器内重新git clone一份(因为不区分文件名大小写会导致挂载出错)。->[Dockerfile](src/docker/Dockerfile)
|
||||
|
||||
1. docker方式
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
2. 通过浏览器输入```http://localhost:6080```访问容器内的桌面系统了。
|
||||
2. 通过浏览器输入```http://localhost:6080```就访问容器内的桌面系统了。
|
||||
|
||||
- vnc登陆密码: 123456
|
||||
- 默认用户: ubuntu
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
#### 1.2 方式二
|
||||
|
||||
**ubuntu(64bit,>=14.04)** 的用户也可以使用`src/code`目录下的一键环境搭建脚本[setup.sh](src/code/setup.sh)。
|
||||
**ubuntu(64bit,>=14.04)** 的用户也可以使用`src/code`目录下的一键环境搭建脚本。->[setup.sh](src/code/setup.sh)
|
||||
|
||||
### 二、如何使用
|
||||
|
||||
|
@@ -89,7 +89,7 @@ int free_block(int dev, int block)
|
||||
if (block < sb->s_firstdatazone || block >= sb->s_nzones) {
|
||||
panic("trying to free block not in datazone");
|
||||
}
|
||||
/* 然后从hash表中寻找该块数据 */
|
||||
/* 从hash表中寻找该块数据 */
|
||||
bh = get_hash_table(dev, block);
|
||||
if (bh) {
|
||||
if (bh->b_count > 1) { /* 引用次数大于1,该块还有人用,则调用brelse()后退出 */
|
||||
@@ -104,11 +104,11 @@ int free_block(int dev, int block)
|
||||
}
|
||||
/* 接着复位block在逻辑块位图中的位(置0) */
|
||||
block -= sb->s_firstdatazone - 1 ;
|
||||
if (clear_bit(block & 8191, sb->s_zmap[block/8192]->b_data)) { /* 1个缓冲块有1024B,即8192bits */
|
||||
if (clear_bit(block & 8191, sb->s_zmap[block/8192]->b_data)) {
|
||||
printk("block (%04x:%d) ", dev, block + sb->s_firstdatazone - 1);
|
||||
printk("free_block: bit already cleared\n");
|
||||
}
|
||||
/* 最后置相应逻辑块位图所在缓冲区已修改标志 */
|
||||
/* 最后置相应逻辑块位图所在缓冲区的已修改标志 */
|
||||
sb->s_zmap[block/8192]->b_dirt = 1;
|
||||
return 1;
|
||||
}
|
||||
@@ -216,7 +216,7 @@ void free_inode(struct m_inode * inode)
|
||||
}
|
||||
|
||||
/**
|
||||
* 为设备dev建立一个新i节点
|
||||
* 在设备dev上创建一个新i节点
|
||||
* @param[in] dev 设备号
|
||||
* @retval 成功返回新i节点的指针,失败返回NULL
|
||||
*/
|
||||
|
@@ -89,7 +89,7 @@ static void wait_on_super(struct super_block * sb)
|
||||
}
|
||||
|
||||
/**
|
||||
* 取指定设备的超级块
|
||||
* 取指定设备dev的超级块结构体指针
|
||||
* 在超级块表(数组)中搜索指定设备dev的超级块结构信息。若找到则返回超级块的指针,否则返回空指针。
|
||||
* @param[in] dev 设备号
|
||||
* @retval 超级块指针
|
||||
@@ -119,7 +119,7 @@ struct super_block * get_super(int dev)
|
||||
}
|
||||
|
||||
/**
|
||||
* 释放指定设备的超级块
|
||||
* 释放指定设备dev的超级块
|
||||
* 释放设备所使用的超级块数组项(置s_dev = 0),并释放该设备i节点位图和逻辑块位图所占用的高速缓
|
||||
* 冲块。如果超级块对应的文件系统是根文件系统,或者其某个i节点上已经安装了其他的文件系统,则不能
|
||||
* 释放该超级块。
|
||||
|
@@ -10,6 +10,6 @@
|
||||
/**
|
||||
* 关闭文件
|
||||
* @param[in] fd 要关闭的文件描述符
|
||||
* @retval
|
||||
* @retval 成功返回0,失败返回-1。
|
||||
*/
|
||||
_syscall1(int, close, int, fd)
|
||||
|
@@ -12,7 +12,7 @@
|
||||
* 打开(有可能创建)一个文件
|
||||
* @param[in] filname 文件名
|
||||
* @param[in] flag 文件打开标志
|
||||
* @param[in] ...
|
||||
* @param[in] ... 文件属性
|
||||
* @retval 成功返回文件描述符,出错返回-1并且设置出错号
|
||||
*/
|
||||
int open(const char * filename, int flag, ...)
|
||||
@@ -20,24 +20,15 @@ int open(const char * filename, int flag, ...)
|
||||
register int res;
|
||||
va_list arg;
|
||||
|
||||
/* 利用va_start()宏函数,取得flag后面参数的指针,然后调用系统中断int 0x80,
|
||||
功能号__NR_open。文件打开操作。
|
||||
%0 - eax(返回的描述符或出错码)
|
||||
%1 - eax(系统中断调用功能号__NR_open)
|
||||
%2 - ebx(文件名filename)
|
||||
%3 - ecx(打开文件标志flag)
|
||||
%4 - edx(后随参数文件属性mode) */
|
||||
va_start(arg, flag);
|
||||
__asm__(
|
||||
"int $0x80"
|
||||
:"=a" (res)
|
||||
:"0" (__NR_open), "b" (filename), "c" (flag),
|
||||
"d" (va_arg(arg, int)));
|
||||
/* 系统中断调用返回值大于或等于0,表示是一个文件描述符,则直接返回之 */
|
||||
:"0" (__NR_open), "b" (filename), "c" (flag), "d" (va_arg(arg, int))
|
||||
);
|
||||
if (res >= 0){
|
||||
return res;
|
||||
}
|
||||
/* 否则说明返回值小于0,则代表一个出错码,设置该出错码并返回-1 */
|
||||
errno = -res;
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user