当前位置:文档之家› 深入理解文件系统

深入理解文件系统

深入理解文件系统
深入理解文件系统

一、通过格式化命令-看磁盘文件系统的建立过程

1、添加format命令,单步调试

所有的底层驱动函数都已经准备好。添加格式化命令format后,编译下载。

Format命令的执行主要是调用f_mkfs()函数,下面进行单步调试。

以下主要列出函数的主要执行步骤:

res=f_mkfs( 0, 1, 4096 ); //1表示不需要引导扇区。4096是8个扇区。

进入f_mkfs()函数,这里只列出主要执行步骤:

if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR)

return FR_MKFS_ABORTED;这个函数调用后,n_part=0x000F,3400 = 996 352,这是SD的总块数。allocsize /= SS(fs); 等于8/*Number of sectors per cluster */

n_clst = n_part / allocsize; //等于0x1E680 = 124 544 簇。

if (n_clst >= 0xFFF5) fmt = FS_FAT32; 所以文件系统确定为FAT32类型。

n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表示FAT要占据974个扇区。

n_rsv = 33 - partition; 保留扇区32个。

n_dir = 0;

b_fat = b_part + n_rsv; /* FA Ts start sector 32扇区*/

b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于FAT表个数设为1个,所以目录区=FA T起始+FAT占用扇区数*/

b_data = b_dir + n_dir; /* Data start sector */

以上三项确定FA T区域、根目录区、数据区的起始扇区。

disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK,这个函数调用没有正确返回可擦出扇区的总数。接下来程序会出错,因此退出,修改disk_ioctl()函数后,再次分析。把这个函数返回值直接改为32。并且把FA T表的个数定义为2.

N_FA TS改为2后,根目录区、数据区的起始扇区的起始扇区变为0x7BC=1980扇区。继续往下执行。

n = (b_data + n - 1) & ~(n - 1);

n_fat += (n - b_data) / N_FATS;这两句话对fat所占扇区数进行了修正,保证擦除时,以32个扇区为一个单位。

n_clst = (n_part - n_rsv - n_fat * N_FA TS - n_dir) / allocsize; =0x1E588。

tbl = fs->win; /* Clear buffer */

mem_set(tbl, 0, SS(fs)); 清零文件系统缓冲区。

mem_set(tbl, 0, SS(fs));

ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */

ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */

tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */

ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */

上面的工作主要是填充引导扇区缓冲区,也就是常说的DBR扇区缓冲,等所有的参数写好,就可以写回磁盘。

ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */

if (disk_write(drv, tbl, b_part+0, 1) != RES_OK)

return FR_DISK_ERR; //这就是在写有效引导标志sec[510]=0x55, sec[511]=0xAA。

if (fmt == FS_FA T32)

disk_write(drv, tbl, b_part+6, 1); //FAT32在第六扇区有个备份引导扇区。

for (m = 0; m < N_FATS; m++) {

mem_set(tbl, 0, SS(fs)); /* 1st sector of the FA T */

if (fmt != FS_FAT32) {

n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00;

n |= partition;

ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */

} else {

ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */

ST_DWORD(tbl+4, 0xFFFFFFFF);

ST_DWORD(tbl+8, 0x0FFFFFFF);/* Reserve cluster #2 for root dir */ } //簇0和簇1保留,簇2分配给根目录区。

if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)

return FR_DISK_ERR;

mem_set(tbl, 0, SS(fs)); /* Following FA T entries are filled by zero */ //接下来所有的扇区都清0,表示该簇未被占用。

for (n = 1; n < n_fat; n++) {

if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)

return FR_DISK_ERR;

} //第一次是写从0x21扇区开始,总共0x3CF个扇区(第一个扇区已经写了)。第二次开始时是备份引导扇区,0x20+0x3D0=0x3F0。同理,第一扇区与0x21扇区相同,后面都清零。

Format命令要执行较长的时间,主要就是FAT表接近2000个扇区要清零。

m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); m=8,每簇8扇区。

do {

if (disk_write(drv, tbl, b_fat++, 1) != RES_OK)

return FR_DISK_ERR;

} while (--m); //以上部分是将根目录区的8个扇区清零,表示目录项未被占用。

if (fmt == FS_FA T32) {

ST_WORD(tbl+BS_55AA, 0xAA55);

ST_DWORD(tbl+FSI_LeadSig, 0x41615252);

ST_DWORD(tbl+FSI_StrucSig, 0x61417272);

ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); //根目录区已经用掉了一簇。

ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF);

disk_write(drv, tbl, b_part+1, 1); //分别写入1号和7号扇区。

disk_write(drv, tbl, b_part+7, 1);

} //这是写FAT32文件系统的FSI扇区,包括空闲簇总数和上次分配的簇号。

FA T32文件系统的格式化到此完成。

2、再以Fdisk的方式格式化一次,这时候格式系统要写MBR扇区,FAT引导扇区不在0号扇区了。同时MBR要建立分区表,以找到DBR引导扇区。其过程与上述差不多,只是多执行了以下代码,详细过程就不叙述了。

if (!partition) {

DWORD n_disk = b_part + n_part;

mem_set(fs->win, 0, SS(fs));

tbl = fs->win+MBR_Table; //分区表从0x1BE开始。

ST_DWORD(tbl, 0x00010180); /*Partition start in CHS */ Table[0x1BE] =0x80,表明该分区是活动扇区。00表示开始柱面,01、01表示开始扇区、开始磁头。

if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */

n_disk = n_disk / 63 / 255;

tbl[7] = (BYTE)n_disk; //表示结束的柱面。

tbl[6] = (BYTE)((n_disk >> 2) | 63); //结束的扇区。

} else {

ST_WORD(&tbl[6], 0xFFFF); //

}

tbl[5] = 254; //结束的磁头。

if (fmt != FS_FAT32) /* System ID */

tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06;

else

tbl[4] = 0x0c; // 表示该分区类型为win95 FA T32

ST_DWORD(tbl+8, 63); /*起始扇区0x3F in LBA */

ST_DWORD(tbl+12, n_part); /*分区的大小,总扇区数减去MBR及其占据的一个柱面。*/

ST_WORD(tbl+64, 0xAA55); /* Signature */

if (disk_write(drv, fs->win, 0, 1) != RES_OK)

return FR_DISK_ERR;

partition = 0xF8; //MBR标志。

} else {

partition = 0xF0;

}

3、观察在有MBR区域的情况下,如何检查文件系统

fmt = check_fs(fs, bsect = 0); /*检查0扇区的时候,没有发现FAT文件系统扇区,但是有0x55 0xAA标志,说明这是有效磁盘,但是返回1. */

if (fmt == 1) { /* 表明可能存在分区*/

/* Check a partition listed in top of the partition table */

tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */

if (tbl[4]) { 实际这里应该是0x0c,表示FAT32系统。

bsect = LD_DWORD(&tbl[8]); /* 这个是文件系统引导扇区的号码。*/

fmt = check_fs(fs, bsect); /* 再到这个扇区检查是否存在FAT文件系统标志。*/ } }

执行过后,仍然能够建立完整的文件系统信息结构体,只是里面的FA T分配起始扇区、数据区起始扇区地址相对没有MBR的时候改变了,其它都差不多。

二、将SD卡格式化成具有两个分区的磁盘。

1、目的

(1)深入理解MBR、DPT等概念。

(2)修改ff.c中的f_mkfs函数,得到一个新函数,f_format(u8 partition,u16 allocsize),前一个参数是指磁盘等分的个数,接受1、2、3、4四个参数,默认为1,最大为4。后一个参数是指每簇占用的字节数。

(3)添加命令fdisk,调用上述函数。执行完成后,用读卡器在PC上读取该SD卡,应该显示两个可移动磁盘。

2、f_format()函数的编写

首先新建一个文件fext.c,该文件就实现一个函数f_format.c,首先将f_mkfs()函数复制过来,在此基础上修改。

编译后,首先解决警告和错误:包含头文件ff.h和diskio.h。引用了ff.c中的静态函数mem_set()和mem_clr(),复制过来。定义Null为0。将FATFS * FatFs[_Drives]做外部声明。

同时发现,不同c源文件中#define 同样的宏相互之间是不影响的。说明预处理的时候是一个一个文件处理的,不检查相互之间的关联。但同一个文件中,一个宏不能两次定义。

#ifndef NULL

#define NULL 0

#endif //采取这种方式,主要是防止其他包含的头文件也对NULL进行了定义。

函数中主要修改的地方就是:

n_part = n_part /drv; //进行drv等分。每个磁盘的扇区总数就是这么多。

在DPT对应增加的分区部分,填好分区表16个字节。特别重要的是四个地方:0字节写为00或0x80,第四字节写入0xc0表示FAT32系统。(第一次调试找不到新磁盘,就是由于这个字节默认为0)。第8-11写入分区引导扇区的线性扇区地址。第12-15写入该磁盘分区的大小。

