HIT CSAPP LAB1

Linux下C工具应用

目 录

第1章 实验基本信息 - 4 -
1.1 实验目的 - 4 -
1.2 实验环境与工具 - 4 -
1.2.1 硬件环境 - 4 -
1.2.2 软件环境 - 4 -
1.2.3 开发工具 - 4 -

1.3 实验预习 - 4 -
第2章 实验环境建立 - 6 -
2.1 VMWARE下中文UBUNTU安装(5分) - 6 -
2.2 UBUNTU与WINDOWS目录共享(5分) - 6 -
第3章 WINDOWS 软硬件系统观察分析 - 8 -
3.1 查看计算机基本信息(2分) - 8 -
3.2 设备管理器查看(2分) - 10 -
3 隐藏分区与虚拟内存之分页文件查看(2分) - 11 -
3.4 任务管理与资源监视(2分) - 11 -
3.5 计算机硬件详细信息(2分) - 11 -
第4章 LINUX软硬件系统观察分析 - 13 -
4.1 计算机硬件详细信息(3分) - 13 -
4.2 任务管理与资源监视(2分) - 13 -
4.3 共享目录的文件系统信息(3分) - 13 -
4.4 LINUX下网络系统信息(2分) - 13 -
第5章 以16进制形式查看程序HELLO.C - 15 -
5.1 请查看HELLOWIN.C与HELLOLINUX.C的编码(3分) - 15 -
5.2 请查看HELLOWIN.C与HELLOLINUX.C的回车(3分) - 15 -
第6章 程序的生成 CPP、GCC、AS、LD - 16 -
6.1 请提交每步生成的文件(4分) - 16 -
第7章 计算机系统的基本信息获取编程 - 17 -
7.1 请提交源程序文件(10分) - 17 -
第8章 计算机数据类型的本质 - 18 -
8.1 请提交源程序文件DATATYPE.C(10分) - 18 -
第9章 程序运行分析 - 19 -
9.1 SUM的分析(20分) - 19 -
9.2 FLOAT的分析(20分) - 19 -
第10章 总结 - 20 -
10.1 请总结本次实验的收获 - 20 -
10.2 请给出对本次实验内容的建议 - 20 -
参考文献 - 21 -

第1章 实验基本信息

1.1 实验目的

运用现代工具进行计算机软硬件系统的观察与分析
运用现代工具进行Linux下C语言的编程调试
初步掌握计算机系统的基本知识与各种类型的数据表示

1.2 实验环境与工具

1.2.1 硬件环境

X64 CPU;2GHz;2G RAM;256GHD Disk 以上

1.2.2 软件环境

Windows7 64位以上;VirtualBox/Vmware 11以上;Ubuntu 16.04 LTS 64位/优麒麟 64位;

1.2.3 开发工具

Visual Studio 2010 64位以上;CodeBlocks;vi/vim/gpedit+gcc

1.3 实验预习

上实验课前,必须认真预习实验指导书
了解实验的目的、实验环境与软硬件工具、实验操作步骤,复习与实验有关的理论知识。
在Windows下编写 hellowin.c,显示“Hello 1160300199学霸”(可用记事本、VS、CB等,换成学生自己信息)
在Linux下编写 hellolinux.c,显示“Hello 1160300199学霸”(可用VI、VIM、EMACS、GEDIT等,换成学生自己信息)
编写 showbyte.c 以16进制显示文件hello.c等的内容:每行16个字符,上一行为字符,下一行为其对应的16进制形式。
编写 datatype.c,定义C所有类型的全局变量,并赋初值。如整数可以是学号(数字部分),字符串可以是你的姓名,浮点数可以是身份证号的数字部分。主程序打印每个变量的变量名、变量值、变量地址、变量对应16进制的内存各字节。

第2章 实验环境建立

2.1 Vmware下中文Ubuntu安装(5分)

安装Ubuntu,安装中文输入法(搜狗输入法),用户名为学号!
打开终端term,输入 Hello 1160300199学霸(用真实学号姓名代替)。
截图:要求有Windows状态行,Vmware窗口,Ubuntu窗口,终端term窗口,输入的“Hello 1160300199学霸”信息
图2-1  Vmware下中文Ubuntu安装效果截图
图2-1 Vmware下中文Ubuntu安装效果截图

2.2 Ubuntu与Windows目录共享(5分)

