练习一:理解通过make生成执行文件的过程。

题目:

列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关键知识点。

在此练习中,大家需要通过静态分析代码来了解:
1.操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
补充材料:
如何调试Makefile
当执行make时,一般只会显示输出,不会显示make到底执行了哪些命令。
如想了解make执行了哪些命令,可以执行:
$ make “V=”
要获取更多有关make的信息,可上网查询,并请执行
$ man make

1.操作系统镜像文件ucore.img是如何一步一步生成的?

查看makefile文件

PROJ := challenge
EMPTY   :=
SPACE   := $(EMPTY) $(EMPTY)
SLASH   := /V       := @
#need llvm/cang-3.5+
#USELLVM := 1
# try to infer the correct GCCPREFX
ifndef GCCPREFIX
GCCPREFIX := $(shell if i386-elf-objdump -i 2>&1 | grep '^elf32-i386$$' >/dev/null 2>&1; \then echo 'i386-elf-'; \elif objdump -i 2>&1 | grep 'elf32-i386' >/dev/null 2>&1; \then echo ''; \else echo "***" 1>&2; \echo "*** Error: Couldn't find an i386-elf version of GCC/binutils." 1>&2; \echo "*** Is the directory with i386-elf-gcc in your PATH?" 1>&2; \echo "*** If your i386-elf toolchain is installed with a command" 1>&2; \echo "*** prefix other than 'i386-elf-', set your GCCPREFIX" 1>&2; \echo "*** environment variable to that prefix and run 'make' again." 1>&2; \echo "*** To turn off this error, run 'gmake GCCPREFIX= ...'." 1>&2; \echo "***" 1>&2; exit 1; fi)
endif# try to infer the correct QEMU
ifndef QEMU
QEMU := $(shell if which qemu-system-i386 > /dev/null; \then echo 'qemu-system-i386'; exit; \elif which i386-elf-qemu > /dev/null; \then echo 'i386-elf-qemu'; exit; \elif which qemu > /dev/null; \then echo 'qemu'; exit; \else \echo "***" 1>&2; \echo "*** Error: Couldn't find a working QEMU executable." 1>&2; \echo "*** Is the directory containing the qemu binary in your PATH" 1>&2; \echo "***" 1>&2; exit 1; fi)
endif# eliminate default suffix rules
.SUFFIXES: .c .S .h# delete target files if there is an error (or make is interrupted)
.DELETE_ON_ERROR:# define compiler and flags
ifndef  USELLVM
HOSTCC      := gcc
HOSTCFLAGS  := -g -Wall -O2
CC      := $(GCCPREFIX)gcc
CFLAGS  := -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc $(DEFS)
CFLAGS  += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
else
HOSTCC      := clang
HOSTCFLAGS  := -g -Wall -O2
CC      := clang
CFLAGS  := -march=i686 -fno-builtin -fno-PIC -Wall -g -m32 -nostdinc $(DEFS)
CFLAGS  += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector)
endifCTYPE  := c SLD      := $(GCCPREFIX)ld
LDFLAGS := -m $(shell $(LD) -V | grep elf_i386 2>/dev/null | head -n 1)
LDFLAGS += -nostdlibOBJCOPY := $(GCCPREFIX)objcopy
OBJDUMP := $(GCCPREFIX)objdumpCOPY := cp
MKDIR   := mkdir -p
MV      := mv
RM      := rm -f
AWK     := awk
SED     := sed
SH      := sh
TR      := tr
TOUCH   := touch -cOBJDIR  := obj
BINDIR  := binALLOBJS  :=
ALLDEPS :=
TARGETS :=include tools/function.mklistf_cc = $(call listf,$(1),$(CTYPE))# for cc
add_files_cc = $(call add_files,$(1),$(CC),$(CFLAGS) $(3),$(2),$(4))
create_target_cc = $(call create_target,$(1),$(2),$(3),$(CC),$(CFLAGS))# for hostcc
add_files_host = $(call add_files,$(1),$(HOSTCC),$(HOSTCFLAGS),$(2),$(3))
create_target_host = $(call create_target,$(1),$(2),$(3),$(HOSTCC),$(HOSTCFLAGS))cgtype = $(patsubst %.$(2),%.$(3),$(1))
objfile = $(call toobj,$(1))
asmfile = $(call cgtype,$(call toobj,$(1)),o,asm)
outfile = $(call cgtype,$(call toobj,$(1)),o,out)
symfile = $(call cgtype,$(call toobj,$(1)),o,sym)# for match pattern
match = $(shell echo $(2) | $(AWK) '{for(i=1;i<=NF;i++){if(match("$(1)","^"$$(i)"$$")){exit 1;}}}'; echo $$?)# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# include kernel/userINCLUDE    += libs/CFLAGS    += $(addprefix -I,$(INCLUDE))LIBDIR   += libs$(call add_files_cc,$(call listf_cc,$(LIBDIR)),libs,)# -------------------------------------------------------------------
# kernelKINCLUDE    += kern/debug/ \kern/driver/ \kern/trap/ \kern/mm/KSRCDIR     += kern/init \kern/libs \kern/debug \kern/driver \kern/trap \kern/mmKCFLAGS       += $(addprefix -I,$(KINCLUDE))$(call add_files_cc,$(call listf_cc,$(KSRCDIR)),kernel,$(KCFLAGS))KOBJS = $(call read_packet,kernel libs)# create kernel target
kernel = $(call totarget,kernel)$(kernel): tools/kernel.ld$(kernel): $(KOBJS)@echo + ld $@$(V)$(LD) $(LDFLAGS) -T tools/kernel.ld -o $@ $(KOBJS)@$(OBJDUMP) -S $@ > $(call asmfile,kernel)@$(OBJDUMP) -t $@ | $(SED) '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $(call symfile,kernel)$(call create_target,kernel)# -------------------------------------------------------------------# create bootblock
bootfiles = $(call listf_cc,boot)
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))bootblock = $(call totarget,bootblock)$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign)@echo + ld $@$(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 $^ -o $(call toobj,bootblock)@$(OBJDUMP) -S $(call objfile,bootblock) > $(call asmfile,bootblock)@$(OBJCOPY) -S -O binary $(call objfile,bootblock) $(call outfile,bootblock)@$(call totarget,sign) $(call outfile,bootblock) $(bootblock)$(call create_target,bootblock)# -------------------------------------------------------------------# create 'sign' tools
$(call add_files_host,tools/sign.c,sign,sign)
$(call create_target_host,sign,sign)# -------------------------------------------------------------------# create ucore.img
UCOREIMG    := $(call totarget,ucore.img)$(UCOREIMG): $(kernel) $(bootblock)$(V)dd if=/dev/zero of=$@ count=10000$(V)dd if=$(bootblock) of=$@ conv=notrunc$(V)dd if=$(kernel) of=$@ seek=1 conv=notrunc$(call create_target,ucore.img)# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$(call finish_all)IGNORE_ALLDEPS  = clean \dist-clean \grade \touch \print-.+ \handinifeq ($(call match,$(MAKECMDGOALS),$(IGNORE_ALLDEPS)),0)
-include $(ALLDEPS)
endif# files for grade scriptTARGETS: $(TARGETS).DEFAULT_GOAL := TARGETS.PHONY: qemu qemu-nox debug debug-nox
qemu-mon: $(UCOREIMG)$(V)$(QEMU)  -no-reboot -monitor stdio -hda $< -serial null
qemu: $(UCOREIMG)$(V)$(QEMU) -no-reboot -parallel stdio -hda $< -serial null
log: $(UCOREIMG)$(V)$(QEMU) -no-reboot -d int,cpu_reset  -D q.log -parallel stdio -hda $< -serial null
qemu-nox: $(UCOREIMG)$(V)$(QEMU)   -no-reboot -serial mon:stdio -hda $< -nographic
TERMINAL        :=gnome-terminal
debug: $(UCOREIMG)$(V)$(QEMU) -S -s -parallel stdio -hda $< -serial null &$(V)sleep 2$(V)$(TERMINAL) -e "gdb -q -tui -x tools/gdbinit"debug-nox: $(UCOREIMG)$(V)$(QEMU) -S -s -serial mon:stdio -hda $< -nographic &$(V)sleep 2$(V)$(TERMINAL) -e "gdb -q -x tools/gdbinit".PHONY: grade touchGRADE_GDB_IN    := .gdb.in
GRADE_QEMU_OUT  := .qemu.out
HANDIN          := proj$(PROJ)-handin.tar.gzTOUCH_FILES        := kern/trap/trap.cMAKEOPTS        := --quiet --no-print-directorygrade:$(V)$(MAKE) $(MAKEOPTS) clean$(V)$(SH) tools/grade.shtouch:$(V)$(foreach f,$(TOUCH_FILES),$(TOUCH) $(f))print-%:@echo $($(shell echo $(patsubst print-%,%,$@) | $(TR) [a-z] [A-Z])).PHONY: clean dist-clean handin packall tags
clean:$(V)$(RM) $(GRADE_GDB_IN) $(GRADE_QEMU_OUT) cscope* tags-$(RM) -r $(OBJDIR) $(BINDIR)dist-clean: clean-$(RM) $(HANDIN)handin: packall@echo Please visit http://learn.tsinghua.edu.cn and upload $(HANDIN). Thanks!packall: clean@$(RM) -f $(HANDIN)@tar -czf $(HANDIN) `find . -type f -o -type d | grep -v '^\.*$$' | grep -vF '$(HANDIN)'`tags:@echo TAGS ALL$(V)rm -f cscope.files cscope.in.out cscope.out cscope.po.out tags$(V)find . -type f -name "*.[chS]" >cscope.files$(V)cscope -bq $(V)ctags -L cscope.files

总结ucore.img的生成过程

1.设置环境变量、编译选项等,主要先设置了libs和kern目录下的obj文件名,两者合并即为$(KOBJS)。
2.生成kernel文件,
3.生成bootblock,
4.生成sign工具,
5.最后生成ucore.img。

使用 make “V=” 命令查看具体操作。

make "V="

查看具体操作的内容:

+ cc kern/init/init.c
gcc -Ikern/init/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/init/init.c -o obj/kern/init/init.o
+ cc kern/libs/stdio.c
gcc -Ikern/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/libs/stdio.c -o obj/kern/libs/stdio.o
+ cc kern/libs/readline.c
gcc -Ikern/libs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/libs/readline.c -o obj/kern/libs/readline.o
+ cc kern/debug/panic.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/panic.c -o obj/kern/debug/panic.o
+ cc kern/debug/kdebug.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/kdebug.c -o obj/kern/debug/kdebug.o
+ cc kern/debug/kmonitor.c
gcc -Ikern/debug/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/kmonitor.c -o obj/kern/debug/kmonitor.o
+ cc kern/driver/clock.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/clock.c -o obj/kern/driver/clock.o
+ cc kern/driver/console.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/console.c -o obj/kern/driver/console.o
+ cc kern/driver/picirq.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/picirq.c -o obj/kern/driver/picirq.o
+ cc kern/driver/intr.c
gcc -Ikern/driver/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/intr.c -o obj/kern/driver/intr.o
+ cc kern/trap/trap.c
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/trap.c -o obj/kern/trap/trap.o
+ cc kern/trap/vectors.S
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/vectors.S -o obj/kern/trap/vectors.o
+ cc kern/trap/trapentry.S
gcc -Ikern/trap/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/trapentry.S -o obj/kern/trap/trapentry.o
+ cc kern/mm/pmm.c
gcc -Ikern/mm/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/mm/pmm.c -o obj/kern/mm/pmm.o
+ cc libs/string.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/  -c libs/string.c -o obj/libs/string.o
+ cc libs/printfmt.c
gcc -Ilibs/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/  -c libs/printfmt.c -o obj/libs/printfmt.o
+ ld bin/kernel
ld -m    elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel  obj/kern/init/init.o obj/kern/libs/stdio.o obj/kern/libs/readline.o obj/kern/debug/panic.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/picirq.o obj/kern/driver/intr.o obj/kern/trap/trap.o obj/kern/trap/vectors.o obj/kern/trap/trapentry.o obj/kern/mm/pmm.o  obj/libs/string.o obj/libs/printfmt.o
+ cc boot/bootasm.S
gcc -Iboot/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootasm.S -o obj/boot/bootasm.o
+ cc boot/bootmain.c
gcc -Iboot/ -march=i686 -fno-builtin -fno-PIC -Wall -ggdb -m32 -gstabs -nostdinc  -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootmain.c -o obj/boot/bootmain.o
+ cc tools/sign.c
gcc -Itools/ -g -Wall -O2 -c tools/sign.c -o obj/sign/tools/sign.o
gcc -g -Wall -O2 obj/sign/tools/sign.o -o bin/sign
+ ld bin/bootblock
ld -m    elf_i386 -nostdlib -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o
'obj/bootblock.out' size: 484 bytes
build 512 bytes boot sector: 'bin/bootblock' success!
dd if=/dev/zero of=bin/ucore.img count=10000
dd if=bin/bootblock of=bin/ucore.img conv=notrunc
dd if=bin/kernel of=bin/ucore.img seek=1 conv=notrunc

每一个指令下都是具体执行的shell命令,gcc就是指使用gcc编译器编译,现在来比较详细地解释Makefile中每一条相关命令和命令参数的含义及其导致的结果。

-I(大写的i) 可指定查找include文件的其他位置.例如,如果有些include文件位于比较特殊的地方。

-g 生成gdb的调试信息

-Wall 以最高级别使用GNU编译程序,专门用于显示警告用!

-o 制定目标名称, 默认的时候, gcc 编译出来的文件是 a.out

-march 设置CPU类型,可以选择 i8086, i186, i286, i386, i486,等

-fno-stack-protector 不生成栈溢出保护

-m32 编译生成32位程序

ld -m    elf_i386 -nostdlib -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o

ld 通过运行C的编译器来运行链接程序生成

dd if=bin/kernel of=bin/ucore.img seek=1 conv=notrunc

使用指定大小拷贝一个文件

2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

查看sign.c文件内容

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>int
main(int argc, char *argv[]) {struct stat st;if (argc != 3) {fprintf(stderr, "Usage: <input filename> <output filename>\n");return -1;}if (stat(argv[1], &st) != 0) {fprintf(stderr, "Error opening file '%s': %s\n", argv[1], strerror(errno));return -1;}printf("'%s' size: %lld bytes\n", argv[1], (long long)st.st_size);if (st.st_size > 510) {fprintf(stderr, "%lld >> 510!!\n", (long long)st.st_size);return -1;}char buf[512];memset(buf, 0, sizeof(buf));FILE *ifp = fopen(argv[1], "rb");int size = fread(buf, 1, st.st_size, ifp);if (size != st.st_size) {fprintf(stderr, "read '%s' error, size is %d.\n", argv[1], size);return -1;}fclose(ifp);buf[510] = 0x55;buf[511] = 0xAA;FILE *ofp = fopen(argv[2], "wb+");size = fwrite(buf, 1, 512, ofp);if (size != 512) {fprintf(stderr, "write '%s' error, size is %d.\n", argv[2], size);return -1;}fclose(ofp);printf("build 512 bytes boot sector: '%s' success!\n", argv[2]);return 0;
}

从文件中这三行代码我们可以得出答案。

char buf[512];buf[510] = 0x55;
buf[511] = 0xAA;

答案:

1.大小只有512字节。
2.第510个字节是0x55,第511个字节是0xAA。

lab1 练习二 https://blog.csdn.net/qq_42815549/article/details/103000511

ucore操作系统 lab1 练习一 实验报告相关推荐

  1. 操作系统第6次实验报告:使用信号

    操作系统第6次实验报告:使用信号 一.实验目的 通过编程进一步了解信号. 二.实验内容 在服务器上用Vim编写程序,完成以下两个作业: 作业1:发送SIGTERM结束子进程 int kill(pid_ ...

  2. 《ucore lab1 exercise5》实验报告

    资源 ucore在线实验指导书 我的ucore实验代码 题目:实现函数调用堆栈跟踪函数 我们需要在lab1中完成kdebug.c中函数print_stackframe的实现,可以通过函数print_s ...

  3. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  4. 操作系统生产者消费者问题实验报告

    操作系统实验报告 进程通信 1. 问题描述及需求分析: 问题描述 本次实验实现生产者和消费者之间的通信,即生产者-消费者问题.生产者一次生成一个元素放入缓冲池中,消费者一次可以从缓冲池中取出一个元素. ...

  5. 上海大学操作系统(12)实验报告分享(SHU-OS)

    SHU-OS2 SHU操作系统1实验报告(1-6) SHU操作系统2实验报告(1-8) 上大操作系统实验做起来耗时耗力,教材又是远古老物,实验起来难度较大,特此分享出来希望能够对学弟学妹们有所帮助. ...

  6. java 第六次实验_操作系统第六次实验报告——使用信号量解决哲学家进餐问题...

    0 个人信息 张樱姿 201821121038 计算1812 1 实验目的 通过编程进一步了解信号量. 2 实验内容 在服务器上用Vim编写一个程序:使用信号量解决任一个经典PV问题,测试给出结果,并 ...

  7. 操作系统读写者问题实验报告_基于S3C2410微处理器和操作系统实现光电测量仿真检测系统的设计...

    引言 动基座光电测量平台按载体的不同可分为车载.舰载.机载和星载四种.为了保证测量平台系统的可靠性和测量的准确性,平台在正式放到载体上运行之前需要进行仿真检测.目前的动基座光电测量仿真检测系统大多成本 ...

  8. 操作系统读写者问题实验报告_操作系统 37

    这里是操作系统自学笔记第37节 Hard Disk Drives 磁盘的最小单位是扇区(sector),每个sector 512 byte,是磁盘原子操作的单位:扇区编号0-n-1是address s ...

  9. 进程同步与互斥c语言实验,操作系统进程同步与互斥实验报告.doc

    PAGE PAGE 1 学 生 实 验 报 告 姓名: 年级专业班级 学号 成绩 课程名称 操作系统 实验名称 实验1 进程的同步与互斥 实验类型 验证 设计 综合 创新 [实验目的.要求] 1.通过 ...

最新文章

  1. 【作死】更新macOS Mojave后Vagrant无法使用
  2. python代码大全表解释-python操作列表的函数使用代码详解
  3. 自学python还是报班-学习Python报培训班真的有必要吗?
  4. java string 转化为date
  5. when is OData model initialized - finally found done by Framework
  6. Linux有关Shell算数运算的用法补充笔记
  7. 搭建VS2008下QT开发环境
  8. php生成网页桌面快捷方式
  9. LR录制脚本后,中文显示的是乱码,怎么解决?
  10. sql中update多表处理
  11. 黑马程序员_Java学习日记num8
  12. 皮肤变好必遵守洗脸九法
  13. 买了一个鼠标一个交换机,京东分别快递了发票
  14. 关于C#中的get与set函数
  15. @Scope注解的proxyMode的作用以及如何影响IoC容器的依赖查找
  16. mysql错误代码1064_如何解决mysql错误代码1064
  17. dne服务器没检测到有响应,设备或资源dns没检测到有响应 网络无法连接
  18. 程序猿致富之路——(投资理财篇)
  19. 网络维护和服务器面试常考题,网络维护面试题
  20. 小学生台灯哪个品牌更护眼?精选教育部认可护眼灯品牌

热门文章

  1. 医学四大期刊(NEJM,Lancet,JAMA,BMJ)
  2. Siesta行动:一起新发现的定向攻击
  3. 城市简码_如何使用简码在WordPress中添加Twitter Bootstrap CSS
  4. android中的mvp模式怎么定义,在android中使用MVP模式
  5. java获取JTextfield值_[求助]JTextfield 取值问题!
  6. c# winform 实现北通 游戏手柄 游戏摇杆二次开发 包含视觉头盔
  7. 去耦电容该如何布局布线?
  8. 使用Spring Boot Thin Launcher 打包Spring Boot项目,jar包瘦身
  9. android 挂载system 读写,android使用mount挂载/system/app为读写权限,删除或替换系统应用...
  10. erp登入显示查找服务器地址,如何查询软件的登录服务器地址