for ( i="0"; i

b_fat=b_part + n_rsv;

3、其它修改的地方

定义_DRIVE为2,定义_MULTI_PARTITION为1,表示支持多分区。同时初始化磁盘物理驱动与分区号转换结构体(每个逻辑磁盘对应一个结构体)。

主程序中也要定义两个文件系统结构体,每个对应一个磁盘。然后分别调用f_mount()函数。

4、调用执行

void UartCmdFdisk(u8 argc,void **argv)

{

FRESULT res;

res=f_format( 2, 2048 ); /2表示格式化成两个磁盘。一簇是4个扇区、2048字节。

执行完这个函数后,磁盘被分成两个分区。

实际结果是,命令界面上可以查询到两个分区。但是利用读卡器放到PC上,却只看到250M的第一分区,不知什么原因。

三、添加命令fchdrive、fmove。

1、目的

(1)fchdrive:在支持相对目录的情况下改变当前逻辑磁盘。

(2)fmove:两个参数,将文件移动到另一个位置,可以改名,也可以保留原名。

2、fchdrive 命令的实现

(1)添加命令支持

这个不再赘述。

(2)实现代码

void UartCmdFChDrive(u8 argc,void **argv){

BYTE Drive;

FRESULT res="FR"_INV ALID_DRIVE;

if ( *( (BYTE*)argv[1]+1 )==':' ){ 检查参数,是不是1:类似格式。

Drive =*( (BYTE*)argv[1]) - '0'; 取出磁盘号

res=f_chdrive( Drive ); }

if ( res!=FR_OK) { Uart_PutString( "Invalid path!\r\n");return;}

Uart_PutString( "Current disk is changed!\r\n");

}

*( (BYTE*)argv[1])这个意思是先将argv[1]转换为BYTE指针,再取出里面的数据(BYTE型,一个字节。)

以下是实现的截图:

3、fmove命令的实现

(1)这个命令带两个参数:第一个是文件的原有路径,第二个是新路径,同时可以更改文件名。(2)实现的原理

以创建新文件的方式打开新路径的文件。这样会创建一个目录项,填充一个文件信息结构体。然后打开原有路径的文件,也会得到一个文件信息结构体。将旧结构体的文件大小、起始簇号复制到新的结构体,然后更新新文件的信息。然后删除原有路径的文件。移动操作完成。

(3)代码编写

需要两次打开文件,所以需要两个文件信息结构体。

res = f_open ( &FileOld, (const char *)argv[1], FA_WRITE );

res = f_open ( &FileNew, (const char *)argv[2], FA_CREATE_NEW );

FileNew.fsize = FileOld.fsize; // 改变新文件的大小等于原文件

https://www.doczj.com/doc/df12535929.html,_clust = https://www.doczj.com/doc/df12535929.html,_clust; //新文件的簇等于原文件的簇。

FileNew.flag |= FA__WRITTEN; //文件属性已改变,需要更新

res=f_close ( &FileNew ); //关闭时进行更新。

res=f_unlink ( (const char *)argv[1] ); //删除原文件

编译,下载测试,功能正常。以下是实现的截图。

四、添加命令fcopy、fpath。

1、目的

(1)fcopy:复制功能,原文件保留,新位置建立文件。

(2)fpath:在支持相对路径的情况下,显示当前磁盘的当前目录。

2、fcopy命令的实现

(1)复制命令的实现思路

首先要打开两个文件,原文件以可读FA_READ的方式打开,新文件以FA_CREATE_NEW和FA_WRITE的方式打开。

然后建立一个循环,每次从原文件读出一个扇区的数据,写入新文件。然后检查原文件结束标志,已到结尾,则跳出循环。

关闭两个文件,更新文件信息。

(2)代码实现

res = f_open ( &FileOld, (const char *)argv[1], FA_READ );

res = f_open ( &FileNew, (const char *)argv[2], FA_CREATE_NEW | FA_WRITE );

for ( ; ; ){

res = f_read ( &FileOld, (void*)FileBuf, 512, &ByteRead );

res = f_write ( &FileNew, ( const void *)FileBuf, ByteRead, &ByteWrite );

if (FileOld.fptr== FileOld.fsize) )break;

}

f_close (&FileOld);

f_close (&FileNew);

编译,下载,功能正确。

3、fpath命令的实现

(1)这个命令实现起来稍微有些难度

首先要获取当前磁盘和当前磁盘的当前目录所在簇,也就是FatFs[Drive]->cdir,如果为0,表明是在磁盘根目录,显示0:或者1:。如果该簇号等于根目录所在簇号,当前目录也是在跟目录。

如果不是在根目录,那就要逐层往上搜索了。根据f_opendir (DIR,..目录)可以回溯到上层目录,DIR结构体得到了上层目录(X+1)的起始簇号,目录项指针指向第0项。用f_readdir()逐步读出目录项属性,得到FILINFO结构体。如果其簇号等于文件系统的当前搜索簇号,则其名称就是所要得到的本层目录名。如果是根目录下则为0:/X目录名。

当前搜索簇号设为(X+1)的起始簇号。再次调用f_opendir( DIR,..目录),此次得到(X+2)的起始簇号,判断是否根目录。查找当期搜索簇号在(X+2)目录层中对应的目录项,并获取X+1层的目录名。如果是在根目录,则为0:/X+1目录名/X目录名。

循环直到到达根目录跳出搜索。

目录名缓冲区的处理方法。定义总长度为100字节。Path[99]=0;初始化时先让指针指向Path【99】。

得到一个目录,向前移动名称那么长,复制名称。再往前移动1,添加?/?标志。如果是根目录添加?:?,往前移动1,在添加…驱动号?,然后可以显示整个字符串。(2)代码实现

for ( ; ; ){

if ( CurClust == 0 || CurClust == CurFileSys->dirbase ) {

PathPtr--;

*PathPtr--=':'; /

*PathPtr = CurDrive+'0'; //如果当前簇号对应根目录。

break; }

res = f_opendir ( &DirInf, ".." ); //第一次执行时,DIR结构体的开始簇号变为X+1层目录的簇号//第二次时,变为X+2层目录的簇号。

if ( res!= FR_OK ) break;

do {

res = f_readdir ( &DirInf, &FileAttrib );

TempClust = FileAttrib.sclust;

if ( TempClust == CurClust ) break; //如果该目录项的簇号等于当前搜索簇号,它的名称就是当前需要的目录名

} while( res == FR_OK );

if ( res!= FR_OK ) break;

DirLen= Str_Length ( (const char*)FileAttrib.fname ); //这里要得到字符串的长度。

PathPtr -= DirLen; //文件指针往后退目录名长度

mem_cpy ( (void *)PathPtr, ( const void*)FileAttrib.fname, DirLen);

PathPtr--;

*PathPtr='/'; //添加文件间隔/符号。

CurClust = DirInf.sclust; //当前搜索簇号跟着上移。

}

Uart_PutString( PathPtr); //这是显示的当前目录。

Uart_PutString( "\r\n");

编译,下载,显示两层目录是正确的。但是目录一旦到第三层,就进入死循环。还要接着调试。

(3)调试

经调试发现res = f_opendir ( &DirInf, ".." )调用后,并不能每次都自动回溯到上一层目录。

所以改为:f_opendir ( &DirInf, (const char*)ddPtr),ddPtr初始化成“..”,然后每循环一次,前面加上”../”,第二次变为”../..”,第三次变为“../../.. “,这样目录不断回溯。

以下是该命令实现的截图。

五、使用文件字符串处理的功能

1、目的

验证f_printf()函数的功能,学习变参数函数的编写和使用方法。

掌握格式化字符串的一些定义和用途。

2、有关格式控制串

格式控制串总是以%开始,后跟一些参数:

%【flags】【宽度】【精度控制】type。

前面三个是可选,而type是必须的参数。

(1)flag用于控制输出的符号+(+-)、对齐方式-(左对齐)等。

(2)宽度只控制输出的宽度,03,当字符数小于3个时,左边补0.

(3)精度控制,主要针对浮点数。比如12.3456 如果%.2则只输出2位,变成12.34。

(4)类型是必须的。这里主要分析这个。

3、源代码分析

int f_printf (

FIL* fil, /* Pointer to the file object */

const char* str, /* Pointer to the format string */

... /* Optional arguments... */

){ va_list arp;

UCHAR c, f, r;

ULONG val;

char s[16];

int i, w, res, cc;

va_start(arp, str); //arp实际是一个通用类指针,指向str后的第一个参数。

for (cc = res = 0; cc != EOF; res += cc) {

c = *str++;

if (c == 0) break; /* End of string */

if (c != '%') { /* Non escape cahracter */

cc = f_putc(c, fil); //如果不是%,表示正常字符,写入文件

if (cc != EOF) cc = 1; //cc是本次写对应的字符数字。当然如果写入不成功,返回EOF,则跳出循环continue; //res是总共写入的数字。

}

w = f = 0; //从此处开始表示遇到了%后的处理

c = *str++; //取出下一个字符。

if (c == '0') { /* Flag: '0' padding */

f = 1; c = *str++; //如果是字符0,表示要控制宽度,flag第0位标志置位。取出下一字符

}

while (c >= '0' && c <= '9') { /* Precision */

w = w * 10 + (c - '0');

c = *str++; //依次取出后面的字符,如遇到034,则w=34。字符输出}

if (c == 'l') { /* Prefix: Size is long int */

f |= 2; c = *str++; //如果遇到字符'l',表示长整形,标志第1位置位。}

if (c == 's') { /* Type is string */

cc = f_puts(va_arg(arp, char*), fil); //如果遇到…s?标志,将arp转换为char*指针,并指向下一个参数。continue; //cc是字符串的长度,本次输入文件的字符数。

}

if (c == 'c') { /* Type is character */

cc = f_putc(va_arg(arp, int), fil); //字符以int类型出现,要占四个字节。

if (cc != EOF) cc = 1;

continue;

} r = 0; //如果字符'0'和'l'后,不是s和c,则下面继续处理

if (c == 'd') r = 10; /* Type is signed decimal */

if (c == 'u') r = 10; /* Type is unsigned decimal *///十进制

if (c == 'X') r = 16; /* Type is unsigned hexdecimal */

if (r == 0) break; /* Unknown type */

if (f & 2) { /* Get the value */

val = (ULONG)va_arg(arp, long);

} else {

val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int);

} //如果设置了'l',标志,则将数据转换为长整形。从参数中取出来。

/* Put numeral string */ //下面是将数字转换为字符串。

if (c == 'd') {

if (val & 0x80000000) {

val = 0 - val;

f |= 4; //标志第二位表明这是个负数。

} }

i = sizeof(s) - 1; s[i] = 0; //字符串最后一为以'\0'结束。i指向尾端,往前扩展。

do { //同时处理十进制和十六进制。

c = (UCHAR)(val % r + '0'); //十进制时,1234/10,余数4+…0?,变成字符

if (c > '9') c += 7; //十六进制,3A表示大写A,但实际的字符A是0x41,中间差7.

s[--i] = c; //前一位存储该字符。

val /= r; //val变成123,也就是把尾端一位去掉。

} while (i && val); //最多存储15位,要不然溢出。

if (i && (f & 4)) s[--i] = '-'; //如果为负数,还要加上符号标志。

w = sizeof(s) - 1 - w; //要求的宽度计算。8位宽,则填充从第7位开始。7-14,正好8位。

while (i && i > w) s[--i] = (f & 1) ? '0' : ' ';//如果0填充置位填充0,否则填充空格。i退到0,或者i推导W都结束填充。

cc = f_puts(&s[i], fil);

} va_end(arp);

return (cc == EOF) ? cc : res;

}

把代码看了一遍,基本还是能看懂。

4、移植。

(1)添加命令fstring,该命令一个参数,是用户字符串。以附加的写入到指定的文件fstring.txt。(2)实习方法

以写文件的方式,打开文件,然后指针移动到文件末尾。调用代码f_printf(&File,”输入字符串%s/r/n”,(const char*)argv[1])来写入文件。

(3)代码实现

res=f_open( &FileStr, "0:/doc/fstring.txt",FA_WRITE ); //

res=f_lseek( &FileStr, FileStr.fsize );

f_printf (&FileStr,"用户输入:%s\r\n",(char*)argv[1] );

f_close (&FileStr );

功能比较简单,测试通过。

六、支持长文件名(一)。

1、代码页的功能

(1)在原来的程序中,我把#define _CODE_PAGE 936,代码页定义为936.

这时候可以在磁盘上新建中文名称的文件夹和文件,(通过fwrite命令实现,只要数目小于4个就行,也可以用fread命令读出来),也可以显示中文文件名。(通过命令flist来实现)。

(2)我把#define _CODE_PAGE 1,代码页定义为1后,调用flist能正常显示中文名。但是调用fread 和fwrite命令不能读取和创建中文名文件了。

进入代码分析,显示时关键在函数get_fileinfo(),它原封不动的将系统标准名转换为一般字符串,对字符串不做任何处理,送到串口以后自然可以正常显示。

但是读取文件和写入文件时,首先调用f_open()函数,进入follow_path()函数,然后调用create_name (),当它遇到大于0x80 的字符时,产生如下效果:

if (c >= 0x80) { /* Extended char */

#ifdef _EXCVT

c = cvt[c - 0x80]; /* Convert exten

d char (SBCS) */

#else

b |= 3; /* Eliminate NT flag if ext char is exist */

#if !_DF1S /* ASCII only cfg */

return FR_INV ALID_NAME;

#endif

#endif

}

返回FR_INV ALID_NAME,所以它不识别中文GB2312(OEM)代码。

如果定义了define _CODE_PAGE==936,则同时就会定义DF1S,也同时定义了IsDBCS1(c)和IsDBCS2(d)。因此可以将中文OEM代码转换为标准文件名,存储于文件系统的目录项里面。

2、如果定义长文件名_USE_LFN,而不定义UNICODE码。有什么效果呢?

根据要求,先要添加ff_convert() and ff_wtoupper()两个函数。

结果发现,光两个转换表就要150K左右,我这个128k的空间是远远不够了。只能看代码而不能测试了。不定义UNICODE码的含义是用户提供的路径名不是以UNICODE形式出现的。

以下,就只能纸上谈兵了。

3、如果0:/doc 目录下有一个文件名(这是一个very long的文件.它里面是空的.txt文档)。

如果要显示这个目录下所有的文件信息,我会在命令界面上输入:

Flist 0:/doc。

执行这个命令,程序首先调用

F_opendir(DIR dj,const void *path)函数,对输入的路径进行分析。这个函数首先调用函数chk_mounted()检查磁盘上是否有文件系统,如果已经取得了信息,则很快返回。如果没有,则初始化磁盘,并读取信息,填充文件系统信息结构体FATFS。它去掉了路径前面的0:。

F_opendir接下来调用follow_path(dj, path),这个函数根据路径填充目录信息结构体。这个函数首先设置dj->sclust,如果前面有/,会去掉这个符号。接下来一直读取目录名直到下一个/。这个工作调用create_name(dj, &path)来完成。

进入create_name(dj, &path),首先做的工作是根据路径填充dj->lfn指向的内存单元,由于我的这个目录是短文件名:doc,所以填入缓冲区的是…d0…,?o0…,?c0…,由于目录到此结束,所以NS_LAST 属性被设置,表明已经到路径末尾。同时lfn[di] = 0,di此时指向c0后面那个内存单元。注意,存储进长目录区是以unicode的形式,而path用的是ANSi码,汉字两个字节,英文字母一个字节。create_name(dj, &path)继续执行,mem_set(dj->fn, ' ', 11),先将dj结构体的标准短文件名填充空格。if (si) cf |= NS_LOSS | NS_LFN通过这句话的判断,长文件名前面没有空格和.,没有超出8.3格式。当然后面还要继续判断。执行while (di && lfn[di - 1] != '.') di—这句后,di=0,表示没有找到扩展名(doc 没有扩展名)。dj->fn[i++] = (BYTE)w,通过这个方式将doc存进了短文件名存储区。dj->fn[NS] = cf,短文件名存储区12个字节,前11个是标准短文件名,最后一个是路径属性字节:是否.目录、大小写标志,超出8.3格式,是否长文件名、是否路径结束标志等等。

所以create_name(dj, &path)的工作主要是根据路径填充dj->lfn和dj->fn,前者每个字符16Byte,以 0

结尾,后者12个字节,以路径的整体属性结尾。

执行路径返回follow_path(dj, path),接下来调用dir_find(dj),这个函数的作用是在当前目录(对应dj->sclust)下,搜索dj->lfn和dj->fn对应的目录项,找到以后让dj->index和dj->dir指向该目录项的数据。追踪那个进入该函数。

在函数dir_find(dj)里,首先dir_seek(dj, 0),将索引定位于0,目录第一项。ord = sum = 0xFF长目录项索引和校验和设为-1。c = dir[DIR_Name]取出目录项的第一个字符进行判断,a = dir[DIR_Attr] & AM_MASK取出属性进行判断。建立一个循环,不断移动目录缓冲(每次下移32个字节),通过dir_next(dj, FALSE)来实现。当找到”doc “目录项时,if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break跳出循环,此时的有效信息就是dj->sclust加上dj->index和dj->dir,它指向根目录里的“doc”目录项。

执行路径返回follow_path(dj, path),由于last = *(dj->fn+NS) & NS_LAST,标志被置位,很快跳出路径分解的循环,返回到F_opendir(DIR dj,const void *path)。通过下面这个计算:

dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO)真正得到了分配给doc目录的起始簇的地址。接下来就可以读取0:/doc 目录下所有的目录项,并显示它包含文件、目录的属性信息了。

回到主程序执行路径,接下来调用:

f_readdir()这个函数功能是根据DIR结构体提供的信息,填充文件属性结构体,包括文件名字符串、

文件大小、文件修改日期等。进入该函数进行追踪。这里就快要找到我的长文件名目录项《这是一个very long的文件.它里面是空的.txt文档》了,它在目录项里是怎样的存在形式呢?

它共有29个字(包括空格和.),共占据3个长目录项和一个短目录项:其格式应该如下。

f_readdir()这个函数调用dir_read()函数,读取各个目录项的信息,然后调用get_fileinfo()函数得到文件的各项信息。下面进入dir_read()进行跟踪,看它是怎样对待长目录项的。

进入dir_read()函数,首先ord, sum = 0xFF,读取属性a = dir[DIR_Attr] & AM_MASK,if (a == AM_LFN),也就是当遇到长目录索引“43”的时候,sum = dir[LDIR_Chksum];c &= 0xBF; ord = c; dj->lfn_idx = dj->index;取得校验和,取得索引(这里是3),使长目录索引指向“43”目录项的索引号。如果pick_lfn(dj->lfn, dir)返回TRUE,则索引自动ord=ord-1变为2。进入pick_lfn(dj->lfn, dir),它的作用是将当前目录项里的长文件名部分写入dj->lfn指向的名字缓冲区。先从偏移26开始存入“t文档”三个unicode字符,然后写入0,返回TRUE。也就是ord=2。

继续执行,dir_next(dj, FALSE),dj->index指向下一项,a = dir[DIR_Attr] & AM_MASK,重新取得属性。此时c = dir[DIR_Name]=02,满足(c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir))这个表达式,所以索引又被设置为ord=1。