在Windows下建立一目录,将hellowin.c拷贝到此目录。在vmware下设置Ubuntu共享hitics。
在Ubuntu下Home建立快捷链接hitics指向此共享目录,并在此目录建立hellolinux.c。
打开终端term,进入此目录,输入 “ls –la” 指令。
截图:要求有Ubuntu的“文件”应用打开“Home”,能看到hitics。term窗口。
图2-2  Ubuntu与Windows共享目录截图
图2-2 Ubuntu与Windows共享目录截图

第3章 Windows 软硬件系统观察分析

3.1 查看计算机基本信息(2分)

截图: 控制面板->系统
在这里插入图片描述
命令行systeminfo执行结果(至少包含启动设备行)
在这里插入图片描述
在这里插入图片描述
图3-1 Windows下计算机基本信息

3.2 设备管理器查看(2分)

按链接列出设备,找出所有的键盘鼠标设备。写出每一个设备的从根到叶节点的路径。
键盘1:
LAPTOP-78U8F945>>基于ACPI x64的电脑>>Microsoft ACPI-Complaint System>>PCI Express根复合体>>Intel® USB 3.1可扩展主机控制器-1.10 (Microsoft)>>USB根集线器(USB 3.0)>>USB Composite Device>>USB输入设备>>HID Keyborad Device
键盘2:
LAPTOP-78U8F945>>基于ACPI x64的电脑>>Microsoft ACPI-Complaint System>>PCI Express根复合体>>Intel® 300 Series Chipset Family LPC Controller(HM370) - A30D>>PS/2标准键盘
鼠标1:
LAPTOP-78U8F945>>基于ACPI x64的电脑>>Microsoft ACPI-Complaint System>>PCI Express根复合体>>Intel® USB 3.1可扩展主机控制器-1.10 (Microsoft)>>USB根集线器(USB 3.0)>>USB Composite Device>>USB输入设备>>HID-compliant mouse
鼠标2(若有):
LAPTOP-78U8F945>>基于ACPI x64的电脑>>Microsoft ACPI-Complaint System>>PCI Express 根复合体>>Intel® Serial IO I2C Host Controller - A369>>I2C HID设备>>HID-compliant mouse

3.3 隐藏分区与虚拟内存之分页文件查看(2分)

写出计算机主硬盘的各隐藏分区的大小(MB):
300MB 805MB
写出pagefile.sys的文件大小(Byte):
3407872 KB* 1024 = 3489660928B
C盘根目录下其他隐藏的系统文件名字为:
swapfile.sys / hiberfil.sys / UserGuidePDF / System Volume Information / Recovery / ProgramData / Intel / Documents and Settings / $SysReset / $Recycle.Bin

3.4 任务管理与资源监视(2分)

写出你的计算机的PID最小的两个任务的名称、描述。
1.系统空闲进程
处理器空闲时间百分比
2.System
NT Kernel&System

3.5 计算机硬件详细信息(2分)

CPU个数: 1
物理核数: 4
逻辑处理器个数: 8
L1 Cache大小: 256KB
L2 Cache大小: 1.0MB
L3 Cache大小: 8.0MB
在这里插入图片描述
在这里插入图片描述
图3-2 Windows下计算机硬件详细信息

第4章 Linux软硬件系统观察分析

4.1 计算机硬件详细信息(3分)

CPU个数: 1
物理核数: 1
逻辑处理器个数: 1
MEM Total:2017272KB
Used: 800436KB
Swap:998396KB
在这里插入图片描述
在这里插入图片描述
图4-1 Linux下计算机硬件详细信息

4.2 任务管理与资源监视(2分)

写出Linux下的PID最小的两个任务的PID、名称(Command)。

  1. 1 systemd
  2. 2 kthreadd

4.3 共享目录的文件系统信息(3分)

写出Linux下的hitics共享目录对应的文件系统的基本信息:
名称:vmhgfs-fuse 容量:1.8T挂载点:/mnt/hgfs

4.4 Linux下网络系统信息(2分)

写出本虚拟机的IPv4地址:192.168.163.131
mac地址:00:0c:29:b8:75:69
在这里插入图片描述
在这里插入图片描述
图4-1 Linux下网络系统信息

第5章 以16进制形式查看程序Hello.c

5.1 请查看HelloWin.c与HelloLinux.c的编码(3分)

HelloWin.c采用ANSI(ISO-8859)编码,HelloLinux.c 采用UTF-8 Unicode编码,你的姓名xxx分别编码为:xxx与xxx
HelloWin.c在Linux下用gcc缺省模式编译后运行结果为:Hello xxx

5.2 请查看HelloWin.c与HelloLinux.c的回车(3分)

