add some exercises for lab0
This commit is contained in:
parent
560265e426
commit
9fe50a3377
7
related_info/lab0/lab0_ex2.c
Normal file
7
related_info/lab0/lab0_ex2.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include <stdio.h>
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
printf("Hello, world!\n");
|
||||
return 0;
|
||||
}
|
6
related_info/lab0/lab0_ex2.md
Normal file
6
related_info/lab0/lab0_ex2.md
Normal file
@ -0,0 +1,6 @@
|
||||
#README
|
||||
Try below command
|
||||
```
|
||||
$gcc -g -m32 lab0_ex2.c
|
||||
```
|
||||
Then you will get a.out. Try to use gdb to debug lab0_ex2.
|
51
related_info/lab0/lab0_ex3.c
Normal file
51
related_info/lab0/lab0_ex3.c
Normal file
@ -0,0 +1,51 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#define STS_IG32 0xE // 32-bit Interrupt Gate
|
||||
#define STS_TG32 0xF // 32-bit Trap Gate
|
||||
|
||||
typedef unsigned uint32_t;
|
||||
|
||||
#define SETGATE(gate, istrap, sel, off, dpl) { \
|
||||
(gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; \
|
||||
(gate).gd_ss = (sel); \
|
||||
(gate).gd_args = 0; \
|
||||
(gate).gd_rsv1 = 0; \
|
||||
(gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \
|
||||
(gate).gd_s = 0; \
|
||||
(gate).gd_dpl = (dpl); \
|
||||
(gate).gd_p = 1; \
|
||||
(gate).gd_off_31_16 = (uint32_t)(off) >> 16; \
|
||||
}
|
||||
|
||||
/* Gate descriptors for interrupts and traps */
|
||||
struct gatedesc {
|
||||
unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment
|
||||
unsigned gd_ss : 16; // segment selector
|
||||
unsigned gd_args : 5; // # args, 0 for interrupt/trap gates
|
||||
unsigned gd_rsv1 : 3; // reserved(should be zero I guess)
|
||||
unsigned gd_type : 4; // type(STS_{TG,IG32,TG32})
|
||||
unsigned gd_s : 1; // must be 0 (system)
|
||||
unsigned gd_dpl : 2; // descriptor(meaning new) privilege level
|
||||
unsigned gd_p : 1; // Present
|
||||
unsigned gd_off_31_16 : 16; // high bits of offset in segment
|
||||
};
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
unsigned before;
|
||||
unsigned intr;
|
||||
unsigned after;
|
||||
struct gatedesc gintr;
|
||||
|
||||
intr=8;
|
||||
before=after=0;
|
||||
|
||||
gintr=*((struct gatedesc *)&intr);
|
||||
SETGATE(gintr, 0,1,2,3);
|
||||
intr=*(unsigned *)&(gintr);
|
||||
printf("intr is 0x%x\n",intr);
|
||||
printf("gintr is 0x%llx\n",gintr);
|
||||
|
||||
return 0;
|
||||
}
|
53
related_info/lab0/lab0_ex3.md
Normal file
53
related_info/lab0/lab0_ex3.md
Normal file
@ -0,0 +1,53 @@
|
||||
#README
|
||||
Try below command
|
||||
```
|
||||
gcc -g -m32 lab0_ex3.c 2>&1|tee make.log
|
||||
```
|
||||
If you get gcc's error, try to read make.log and fix the bugs.
|
||||
|
||||
If gcc successed, then you will get a.out.
|
||||
|
||||
Try to answer below question.
|
||||
|
||||
对于如下的代码段,
|
||||
```
|
||||
...
|
||||
#define STS_CG32 0xC // 32-bit Call Gate
|
||||
#define STS_IG32 0xE // 32-bit Interrupt Gate
|
||||
|
||||
#define SETGATE(gate, istrap, sel, off, dpl) { \
|
||||
(gate).gd_off_15_0 = (uint32_t)(off) & 0xffff; \
|
||||
(gate).gd_ss = (sel); \
|
||||
(gate).gd_args = 0; \
|
||||
(gate).gd_rsv1 = 0; \
|
||||
(gate).gd_type = (istrap) ? STS_TG32 : STS_IG32; \
|
||||
(gate).gd_s = 0; \
|
||||
(gate).gd_dpl = (dpl); \
|
||||
(gate).gd_p = 1; \
|
||||
(gate).gd_off_31_16 = (uint32_t)(off) >> 16; \
|
||||
}
|
||||
|
||||
/* Gate descriptors for interrupts and traps */
|
||||
struct gatedesc {
|
||||
unsigned gd_off_15_0 : 16; // low 16 bits of offset in segment
|
||||
unsigned gd_ss : 16; // segment selector
|
||||
unsigned gd_args : 5; // # args, 0 for interrupt/trap gates
|
||||
unsigned gd_rsv1 : 3; // reserved(should be zero I guess)
|
||||
unsigned gd_type : 4; // type(STS_{TG,IG32,TG32})
|
||||
unsigned gd_s : 1; // must be 0 (system)
|
||||
unsigned gd_dpl : 2; // descriptor(meaning new) privilege level
|
||||
unsigned gd_p : 1; // Present
|
||||
unsigned gd_off_31_16 : 16; // high bits of offset in segment
|
||||
};
|
||||
|
||||
...
|
||||
|
||||
```
|
||||
如果在其他代码段中有如下语句,
|
||||
```
|
||||
unsigned intr;
|
||||
intr=8;
|
||||
SETGATE(intr, 0,1,2,3);
|
||||
```
|
||||
请问执行上述指令后, intr的值是多少?
|
||||
|
Loading…
Reference in New Issue
Block a user