同上,再次读取ord=1的那一项,填充长文件名缓冲区,至此unicode名称已经完全存入dj->lfn指向的缓冲区,并且ord=0,表明长目录项已经结束。

通过dir_next()再次循环,接下来dj->index指向对应的短目录项,只要sum_sfn(dir)计算出来的校验和与前面长目录项里取得的校验和相等,dir_read()函数的任务就算完成了。它获得的信息包括:dj->lfnidx(长目录项开始索引),dj->lfn(完整的unicode长文件名),dj->index和dj->dir指向短目录项。执行路径回到f_readdir()。

f_readdir()函数接下来调用get_fileinfo(dj, fno)获取目录项的详细信息。追踪该函数的执行。这个函数共获取六个信息:大小、属性、修改时间、日期、短文件名、长文件名字符串(通过读取dj->lfn指向的缓冲区,并将unicode转换为OEM代码)。有了这个文件属性结构体的数据,用户就可以在串口终端显示目录下所有目录项的信息了。

计算机网络技术学习心得体会

计算机网络技术学习心得体会: 1世纪是一个信息经济时代,为适应时代的发展,作为一名当代大 学生,所受的社会压力将比任何时候的大学生都要来得沉重,因此 在校期间,我们必须尽可能的利用好学习时间,尽可能地学习更多 的知识和能力,学会创新求变,以适应社会的需要。 毕竟,不管将来是要从事什么样的相关行业,都需要掌握较为全面 的计算机知识,因为小到计算机的组装维修,大到服务器的维护与 测试,知道的更多更全面,那么对于自己以后找工作以及参加工作 帮助就越大。在知识经济时代,没有一个用人单位会傻到和知识作对,不是么? 基于这样对社会现状的认识,让我积极、认真地对于学习计算机课 程有了较为良好的心理基础。而我在第一次接触计算机就觉得很新鲜,觉得很奇妙,上网、玩游戏什么的操作都很是简单,但随着需 求的变化,自己对电脑接触的不断深入,对计算机的认识越来越深,特别是进到大学,专业要求进行电脑利用数据画图、学习了各种操 作并不简单的办公软件等等之类。 更令人恼火的是,当在制图、办公过程中,遇到一些电脑系统出错 导致文件成果丢失的令人恼火的突发问题时,我才深深地感受到自 己计算机知识是多么的欠缺,自己终归不是学计算机专业的,对计 算机知识的掌握都是零散的,对这些突发问题只能束手无策。但大 一并没有相关计算机课程,更多的时候只能自学,在第一个学年结