Windows下的回车编码为:0d 0a,Linux下的回车编码为:0a。
交叉打开文件的效果是Windows下打开HelloLinux.c无换行,
Linux下打开HelloWin.c姓名为乱码。

第6章 程序的生成 Cpp、Gcc、As、ld

6.1 请提交每步生成的文件(4分)

hello.i hello.s hello.o hello.out
见压缩包

第7章 计算机系统的基本信息获取编程

7.1 请提交源程序文件(10分)

isLittleEndian.c
cpuWordSize.c
见压缩包

#include <stdio.h>
int isLittleEndian()
{
	int n = 0xcd23ff;
	int ch  = *(unsigned char *)&n;
	return ch == 0xff;
}
int main()
{
	if (isLittleEndian())
		printf("My computer apply littleEndian");
	else
		printf("My computer apply BigEndian");
	printf("\n");
	return 0;
}
#include <stdio.h>
int main() 
{
	printf("%d\n", sizeof(int *) * 8);
	return 0;
}

第8章 计算机数据类型的本质

8.1 请提交源程序文件Datatype.c(10分)

要求有main函数进行测试。
见压缩包

#include <stdio.h>
typedef union data {
	int n;
	char ch;
}tr;
typedef struct comp {
	int price;
}zl;
char a = 'A';
int b = 1180;
short c = 3007;
long d = 190000000;
float e = 3.1415926;
double f = 3.1415926535;
zl g;
tr h;
int grade[3] = { 100,99,98 };
enum week { Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 } day;
int main()
{
	g.price = 1000;
	h.n = 200;
	h.ch = 'A';
	printf("type\t\tname\t\tvalue\t\taddress\t\thexadecimal value\n");
	printf("char\t\ta\t\t%c\t\t%p\t\t%x\n", a, &a, a);
	printf("int\t\tb\t\t%d\t\t%p\t\t%x\n",b, &b, b);
	printf("short\t\tc\t\t%d\t\t%p\t\t%x\n", c, &c, c);
	printf("long\t\td\t\t%d\t%p\t\t%x\n", d, &d, d);
	printf("float\t\te\t\t%f\t%p\t\t%x\n", e, &e, e);
	printf("double\t\tf\t\t%lf\t%p\t\t%x\n", f, &f, f);
	printf("struct\t\tg.price\t\t%d\t\t%p\t\t%x\n", g.price, &g.price, g.price);
	printf("union\t\th.n\t\t%d\t\t%p\t\t%x\n", h.n, &h.n, h.n);
	printf("union\t\th.ch\t\t%c\t\t%p\t\t%x\n", h.ch, &h.ch, h.ch);
	printf("grade[]\t\tgrade[0]\t%d\t\t%p\t\t%x\n", grade[0], grade, grade[0]);
	printf("grade[]\t\tgrade[0]\t%d\t\t%p\t\t%x\n", grade[1], &grade[1], grade[1]);
	printf("grade[]\t\tgrade[0]\t%d\t\t%p\t\t%x\n", grade[2], &grade[2], grade[2]);
	day = Mon;
	printf("enum week\tMon\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Tues;
	printf("enum week\tTues\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Wed;
	printf("enum week\tWed\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Thurs;
	printf("enum week\tThurs\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Fri;
	printf("enum week\tFri\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Sat;
	printf("enum week\tSat\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	day = Sun;
	printf("enum week\tSun\t\t%d\t\t%p\t\t%x\n", day, &day, day);
	printf("printf's address = %lx\n",(long)printf);
	printf("main's address = %lx\n",(long)main);
	return 0;
}

第9章 程序运行分析

9.1 sum的分析(20分)

结果:
程序停止,运行结果超时
具体原因分析:当len=0时,由于有符号、无符号在共同运算时需转换为无符号数,因此len-1不为-1而为一个较大的无符号正整数UMaxw,数组可能越界而使程序访问非法地址
改进措施:
可以将len定义为int类型,或者将循环判断条件i<=len-1改为i<len

9.2 float的分析(20分)

结果:
在这里插入图片描述
在这里插入图片描述
具体原因分析:对于第一组数据,0前面的数据无法在限制的位数内精确表示输入的值,根据IEEE表示单精度浮点数的规则,数据将遵从向偶数舍入的规则,二进制的尾数将被截断产生使结果值产生偏差;对于第二组数据,数据截断后恰能准确表示,故能精确表示
改进措施:用数组按位表示或者采用更高精度的double(双精度浮点类型)
注意:float类型在使用时由于位数不足可能无法精确表示部分数据,若为了追求高精度,可以采用double类型或者用数组按位表示

  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值