yale_OS(2)——OS-xv6的源代码的调试

xv6源代码的调试(源代码的下载,编译,运行如yale_OS(1)——OS-xv6的源代码的下载,编译和运行所示)

在QEMU下远程调试xv6.(学习课程地址如下:http://zoo.cs.yale.edu/classes/cs422/2011/lec/l2-hw
1.打开一个终端,进入xv6目录下,运行如下命令:make qemu-gdb
此时qemu进入等待状态,如下:
administrator@ubuntu:~/xv6$ make qemu-gdb
*** Now run 'gdb'.
qemu -serial mon:stdio -hdb fs.img xv6.img -smp 2 -S -gdb tcp::26000
等待gdb远程连接到该qemu.


2.然后打开另一个终端,进入相同的目录,运行如下命令:gdb kernel
此时进入了调试状态,如下:
administrator@ubuntu:~/xv6$ gdb kernel
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/administrator/xv6/kernel...done.
+ target remote localhost:26000
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()
+ symbol-file kernel
(gdb)

3.一旦GDB成功连接上QEMU的远程调试,它将会显示远程的QEMU程序停在何处。
如下所示:
The target architecture is assumed to be i8086
[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
0x0000fff0 in ?? ()

4.在exec处设置断点,命令如下:b exec

5.然后继续运行,继续的命令如下:c
运行结果如下:
(gdb) c
Continuing.
[New Thread 2]
[Switching to Thread 2]
The target architecture is assumed to be i386
=> 0x100930 <exec>: push %ebp

Breakpoint 1, exec (path=0x1c "/init", argv=0xff1ee4) at exec.c:11
11 {
(gdb)

在此处,机器正运行在32bit模式下,xv6已经进行了自身的初始化,其将加载和运行它的第一个用户模式下的进程——/init程序,

6.然后继续运行,继续的命令如下:c
(gdb) c
Continuing.
[Switching to Thread 1]
=> 0x100930 <exec>: push %ebp

Breakpoint 1, exec (path=0x83c "sh", argv=0xff0ee4) at exec.c:11
11 {
(gdb)

此处第二次调用exec函数,

7.当继续在gdb下敲入命令:c,此时在QEMU下出现等待输入命令状态,此时,在QEMU下输入如下命令:
$ cat README
此处gdb调试终端下出现如下状态:
(gdb) c
Continuing.
[Switching to Thread 2]
=> 0x100930 <exec>: push %ebp

Breakpoint 1, exec (path=0x1460 "cat", argv=0xfe4ee4) at exec.c:11
11 {
(gdb)

通过如下命令来检查exec函数调用时的参数:
1)p argv[0]
结果为:
(gdb) p argv[0]
$1 = 0x1460 "cat"

2)p argv[1]
结果为:
(gdb) p argv[1]
$2 = 0x1464 "README"

3)p argv[2]
结果为:
(gdb) p argv[2]
$3 = 0x0

8.在gdb调试终端下,输入命令:up,可以检查上下文哪个函数调用了exec
如下:
(gdb) up
#1 0x001041a8 in sys_exec () at sysfile.c:366
366 return exec(path, argv);
(gdb) up
#2 0x00103f86 in syscall () at syscall.c:133
133 proc->tf->eax = syscalls[num]();
(gdb) up
#3 0x00104e2d in trap (tf=0xfe4fb4) at trap.c:41
41 syscall();

9.使用gdb中的list或l命令,可以查看当下调用exec函数的上下文的源代码。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
人脸识别是计算机视觉领域的研究热点之一,卷积神经网络(CNN)是其中应用最广泛的算法之一。在这里我提供一个使用CPU+TensorFlow2.X实现人脸识别的简单示例,数据集采用Yale_64x64.mat。 首先,我们需要导入必要的库和数据集。在这个示例中,我们将使用NumPy和TensorFlow作为我们的主要库。 ```python import numpy as np import tensorflow as tf import scipy.io as sio # 导入数据集 data = sio.loadmat('Yale_64x64.mat') X = data['fea'] Y = data['gnd'] ``` 接下来,我们需要对数据进行预处理。在这个示例中,我们将把数据集分成训练集和测试集,并进行归一化处理。 ```python # 数据预处理 n_samples = X.shape[0] n_train = int(n_samples * 0.8) # 训练集 X_train = X[:n_train] Y_train = Y[:n_train] # 测试集 X_test = X[n_train:] Y_test = Y[n_train:] # 归一化 X_train = X_train / 255. X_test = X_test / 255. ``` 接下来,我们需要定义一个CNN模型。在这个示例中,我们将使用一个简单的3层卷积神经网络。 ```python # 定义CNN模型 model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 1)), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.Flatten(), tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(15, activation='softmax') ]) ``` 接下来,我们需要编译模型并开始训练。在这个示例中,我们将使用交叉熵作为损失函数,Adam优化器作为优化器,并设置5个epochs进行训练。 ```python # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(X_train.reshape(-1, 64, 64, 1), Y_train, epochs=5) ``` 最后,我们可以使用测试集评估模型的性能。 ```python # 评估模型 test_loss, test_acc = model.evaluate(X_test.reshape(-1, 64, 64, 1), Y_test) print('Test accuracy:', test_acc) ``` 通过运行以上代码,我们可以得到一个使用CPU+TensorFlow2.X实现人脸识别的简单示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值