束后,为了自己知识的充实,也为了响应学校计算机课程的改革的 号召,我带着课程相关的两本教科书坐上了回家的火车,同时,也 开始了一段并不一昧玩乐的大学第一个暑假。 翻开主教材的第一节,我不禁有点傻眼,和我想象中的第一节不一样,它不是什么我们会、却不精通的软件的相关学习(受大一专业课教材的影响),而是在我的观念世界里地球人都能做到的----电脑开机,虽很意外可我还是认认真真的看了相关内容,也完成了实验要求。在做着这项在我看来在简单不过的电脑操作时,我想了很多以 前都不会想到的东西,简简单单一个开机键凝聚了多少代人的智慧!其实深思一下就能想到,在电脑发明的最开始的最开始,想要启动 电脑绝对不是像现在轻轻松松地按一个开机键就能做到的。那一个 简简单单的启动电脑的过程简化尚且如此,那其他由复杂而又浩瀚 如星海的程序代码及函数所构成的程序应用及电脑操作又将会是怎 样的神秘呢?我不禁对他们充满了好奇和探索之心。 其实对于计算机我可以说既熟悉又陌生,虽说经常使用,但其中好 多东西都还不懂,但经过多日的计算机自学,我对网络世界有了更 进一步的了解,可以说在学习中,我大饱眼福,大开眼界。学习中,我对网络知识有了一个系统的了解。当然不仅是学会了如何下载各 种软件、如何运用它进行下载一些网上资料的技巧、如何搜索和浏 览信息、怎样打开IE浏览器、输入搜索引擎地址、输入关键词、进入网站、浏览相关网页、文字信息的保存等等大量实用的知识。还 学会了Word(文字处理)、excel(表格管理)、powerpoint(幻灯片制作)、frontpage(网页制作)、access(数据库管理)、outlook(邮件管理)、publisher(广告设计,新闻稿,海报制作)、infopath(表单管理,动态表单填写)等等办公软件的较为深入的应用。还借此学习契

深入理解计算机系统第二版家庭作业答案

深入理解计算机系统(第二版)家庭作业第二章深入理解计算机系统二进制 2.55-2.57 略 2.58 int is_little_endian(){ int a = 1; return *((char*)&a); } 2.59 (x&0xFF) | (y&~0xFF) 2.60 unsigned replace_byte(unsigned x, unsigned char b, int i) { return (x & ~(0xFF<<(i<<3))) | (b << (i<<3)); } 2.61 A. !~x B. !x C. !~(x>>((sizeof(int)-1)<<3)) D. !(x&0xFF) 注意,英文版中C是最低字节,D是最高字节。中文版恰好反过来了。这里是按中文版来做的。 2.62 这里我感觉应该是英文版对的,int_shifts_are_arithmetic() int int_shifts_are_arithmetic(){ int x = -1; return (x>>1) == -1; } 2.63 对于sra,主要的工作是将xrsl的第w-k-1位扩展到前面的高位。 这个可以利用取反加1来实现,不过这里的加1是加1<<(w-k-1)。

如果x的第w-k-1位为0,取反加1后,前面位全为0,如果为1,取反加1后就全是1。 最后再使用相应的掩码得到结果。 对于srl,注意工作就是将前面的高位清0,即xsra & (1<<(w-k) - 1)。额外注意k==0时,不能使用1<<(w-k),于是改用2<<(w-k-1)。 int sra(int x, int k){ int xsrl = (unsigned) x >> k; int w = sizeof(int) << 3; unsigned z = 1 << (w-k-1); unsigned mask = z - 1; unsigned right = mask & xsrl; unsigned left = ~mask & (~(z&xsrl) + z); return left | right; } int srl(unsigned x, int k){ int xsra = (int) x >> k; int w = sizeof(int)*8; unsigned z = 2 << (w-k-1); return (z - 1) & xsra; } 2.64 int any_even_one(unsigned x){ return !!(x & ()); } 2.65 int even_ones(unsigned x){ x ^= (x >> 16); x ^= (x >> 8); x ^= (x >> 4); x ^= (x >> 2); x ^= (x >> 1); return !(x&1);

自考02335 网络操作系统模拟题及答案

(一) 一、单项选择题(本大题共20小题,每小题2分,共40分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.分布式计算机系统与通常的网络系统的主要区别在于它的( C ) (2分) A:并行性 B:资源共享性 C:透明性 D:复杂性 2. NetWare操作系统所用的一套协议是( C ) (2分) A:TCP/IP B:TCP/SPX C:IPX/SPX D:UDP/IP 3. NetWare386提供的消息服务用于发送接收基于文件的简短消息。这些文件消息的最大长度是( B )字节。 (2分) A:64 B:126 C:128 D:256 4.在Windows NT网络中,转发程序作为客户/服务器模式下的客户方,执行SMB协议,与服务器方的网络服务程序共处于( B ) (2分) A:传输层 B:会话层 C:表示层 D:网络层 5. Windows NT中,线程状态的改变不可能发生的是( C ) (2分) A:就绪 备用 B:备用 就绪 C:就绪 运行 D:运行 终止

6.在Internet上发送电子邮件,其文件传输代理使用的协议是( B ) (2分) A:TCP B:SMTP C:IP D:SNMP 7.内存中各存储单元的编号是指( C ) (2分) A:逻辑地址 B:映射地址 C:物理地址 D:可重定位地址 8.以下有关远程过程调用叙述中不正确的是( C ) (2分) A:V远程过程调用是不同节点机之间的一种通信方式 B:允许程序调用位于其他节点机上的过程 C:与send、receive原语功能相同 D:实现远程过程调用需要客户代理和服务器代理 9.设有n个进程共用一个相同的程序段(临界区),如果最多允许m个进程(m

邮电大学操作系统综合课程设计

邮电大学操作系统综合 课程设计 Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998

北京邮电大学课程设计报告 目录

实验一 Linux启动优化 一实验目的 Linux 系统从启动到登录 shell 界面需要花费较长时间,在普通微机上的启动过程需要十几秒或更长。如果要启动 X 界面,那花费的时间就更多了。启动时间过长对嵌入式系统而言,如信息家电产品(机顶盒),是无法接受的。 Linux 系统的启动由内核态下的启动和用户态下的启动组成。利用本实验中采取的多种方法,可以简化 Linux 系统启动过程,提高 Linux 系统启动速度,适应嵌入式系统快速启动和实时应用的需要。

二实验内容与步骤 1内核态启动优化 1)测量几个较大代码模块的启动时间 2)更改 MAX_HWIFS ,减小检测IDE过程的启动时间 2 用户态启动优化 1)开机画面字符隐藏技术 2)开机画面隐藏/调出 3)开机画面更换 3 测试系统总的启动时间 三实验原理 根据 Linux 源代码,从根本上分析 Linux 启动原理 四实验结果及分析 1 内核态启动优化 在 Redhat 9 中,安装内核开发包,能得到 Linux 源代码。位于/usr/src/ 目录下。 修改linux/init/,在所有的需要检测的代码段添加条件编译TIME_TEST常 量。 测试的代码段包括console_init(), vfs_caches_init,和pci_init()等。 改动完成之后,编译内核 1,清除源码树:make mrproper 2,生成现有.config文件:make oldconfig 3,配置内核:make menuconfig 4,生成依赖关系:make dep 5,编译内核:make bzImage 6,编译模块:make modules 7,安装模块:make modules_install 8,安装内核:make install 9,重起:init 6 启动结束之后,用 dmesg| grep “second” 得到所有设定的打印位置的记录

《计算机网络与通信》复习提纲及试题

《计算机网络与通信》复习提纲 第一部分大纲说明 一、课程性质和任务 《计算机网络与通信》是计算机科学与技术专业本科生的一门应用性较强的必修课。通过本课程的学习使学生掌握数据通信的基础知识和计算机网络的基本组成原理;计算机网络的基本概念和相关的新名词及术语;了解计算机网络的发展特点、设计技巧和方法;对常用计算机网络(如Ethernet、Internet)会进行基本的配置和使用。 二、课程教学组织 本课程的教学组织基本遵循分层模型,但不拘泥于分层结构模型;以Internet技术与高速网络技术为主线,加入网络发展的最新内容。 三、课程教学要求 学生通过本课程的学习,应能熟练掌握计算机网络的基本概念、新名词、术语及设计思路和方法技巧,理解计算机网络的最基本工作原理,掌握处理计算机网络问题的基本方法;掌握一种网络的安装、使用和简单维护,且面对不断变化的网络技术,具有跟踪、继续学习的基础与能力。 1. 掌握:要求学生能够全面、深入理解和掌握所学内容,并能够用其分析、解答与网络应用相关的问题,能够举一反三。 2. 了解:要求学生能够较好地理解和掌握,并且能够进行简单分析和判断。 第二部分考试内容和复习要求 第 1 章计算机网络概述 主要内容:计算机网络的形成与发展;计算机网络的基本概念——计算机网络定义、协议、计算机网络的组成、计算机网络的分类、网络拓扑结构、计算机网络的主要性能指标、计算机网络体系结构;计算机网络在我国的应用。 复习要求: 掌握:计算机网络的定义;协议;网络拓扑结构和网络体系结构。 掌握:计算机网络的组成和分类;计算机网络的主要性能指标及计算。 了解:计算机网络的形成与发展及在我国的应用。 ?了解:计算机网络的形成与发展过程。 ?掌握:计算机网络的定义与分类方法。 ?掌握:计算机网络的组成与结构的基本概念。 ?掌握:计算机网络拓扑构型的定义、分类与特点。 ?了解:典型的计算机网络。 ?掌握:协议、层次、接口与网络体系结构的基本概念。

《深入理解计算机网络》配套自测题

《深入理解计算机网络》配套自测题 一、小小数制伤大脑,抓包分析不可少 1. 与二进制100101.001101等值的十进制数是(C)。 A.25.203125 B.25.34 C.37.203125 D.37.34 2. 与十进制数28.625等值的十六进制数为(B)。 A.112.10 B.1C.A C.1C.5 D.112.5 3. 与十六进制数AC.E等值的十进制数是(D)。 A.112.875 B.162.875 C.254.7 D.172.875 4. 将-33以单符号位补码形式存入8 位寄存器中,寄存器中的内容为(A)。 A. DFH B. A1H C. 5FH D. DEH 5. 原码1.0101110 所表示的真值为(A)。 A. -0.0101110 B. +0.0101110 C. -0.1010010 D. +0.1010010 6. 若用8位机器码表示十进制数–101,则补码表示的形式为(B)。 A.11100101 B.10011011 C.11010101 D.11100111 7. 将多项式214 + 211 + 24 + 21 + 20表示为十六进制数为(A)。 A.4813H B.8026H C.2410H D.EB410H 8. 设字长8位并用定点整数表示,模为28,若[X]补=11111010,则X的原码及真值X分别为(B)。 A. [X]原=00000110,X=+0000110 B. [X]原=10000110,X=-0000110 C. [X] 原=01111010 ,X=+1111010 D. [X] 原=11111010 ,X=-0000110 9. 真值 X=-127D ,则其真值及 8 位反码分别为(D)。 A. [X] 反=11111111 , X=-1000000 B. [X] 反=10000000 ,X=-1000000 C. [X] 反=11111111 , X=-1111111 D. [X] 反=10000000 , X=-1111111 10. 若[X]补=CCH,机器字长为8位,则[X/2]补=(D)。 A.34H B.66H C.98H D.E6H 二、网络基础最基本,马上试试不要等 1.最早的计算机网络通常认为是(A)。 A. ARPANET B. BITENT C. CERNET D. ETHERNET 2. 小王出差到北京了,打电话给广州公司的小张说他要公司一份文件,小张马上用邮件发给他。这体现了计算机网络的(D)功能。 A. 资源共享 B. 分布式处理 C. 网络通信 D. 数据通信 3.有关令牌环网络的描述错误的是(C)。 A.令牌只能沿着逻辑环的一个方向进行传递 B. 任何时刻只有一个站点发送数据,不会产生介质访问冲突 C.发送数据时令牌必须随着数据一起传递,并一起被目的站点接收 D. 发送的信息帧(包括数据帧和令牌帧)最终都会回到源站点,目的站点接收的是复制数据帧 4. 有关令牌总线网络的描述错误的是(C)。 A.令牌总线网络的数据传输也是沿着逻辑环进行的,但每次生成的逻辑环可能都不一样 B. 如果总线网络中某个站点出现故障,或者没有工作,可以重新建立新的逻辑环 C. 令牌总线网络发送数据时不同时发送令牌帧,源数据也不用回到源站点 D. 在令牌总线的逻辑环中每个站点都有一张“连接表”,标识了本站点及前、后站点的地址 5. 下面关于令牌环网络和令牌总线网络比较,不正确的是(B)。

计算机信息管理系统基本情况及功能说明

计算机信息管理系统基本 情况及功能说明 This model paper was revised by the Standardization Office on December 10, 2020

计算机信息管理系统基本情况及功能说明 山西福康源药业集团有限公司 基本情况 我公司使用的为用友时空医药管理软件。 用友时空在多年流通领域信息化平台研发的基础上,针对当前流通企业在快速发展过程中呈现出的管理模式创新多变、大规模快速扩张、降低运营成本获取规模效益等方面的特征,引入SOA理念,采用“工具平台化、体系架构化”的研发策略设计开发了KSOA流通企业信息融通平台(下文中简称“KSOA平台”)。 KSOA平台面向国内流通企业中高端客户,旨在以面向服务的、集成一体化的信息管理平台支撑流通企业差异化竞争、持续化发展战略的贯彻执行。 KSOA平台涵盖了流通企业经营中的业务职能、财务职能、人力资源管理职能、协同办公职能和决策支持职能等等。包括批发业务系统,连锁业务系统,零售业务系统,仓储管理系统,供应商在线自助系统,客户在线自助系统,网上在线购物系统,财务管理系统,协同办公系统,人力资源管理系统,应用服务系统等核心模块。 本《用户操作手册》对KSOA平台重点介绍包括KSOA平台涉及概念、通用单据操作说明、主要业务流程等内容,内容浅显易懂。用户在启用KSOA管理系统前,须仔细阅读本操作手册,了解各个子系统、各模块及功能情况,并在商品提供商的指导下实施、操作。

北京时空超越科技有限公司致各软件用户:请严格遵照本《用户操作手册》使用,对于因违反操作流程和规范所导致的系统问题,要求时空超越公司提供的任何相关的服务和支持,不列入商品售后服务的免费服务范畴。 对于用户在实际系统操作中所遇到,本《用户操作手册》中未有涉及的相关操作,请与北京时空超越公司技术部取得联系,获得相应解决办法及操作指导。 第一部分:平台整体概述 1.1第一章单据中出现的名词 账:账的概念来源于实际业务处理和企业会计核算方法,其表现形式与会计核算所使用账簿账页格式类似。根据核算对象不同分为商品总账、货位商品账、往来 账等。 货位:是为了明显标出些商品所在的位置,以便规范管理、统计分析、查询分类,货位可以根据用户需要灵活设置,既可以标示商品作在物理位置,也可以标示 商品所在虚拟位置。KSOA平台中货位字段西文名称是“hw”。 批号:是指用于识别“批”的一组数字或字母加数字,用以追溯和审查该批药品的生产历史。KSOA平台中批号字段西文名称是“pihao”。 保质期:的保质期是指商品在条件下的质量保证期限。商品的保质期由提供,标注在限时使用的商品上。在保质期内,商品的生产企业对该商品质量符合有关标 准或明示担保的质量条件负责,销售者可以放心销售这些商品,消费者可以 安全使用。保质期在单据明细项中相应字段是“baozhiqi”字段。 商品淘汰:流通企业在经营过程中,对于因各种原因(如滞销等)不适合销售的商品

计算机网络的发展历史

计算机网络的发展历史 一、计算机网络发展的概要 随着1946年世界上第一台电子计算机问世后的十多年时间内,由于价格很昂贵,电脑数量极少。早期所谓的计算机网络主要是为了解决这一矛盾而产生的,其形式是将一台计算机经过通信线路与若干台终端直接连接,我们也可以把这种方式看做为最简单的局域网雏形。 最早的Internet,是由美国国防部高级研究计划局(ARPA)建立的。现代计算机网络的许多概念和方法,如分组交换技术都来自ARPAnet。 ARPAnet不仅进行了租用线互联的分组交换技术研究,而且做了无线、卫星网的分组交换技术研究-其结果导致了TCP/IP问世。 1977-1979年,ARPAnet推出了目前形式的TCP/IP体系结构和协议。1980 年前后,ARPAnet上的所有计算机开始了TCP/IP协议的转换工作,并以ARPAnet 为主干网建立了初期的Internet。1983年,ARPAnet的全部计算机完成了向TCP/IP的转换,并在 UNIX(BSD4.1)上实现了TCP/IP。ARPAnet在技术上最大的贡献就是TCP/IP协议的开发和应用。2个著名的科学教育网CSNET和BITNET 先后建立。1984年,美国国家科学基金会NSF规划建立了13个国家超级计算中心及国家教育科技网。随后替代了ARPANET的骨干地位。 1988年Internet开始对外开放。1991年6月,在连通Internet的计算机中,商业用户首次超过了学术界用户,这是Internet发展史上的一个里程碑,从此Internet成长速度一发不可收拾。 二、计算机网络的发展阶段 第一代:远程终端连接 时间:20世纪60年代早期 面向终端的计算机网络:主机是网络的中心和控制者,终端(键盘和显示器)分布在各处并与主机相连,用户通过本地的终端使用远程的主机。只提供终端和主机之间的通信,子网之间无法通信。 第二代:计算机网络阶段(局域网) 时间:20世纪60年代中期 多个主机互联,实现计算机和计算机之间的通信。包括:通信子网、用户资源子网。终端用户可以访问本地主机和通信子网上所有主机的软硬件资源。实现了电路交换和分组交换。 第三代:计算机网络互联阶段(广域网、Internet) 1981年国际标准化组织(ISO)制订:开放体系互联基本参考模型(OSI/RM),实现不同厂家生产的计算机之间实现互连。TCP/IP协议的诞生。

深入理解计算机系统lec01-intro

Computer Systems: A Programmer’s Perspective 计算机系统详解 Lecture 1 Intro February 25, 2011 Wu junmin (jmwu@https://www.doczj.com/doc/df12535929.html,)

Outline °Course Theme °Five great realities of computer systems °Administrative Matters °Lecture topics and assignments

课程出发点 ° Abstract vs. Reality °抽象是必须的,但也应该考虑问题的实现! °其他计算机课程通常强调抽象的地方: ?抽象数据类型 ?渐进分析法 °这些抽象往往是受限的: ?特别是当计算机系统中存在一些小的缺陷 ?有必要去深入了解计算机系统中一些底层的实现 °通过了解具体的实现有助于: ?成为更有效率的程序员 -能够更有效的找出并且消除bug -能够更好的进行程序性能调优 ?为以后的计算机类“系统”级课程做好准备 -编译, 操作系统, 网络, 计算机体系结构, 嵌入式系统等等

Great Reality #1 °Int ’s 不是整数, Float ’s 不是实数°举例 ? x 2 ≥ 0? -Float ’s: 是! -Int ’s: – 40000 * 40000 --> 1600000000 – 50000 * 50000 --> ?? ? (x + y) + z = x + (y + z)? -Unsigned & Signed Int ’s: 是! -Float ’s: – (1e20 + -1e20) + 3.14 --> 3.14 – 1e20 + (-1e20 + 3.14) --> ?? -1794967296 0

计算机系统的操作和管理操作规程

李生晓梦晓李飞刀制作双击可修改,再上传必究 再上传必究计算机系统的操作和管理操作规程 1、目的:通过制定计算机系统的操作和管理操作规程,有效控制计算机系统的操作和管理符合质量规定的要求。 2、依据:新《药品经营质量管理规范》及现场检查指导原则的规定制定本制度。 3、适用范围:适用计算机系统的操作和管理全过程。 4、责任者:分店所有在册人员。 5、内容: 5.1计算机信息管理员依照编制好操作人员岗位权限,对员工发放管理软件登录使用信息,由使用者保存,应注意对自己使用的登录信息做到保密,由质量负责人监督,防止人员之间相互跨权限登录使用计算机管理系统。 5.2计算机信息管理员负责建立系统管理软件的服务器和数据库,对数据库产生的数据信息应采取安全保密的储存管理,对每天产品的数据信息进行备份,防止数据缺失,数据应保存至少5年。 5.3当数据的录入因疏忽产生错误时,操作人员应当及时联系门店质量负责人及计算机信息管理员提出数据修改申请,由质量负责人审核、确认后,由计算机信息管理员进行数据的修改。 5.4药品在计算机系统上的采购和收货:采购员每次采购药品时,依据系统数据库生成采购订单,采购订单确认后,系统自动生成采购计划;药品到货时,收货员根据系统生成的采购计划,对照实物确认相关信息后,方可进行验收,系统录入相关信息后系统生成“采购记录”。 5.5药品在计算机系统上的验收:药品验收员按规定进行药品质量验收,对照药品实物在系统采购记录的基础上核对药品的批号、生产日期、有效期、到货数量等内容并系统确认后生成验收记录。 5.6药品在计算机系统上的养护:系统依据质量管理基础数据和养护制度,对药品按期

网络操作系统安装与管理

网络操作系统安装与管理任务一:windows 2003 Enterprise server 网络操作系统 一、实验目的 能够独立的安装windows 2003 Enterprise server 网络操作系统 二、基本知识 本次试验要求具有系统安装的基础知识,便于今后在企业中完成初期的安装配置工作 三、实验设备与环境 1.机器配置最小为:X86处理器主频133MHz以上,Itannium处理器主频733MHz以上;内存最小128M;硬盘最小10G;配置网卡。 2.安装操作系统为Windows 2003 Enterprise Server简体中文版。 3.操作系统的分区格式必须是:NTFS,如果先期采用了fat32格式,则有些服务器的功能不能实现,以后可以转换。 4.各个机器之间能够实现对等网,且能够互相访问、共享资源。 四、实验内容 1、先将 CMOS 设置中的启动顺序改为 CDROM ,然后放入Windows 2003 Enterprise Server 中文版的安装盘(市面上的可能为番茄花园版本)到光驱并重新启动,安 装过程会自动开始。 2、到“分区选择”处最好选择“建立新的分区”并以NTFS格式进行格式化,然后在一 系列选择之后复制文件、首次重新启动。这时请先进入CMOS更改启动顺序为硬盘启动,保存退出,继续启动和安装过程。 3、重新启动后将自动运行Windows 2003安装向导。单击“下一步”开始检测并安装设 备。在“区域设置”处单击区域设置的“自定义”按钮,在区域选项对话框的底部语言设置列表中点选“中文”然后单击“确定”返回,击“下一步”,输入姓名、单位信息,接受默认的许可证模式授权,击“下一步”,接受系统自动生成的计算机名或者更改为自己想设置的名字,并在底部输入系统管理员密码两次后击“下一步”如果在网卡硬件配置处未能列出您的网卡,必须手动选择网卡厂家、型号,并指定驱动程序盘所在,正常驱动后继续下面的安装。 4、在“网络设置”对话框选择“自定义设置”,击“下一步”,双击“Internet协议 (TCP/IP)”显示其属性,将“自动获得IP地址”改为“使用下面的IP地址”并 输入您的IP地址,如:192.168.0.1,子网掩码为255.255.255.0,默认网关为 192.168.0.1,首选DNS服务器为192.168.0.1,然后击“确定”返回,单击“下一步”,在“工作组或计算机域”对话框选择“不,系统自动把计算机的工作组设置为Workgroup,开始安装选择的组件,安装完毕删除临时文件后,击“完成”二次 重新启动,安装即告完成。 5、安装完毕后,检查“设备管理器”中是否有未能识别的设备,如果则必须要安装好 相关的驱动程序。(驱动程序最好是原驱动) 五、安装注意事项 1.在安装2003操作系统时,必须用系统自带工具进行分区和格式化,C盘的空间不得低于5G,建议理想空间为8G。 2.在选择“许可证”模式的时候,一定要选择“每服务器”模式,连接数量自己定义。 3.尽量不要在安装的过程中选择加入域的操作,这样会浪费大量的时间。

深入理解计算机系统LAB2

LAB1实验报告 实验目的: 使用课程知识拆除一个“Binary Bombs”来增强对程序的机器级表示、汇编语言、调试器和逆向工程等理解。 实验简介: 一个“Binary Bombs”(二进制炸弹,简称炸弹)是一个Linux可执行C程序,包含phase1~phase6共6个阶段。炸弹运行各阶段要求输入一个字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目标是你需要拆除尽可能多的炸弹。 运行结果: 通关密码储存在0014301-151420131.txt文件中。 成功运行结果截图: 实验中的六组密码:

PHASE1:字符串比较 本关比较简单,根据课件中的提示用GDB将最先压栈的那个字符串常量打印出来,然后将其作为密码输入,比较成功后即通关。 08048ab2 : 8048ab2: 83 ec 14 sub $0x14,%esp 8048ab5: 68 04 9f 04 08 push $0x8049f04 8048aba: ff 74 24 1c pushl 0x1c(%esp) 8048abe: e8 4d 04 00 00 call 8048f10 将地址0x8049f04中的值打印出来: 即“The future will be better tomorrow.” PHASE2:循环 在查看汇编语言的时候,会看到有调用一个read_six_number函数,猜测此题是让输入六个数字。 08048ad3 : 8048ad3: 56 push %esi 8048ad4: 53 push %ebx 8048ad5: 83 ec 2c sub $0x2c,%esp 8048ad8: 8d 44 24 10 lea 0x10(%esp),%eax 8048adc: 50 push %eax 8048add: ff 74 24 3c pushl 0x3c(%esp) 8048ae1: e8 46 05 00 00 call 804902c 8048ae6: 83 c4 10 add $0x10,%esp 8048ae9: 83 7c 24 08 01 cmpl $0x1,0x8(%esp)------→判定是否为1 8048aee: 74 1e je 8048b0e 8048af0: e8 12 05 00 00 call 8049007 8048af5: eb 17 jmp 8048b0e 8048af7: 8b 03 mov (%ebx),%eax 8048af9: 01 c0 add %eax,%eax----→进行自加,扩大两倍 8048afb: 39 43 04 cmp %eax,0x4(%ebx) 8048afe: 74 05 je 8048b05 8048b00: e8 02 05 00 00 call 8049007 8048b05: 83 c3 04 add $0x4,%ebx 8048b08: 39 f3 cmp %esi,%ebx 8048b0a: 75 eb jne 8048af7 8048b0c: eb 0a jmp 8048b18

计算机控制系统基本知识

第一部分DCS系统介绍 第一章计算机控制系统简介 第一节概述 计算机控制系统是指以计算机为控制设备所组成的自动控制系统。计算机具有实现各种数学运算和逻辑判断的能力。其主要特点是: 1运算速度快,能存储大量的数据,具有很强的信息处理能力; 2、容易实现各种控制规律(PID控制、串级控制、复合控制等); 3、将显示、打印、报警、给定参数等功能集中在控制台上,方便运行人员操作与监视; 4、指导运行人员正确地进行操作和控制。 计算机在电厂生产过程自动化中的应用,主要有以下三个方面。 1数据采集和处理 计算机数据采集和处理系统的功能是:定时采集生产过程中大量的,经过一次测量仪表 发送、统一信号、模/数转换后的过程参数信号,并按预定的要求对它们进行分析、计算和处理,最后进行CRT显示、报警、打印或储存。 计算机数据采集处理系统的结构示意图如下图实线部分所示。 数据处理的另一种应用形式是操作指导。计算机根据生产过程提出的数学模型进行计 算,寻找出生产过程的最优操作条件和数值,并CRT显示屏上显示出来或通过打印机打印 给操作人员。由操作人员去改变模拟调节器的给定值或直接操纵执行机构,从而把生产过程控制在最佳状态。 操作指导属于计算机开环监控方式。

简图:计算机数据处理与操作指导系统 2、直接数字控制(DDC) 生产过程的被调参数通过模拟量输入计算机,由计算机按预定的控制规律进行运算,并运算的结果由输出通道去直接控制执行机构,从而把被调参数保持在给定值上。这样的控制方式称为直接数字控制。 简图:直接数字控制系统 3、监督计算机控制(SPC) 监督计算机控制是指计算机根据生产过程的信息,按照过程的数学模型,求出生产过程 最优运转的操作条件和数值,并直接去改变模拟调节器的给定值,由模拟调节器或DDC控制机实行对生产过程的控制,从而使生产过程处于最优化状态。 简图:监督计算机控制系统

管理系统中计算机应用

《管理系统中计算机应用》期末复习题 一、单选题 1.使用EXCEL建立的工作簿文件的扩展名是( A )。 2.在Excel中,组成一个工作表的基本单元是( C )。 3.在Excel中,默认状态下新建的工作簿中包含的工作表数量是( C )。 4.企业中业务信息的特点是数据(A )。 5.数据处理过程是从(C ) 6.输入数组公式之后,会发现公式自动出现一对( C ),即代表数组公式输入成功。 7.以下单元格描述方式中采用混合引用的是( C )。 8.下列选项中,属于推动移动商务发展的新兴技术的是( C ) 9.以下单元格描述方式中采用绝对引用的是( A )。 10.企业计算机应用从组织内部向外部逐步扩展、延伸的过程称为企业的( B ) 11.人们日常生活和工作接触最多的信息系统是( A ) 12.下单元格描述方式中采用相对引用的是( B )。 13.包含智能化查询和服务支持系统的DSS应用被称为( B ) 14.按键盘组合键( A )即可输入数组公式,实现一次性对多个单元格输入公式的操作。 15.Excel2003是一种主要用于( A )的工具。 16. 在Excel中,默认状态下新建的工作簿中包含的工作表数量是(C )。 17.按拓扑结构划分,计算机网络分为( C ) 18.根据资源分布结构和处理过程的不同,网络信息处理平台分为( D ) 19. 工作表第28列的列标为( B )。 20 在Excel中,单元格地址的表示方式是( A )。 21.因特网发展的基础框架是( A ) 22.由数据库、计算机软硬件系统、数据库管理系统、数据库管理员和用户构成的整体是(B ) 23. 在单元格中输入数据时,如果需要在单元格内换行应使用( C )键。 24. 在默认格式下,当在一个单元格内输入6-1时,单元格中显示的数据为( C )。 25.能充分利用多处理器平台,同步处理数据的数据库系统是(D ) 26.从一个学生关系中找出所有学生考试成绩的操作属于( A ) 27.如果一个关系模式的码由单一属性构成,那么它(D ) 28.在SQL语言中,命令动词DELETE属于( C ) 29.以下运算中不是算数运算符的是( D )。 30.以人的观点模拟事物本身的模型称为(B ) 31.从规划内容上看,企业信息系统规划分为(D ) 32.在可行性分析中,能回答“项目在企业中能否获得支持”的是(D ) 33.在Excel 中,给当前单元格输入数值型数据时,默认为( C )。 34.在用户需求难以确定的情况下,信息系统开发宜选用( D ) 35.当向Excel 工作表单元格输入公式时,使用单元格地址D$2 引用D 列2 行单元格,该单元格的引用称为( B )。

网络操作系统(课后练习题)

项目01 认识网络操作系统 大项1 of 1 - 填空题83.0/ 100.0 得分 题目1 of 6 30.0/ 30.0 得分 Windows Server 2008 操作系统发行版本主要有9个,分别是Windows Server 2008 标准版、Windows Server 2008 企业版、Windows Server 2008 数据中心版、Windows web Server 2008、Windows Server 2008 安腾版、Windows Server2008 标准版(无Hyper-V)、Windows Server 2008 企业版(无Hyper-V)、Windows Server 2008 数据中心版(无Hyper-V)和Windows HPC Server 2008。 答案: 标准, 企业, 数据中心, Web, 安腾, 标准, 企业, 数据中心, HPC 题目2 of 6 10.0/ 10.0 得分 操作系统是用户与计算机之间的接口,网络操作系统可以理解为是网络用户与计算机网络之间的接口。 答案: 用户, 网络用户 题目3 of 6 10.0/ 10.0 得分 网络通信是网络最基本的功能,其任务是在源主机和目的主机之间实现无差错的数据传输。 答案: 源主机, 目的主机|目标主机 题目4 of 6 10.0/ 10.0 得分 Web服务、大型数据库服务等都是典型的客户/服务器模式 答案: 客户/服务器|客户机/服务器|C/S|Client/Server 题目5 of 6 8.0/ 20.0 得分 基于微软NT技术构建的操作系统现在已经发展了5代,依次是:Windows NT Server 、Windows 2000 Server 、Windows Server 2003 、Windows Server 2008 、Windows Server Longhorn 。 答案: NT, 2000, server 2003, server 2008, server 2012 题目6 of 6 15.0/ 20.0 得分

计算机网络技术学习心得体会

计算机网络技术学习心得体会 转眼之间,两个月的实习期即将结束,回顾这两个月的实习工作,感触很深,收获颇丰。这两个月,在领导和同事们的悉心关怀和指导下,通过我自身的不懈努力,我学到了人生难得的工作经验和社会见识。我将从以下几个方面总结计算机网络技术岗位工作实习这段时间自己体会和心得: 一、努力学习,理论结合实践,不断提高自身工作能力。 在计算机网络技术岗位工作的实习过程中,我始终把学习作为获得新知识、掌握方法、提高能力、解决问题的一条重要途径和方法,切实做到用理论武装头脑、指导实践、推动工作。思想上积极进取,积极的把自己现有的知识用于社会实践中,在实践中也才能检验知识的有用性。在这两个月的实习工作中给我最大的感触就是:我们在学校学到了很多的理论知识,但很少用于社会实践中,这样理论和实践就大大的脱节了,以至于在以后的学习和生活中找不到方向,无法学以致用。同时,在工作中不断的学习也是弥补自己的不足的有效方式。信息时代,瞬息万变,社会在变化,人也在变化,所以你一天不学习,你就会落伍。通过这两个月的实习,并结合计算机网络技术岗位工作的实际情况,认真学习的计算机网络技术岗位工作各项政策制度、管理制度和工作条例,使工作中的困难有了最有力地解决武器。通过这些工作条例的学习使我进一步加深了对各项工作的理解,可以求真务实的开展各项工作。 二、围绕工作,突出重点,尽心尽力履行职责。 在计算机网络技术岗位工作中我都本着认真负责的态度去对待每项工作。虽然开始由于经验不足和认识不够,觉得在计算机网络技术岗位工作中找不到事情做,不能得到锻炼的目的,但我迅速从自身出发寻找原因,和同事交流,认识到自己的不足,以至于迅速的转变自己的角色和工作定位。为使自己尽快熟悉工作,进入角色,我一方面抓紧时间查看相关资料,熟悉自己的工作职责,另一方面我虚心向领导、同事请教使自己对计算机网络技术岗位工作的情况有了一个比较系统、全面的认知和了解。根据计算机网络技术岗位工作的实际情况,结合自身的优势,把握工作的重点和难点,尽心尽力完成计算机网络技术岗位工作的任务。两个月的实习工作,我经常得到了同事的好评和领导的赞许。 三、转变角色,以极大的热情投入到工作中。 从大学校门跨入到计算机网络技术岗位工作岗位,一开始我难以适应角色的转变,不能发现问题,从而解决问题,认为没有多少事情可以做,我就有一点失望,开始的热情有点消退,完全找不到方向。但我还是尽量保持当初的那份热情,想干有用的事的态度,不断的做好一些杂事,同时也勇于协助同事做好各项工作,慢慢的就找到了自己的角色,明白自己该干什么,这就是一个热情的问题,只要

计算机信息管理系统基本情况介绍和功能说明

计算机信息管理系统 的基本情况介绍和功能说明 系统简介 中国现在正在进行医疗体制的改革,从体制上来保障市民的健康和医疗体制的合理性。为了适应和促进医疗体制的改革,药店的经营也本着利民、便民的宗旨出发,利用现代信息社会中各种先进的高科技手段,来更好的为社会服务。为了适应这一新的历史形势,必然对药店的管理以及辅助管理的计算机系统提出了新的要求。 拟采用的系统主要是引进先进的信息处理技术,提高企业的自动化程度和信息共享度,提高工作效率,降低成本;更重要的可以从根本上改变企业的战略发展,在经营和管理上更上一个台阶。 系统需求 系统总体目标是为企业实现六统一建立一套高效可行的信息管理系统,六统一指的是:统一品牌;统一进货策略;统一配送策略;统一财务结算;统一价格策略;统一管理流程。具体在设计上应满足下列需求: ●各独立核算企业均要实现信息管理系统,并完成有关财务、业务数据的 核算,汇总和集成 ●通过有效的网络体系实现各企业间的信息共享、信息交换、信息监控 ●能为各个业务环节提供快速的信息分析决策功能 ●能为各个独立核算企业中的工作人员提供有效的绩效评价 ●实现进、销、调、存各业务环节全过程的监控和信用管理 ●满足行业规定和国家规定(如GSP管理要求) ●建立物流配送体系和电子商务平台 ●企业科室办公自动化 ●满足企业不断扩张和快速发展在信息管理上的需要

系统应用主体业务分为单体店;企业业务系统已经使用了计算机管理,系统的使用除了保证原业务的开展之外还需要拓展一些新业务(如配送系统), 系统业务特点 ●药品的管理:由于药店内药品的种类繁多,数量大,手工的管理模式难以 收集到有关药品的准确信息,因而也不能对药品进行科学的管理。在药品管理上系统均对药品的品名、规格、生产批号、生产单位、批准文号、经办人、购销对象、检验记录、退换货记录及有关质量方面的内容作详细的记录; ●物流的管理:由于药店数目多,药品在仓库、药店内的流动量大,手续繁琐, 手工管理容易出错,并且商流与物流没有分开,影响药品的流通; ●店员素质低,现行管理不能满足对人员、销售、商品进行有效监控; ●与供应商的结算:和供应商之间的结算要按照批号,按批次,分品种进行算。 系统设计的原则 ●总体可行性原则 总体可行性原则包括实用性、可靠性、可推广性、可扩充性、先进性等。对所有这些性能的综合考虑,并将实用性放在首位,以保证系统能够达到预期的目标。 ●有限合理性原则 我们一方面应看到,信息技术的应用将不可避免地需要对企业中一些沿袭已久的观念和思想、工作程序和方法,甚至责权关系和组织结构做一些必要的调整;另一方面也应看到,信息技术只是一种手段,因此,对企业及业务流程的重组和调整要结合实际情况有条不紊地进行。 ●柔性组合原则 按信息系统的功能来设计功能子系统,用功能子系统来组合符合业务要求的部门职能子系统,以提高系统的柔性,使其能够适应职能部门的改变和用户的业务变化。这也是开放系统的概念(应用级的开放和组件设计方法)。

相关主题
文本预览
相关文档 最新文档