目录

  1. . 系统调用简介
  2. . Linux系统调用实现方式的演进
  3. . 通过INT 0x80中断方式进入系统调用
  4. . 通过sysenter指令方式直接进入系统调用
  5. . sysenter/sysexit编程示例
  6. . Linux SCI

1. 系统调用简介

由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口

\linux-3.15.5\arch\x86\kernel\entry_32.S

  1. syscall_call:
  2. /*
  3. 调用系统函数
  4. sys_call_table也定义在是一张由指向实现各种系统调用的内核函数的函数指针组成的表:
  5. linux-2.6.32.63\arch\x86\kernel\syscall_table_32.S
  6. ENTRY(sys_call_table)
  7. .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
  8. .long sys_exit
  9. .long ptregs_fork
  10. .long sys_read
  11. .long sys_write
  12. .long sys_open /* 5 */
  13. .long sys_close
  14. .long sys_waitpid
  15. .long sys_creat
  16. .long sys_link
  17. .long sys_unlink /* 10 */
  18. .long ptregs_execve
  19. .long sys_chdir
  20. .long sys_time
  21. .long sys_mknod
  22. .long sys_chmod /* 15 */
  23. .long sys_lchown16
  24. .long sys_ni_syscall /* old break syscall holder */
  25. .long sys_stat
  26. .long sys_lseek
  27. .long sys_getpid /* 20 */
  28. .long sys_mount
  29. .long sys_oldumount
  30. .long sys_setuid16
  31. .long sys_getuid16
  32. .long sys_stime /* 25 */
  33. .long sys_ptrace
  34. .long sys_alarm
  35. .long sys_fstat
  36. .long sys_pause
  37. .long sys_utime /* 30 */
  38. .long sys_ni_syscall /* old stty syscall holder */
  39. .long sys_ni_syscall /* old gtty syscall holder */
  40. .long sys_access
  41. .long sys_nice
  42. .long sys_ni_syscall /* 35 - old ftime syscall holder */
  43. .long sys_sync
  44. .long sys_kill
  45. .long sys_rename
  46. .long sys_mkdir
  47. .long sys_rmdir /* 40 */
  48. .long sys_dup
  49. .long sys_pipe
  50. .long sys_times
  51. .long sys_ni_syscall /* old prof syscall holder */
  52. .long sys_brk /* 45 */
  53. .long sys_setgid16
  54. .long sys_getgid16
  55. .long sys_signal
  56. .long sys_geteuid16
  57. .long sys_getegid16 /* 50 */
  58. .long sys_acct
  59. .long sys_umount /* recycled never used phys() */
  60. .long sys_ni_syscall /* old lock syscall holder */
  61. .long sys_ioctl
  62. .long sys_fcntl /* 55 */
  63. .long sys_ni_syscall /* old mpx syscall holder */
  64. .long sys_setpgid
  65. .long sys_ni_syscall /* old ulimit syscall holder */
  66. .long sys_olduname
  67. .long sys_umask /* 60 */
  68. .long sys_chroot
  69. .long sys_ustat
  70. .long sys_dup2
  71. .long sys_getppid
  72. .long sys_getpgrp /* 65 */
  73. .long sys_setsid
  74. .long sys_sigaction
  75. .long sys_sgetmask
  76. .long sys_ssetmask
  77. .long sys_setreuid16 /* 70 */
  78. .long sys_setregid16
  79. .long sys_sigsuspend
  80. .long sys_sigpending
  81. .long sys_sethostname
  82. .long sys_setrlimit /* 75 */
  83. .long sys_old_getrlimit
  84. .long sys_getrusage
  85. .long sys_gettimeofday
  86. .long sys_settimeofday
  87. .long sys_getgroups16 /* 80 */
  88. .long sys_setgroups16
  89. .long old_select
  90. .long sys_symlink
  91. .long sys_lstat
  92. .long sys_readlink /* 85 */
  93. .long sys_uselib
  94. .long sys_swapon
  95. .long sys_reboot
  96. .long sys_old_readdir
  97. .long old_mmap /* 90 */
  98. .long sys_munmap
  99. .long sys_truncate
  100. .long sys_ftruncate
  101. .long sys_fchmod
  102. .long sys_fchown16 /* 95 */
  103. .long sys_getpriority
  104. .long sys_setpriority
  105. .long sys_ni_syscall /* old profil syscall holder */
  106. .long sys_statfs
  107. .long sys_fstatfs /* 100 */
  108. .long sys_ioperm
  109. .long sys_socketcall
  110. .long sys_syslog
  111. .long sys_setitimer
  112. .long sys_getitimer /* 105 */
  113. .long sys_newstat
  114. .long sys_newlstat
  115. .long sys_newfstat
  116. .long sys_uname
  117. .long ptregs_iopl /* 110 */
  118. .long sys_vhangup
  119. .long sys_ni_syscall /* old "idle" system call */
  120. .long ptregs_vm86old
  121. .long sys_wait4
  122. .long sys_swapoff /* 115 */
  123. .long sys_sysinfo
  124. .long sys_ipc
  125. .long sys_fsync
  126. .long ptregs_sigreturn
  127. .long ptregs_clone /* 120 */
  128. .long sys_setdomainname
  129. .long sys_newuname
  130. .long sys_modify_ldt
  131. .long sys_adjtimex
  132. .long sys_mprotect /* 125 */
  133. .long sys_sigprocmask
  134. .long sys_ni_syscall /* old "create_module" */
  135. .long sys_init_module
  136. .long sys_delete_module
  137. .long sys_ni_syscall /* 130: old "get_kernel_syms" */
  138. .long sys_quotactl
  139. .long sys_getpgid
  140. .long sys_fchdir
  141. .long sys_bdflush
  142. .long sys_sysfs /* 135 */
  143. .long sys_personality
  144. .long sys_ni_syscall /* reserved for afs_syscall */
  145. .long sys_setfsuid16
  146. .long sys_setfsgid16
  147. .long sys_llseek /* 140 */
  148. .long sys_getdents
  149. .long sys_select
  150. .long sys_flock
  151. .long sys_msync
  152. .long sys_readv /* 145 */
  153. .long sys_writev
  154. .long sys_getsid
  155. .long sys_fdatasync
  156. .long sys_sysctl
  157. .long sys_mlock /* 150 */
  158. .long sys_munlock
  159. .long sys_mlockall
  160. .long sys_munlockall
  161. .long sys_sched_setparam
  162. .long sys_sched_getparam /* 155 */
  163. .long sys_sched_setscheduler
  164. .long sys_sched_getscheduler
  165. .long sys_sched_yield
  166. .long sys_sched_get_priority_max
  167. .long sys_sched_get_priority_min /* 160 */
  168. .long sys_sched_rr_get_interval
  169. .long sys_nanosleep
  170. .long sys_mremap
  171. .long sys_setresuid16
  172. .long sys_getresuid16 /* 165 */
  173. .long ptregs_vm86
  174. .long sys_ni_syscall /* Old sys_query_module */
  175. .long sys_poll
  176. .long sys_nfsservctl
  177. .long sys_setresgid16 /* 170 */
  178. .long sys_getresgid16
  179. .long sys_prctl
  180. .long ptregs_rt_sigreturn
  181. .long sys_rt_sigaction
  182. .long sys_rt_sigprocmask /* 175 */
  183. .long sys_rt_sigpending
  184. .long sys_rt_sigtimedwait
  185. .long sys_rt_sigqueueinfo
  186. .long sys_rt_sigsuspend
  187. .long sys_pread64 /* 180 */
  188. .long sys_pwrite64
  189. .long sys_chown16
  190. .long sys_getcwd
  191. .long sys_capget
  192. .long sys_capset /* 185 */
  193. .long ptregs_sigaltstack
  194. .long sys_sendfile
  195. .long sys_ni_syscall /* reserved for streams1 */
  196. .long sys_ni_syscall /* reserved for streams2 */
  197. .long ptregs_vfork /* 190 */
  198. .long sys_getrlimit
  199. .long sys_mmap_pgoff
  200. .long sys_truncate64
  201. .long sys_ftruncate64
  202. .long sys_stat64 /* 195 */
  203. .long sys_lstat64
  204. .long sys_fstat64
  205. .long sys_lchown
  206. .long sys_getuid
  207. .long sys_getgid /* 200 */
  208. .long sys_geteuid
  209. .long sys_getegid
  210. .long sys_setreuid
  211. .long sys_setregid
  212. .long sys_getgroups /* 205 */
  213. .long sys_setgroups
  214. .long sys_fchown
  215. .long sys_setresuid
  216. .long sys_getresuid
  217. .long sys_setresgid /* 210 */
  218. .long sys_getresgid
  219. .long sys_chown
  220. .long sys_setuid
  221. .long sys_setgid
  222. .long sys_setfsuid /* 215 */
  223. .long sys_setfsgid
  224. .long sys_pivot_root
  225. .long sys_mincore
  226. .long sys_madvise
  227. .long sys_getdents64 /* 220 */
  228. .long sys_fcntl64
  229. .long sys_ni_syscall /* reserved for TUX */
  230. .long sys_ni_syscall
  231. .long sys_gettid
  232. .long sys_readahead /* 225 */
  233. .long sys_setxattr
  234. .long sys_lsetxattr
  235. .long sys_fsetxattr
  236. .long sys_getxattr
  237. .long sys_lgetxattr /* 230 */
  238. .long sys_fgetxattr
  239. .long sys_listxattr
  240. .long sys_llistxattr
  241. .long sys_flistxattr
  242. .long sys_removexattr /* 235 */
  243. .long sys_lremovexattr
  244. .long sys_fremovexattr
  245. .long sys_tkill
  246. .long sys_sendfile64
  247. .long sys_futex /* 240 */
  248. .long sys_sched_setaffinity
  249. .long sys_sched_getaffinity
  250. .long sys_set_thread_area
  251. .long sys_get_thread_area
  252. .long sys_io_setup /* 245 */
  253. .long sys_io_destroy
  254. .long sys_io_getevents
  255. .long sys_io_submit
  256. .long sys_io_cancel
  257. .long sys_fadvise64 /* 250 */
  258. .long sys_ni_syscall
  259. .long sys_exit_group
  260. .long sys_lookup_dcookie
  261. .long sys_epoll_create
  262. .long sys_epoll_ctl /* 255 */
  263. .long sys_epoll_wait
  264. .long sys_remap_file_pages
  265. .long sys_set_tid_address
  266. .long sys_timer_create
  267. .long sys_timer_settime /* 260 */
  268. .long sys_timer_gettime
  269. .long sys_timer_getoverrun
  270. .long sys_timer_delete
  271. .long sys_clock_settime
  272. .long sys_clock_gettime /* 265 */
  273. .long sys_clock_getres
  274. .long sys_clock_nanosleep
  275. .long sys_statfs64
  276. .long sys_fstatfs64
  277. .long sys_tgkill /* 270 */
  278. .long sys_utimes
  279. .long sys_fadvise64_64
  280. .long sys_ni_syscall /* sys_vserver */
  281. .long sys_mbind
  282. .long sys_get_mempolicy
  283. .long sys_set_mempolicy
  284. .long sys_mq_open
  285. .long sys_mq_unlink
  286. .long sys_mq_timedsend
  287. .long sys_mq_timedreceive /* 280 */
  288. .long sys_mq_notify
  289. .long sys_mq_getsetattr
  290. .long sys_kexec_load
  291. .long sys_waitid
  292. .long sys_ni_syscall /* 285 */ /* available */
  293. .long sys_add_key
  294. .long sys_request_key
  295. .long sys_keyctl
  296. .long sys_ioprio_set
  297. .long sys_ioprio_get /* 290 */
  298. .long sys_inotify_init
  299. .long sys_inotify_add_watch
  300. .long sys_inotify_rm_watch
  301. .long sys_migrate_pages
  302. .long sys_openat /* 295 */
  303. .long sys_mkdirat
  304. .long sys_mknodat
  305. .long sys_fchownat
  306. .long sys_futimesat
  307. .long sys_fstatat64 /* 300 */
  308. .long sys_unlinkat
  309. .long sys_renameat
  310. .long sys_linkat
  311. .long sys_symlinkat
  312. .long sys_readlinkat /* 305 */
  313. .long sys_fchmodat
  314. .long sys_faccessat
  315. .long sys_pselect6
  316. .long sys_ppoll
  317. .long sys_unshare /* 310 */
  318. .long sys_set_robust_list
  319. .long sys_get_robust_list
  320. .long sys_splice
  321. .long sys_sync_file_range
  322. .long sys_tee /* 315 */
  323. .long sys_vmsplice
  324. .long sys_move_pages
  325. .long sys_getcpu
  326. .long sys_epoll_pwait
  327. .long sys_utimensat /* 320 */
  328. .long sys_signalfd
  329. .long sys_timerfd_create
  330. .long sys_eventfd
  331. .long sys_fallocate
  332. .long sys_timerfd_settime /* 325 */
  333. .long sys_timerfd_gettime
  334. .long sys_signalfd4
  335. .long sys_eventfd2
  336. .long sys_epoll_create1
  337. .long sys_dup3 /* 330 */
  338. .long sys_pipe2
  339. .long sys_inotify_init1
  340. .long sys_preadv
  341. .long sys_pwritev
  342. .long sys_rt_tgsigqueueinfo /* 335 */
  343. .long sys_perf_event_open

在entry_32.S中列出了Linux操作系统所支持的所有系统调用

2. Linux系统调用实现方式的演进

  1. . 通过INT 0x80中断方式进入系统调用
  2. .6以前的 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80) 实现的。在 x86 保护模式中,处理 INT 中断指令时
  3. ) CPU 首先从中断描述表 IDT 取出对应的门描述符
  4. ) 判断门描述符的种类
  5. ) 检查门描述符的级别 DPL INT 指令调用者的级别 CPL,当 CPL<=DPL 也就是说 INT 调用者级别高于描述符指定级别时,才能成功调用
  6. ) 根据描述符的内容,进行压栈、跳转、权限级别提升
  7. ) 内核代码执行完毕之后,调用 IRET 指令返回,IRET 指令恢复用户栈,并跳转会低级别的代码
  8. /*
  9. 在发生系统调用,由 Ring3 进入 Ring0 的这个过程浪费了不少的 CPU 周期,例如,系统调用必然需要由 Ring3 进入 Ring0,权限提升之前和之后的级别是固定的,CPL 肯定是 3,而 INT 80 的 DPL 肯定也是 3,这样 CPU 检查门描述符的 DPL 和调用者的 CPL 就是完全没必要。正是由于如此,Intel x86 CPU 从 PII 300(Family 6,Model 3,Stepping 3)之后,开始支持新的系统调用指令 sysenter/sysexit
  10. */
  11.  
  12. . 通过sysenter指令方式直接进入系统调用
  13. sysenter 指令用于由 Ring3 进入 Ring0SYSEXIT 指令用于由 Ring0 返回 Ring3。由于没有特权级别检查的处理,也没有压栈的操作,所以执行速度比 INT n/IRET 快了不少。
  14. sysentersysexit都是CPU原生支持的指令集

0x1: 不同系统调用方法的性能比较

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,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" alt="" />

Relevant Link:

  1. http://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu/

3. 通过INT 0x80中断方式进入系统调用

通过80中断(软中断)进入系统调用的方式是Linux 2.6之前的做法,关于这块的内容请参阅另一篇文章

  1. http://www.cnblogs.com/LittleHann/p/3871630.html


4. 通过sysenter指令方式直接进入系统调用

0x1: sysenter/sysexit机制简介

  1. . sysenter 指令
  2. ) 用于特权级 的用户代码调用特权级 的系统内核代码
  3. ) sysenter 指令可以在 ,, 这三个特权级别调用(Linux 中只用到了特权级 )
  4.  
  5. . SYSEXIT 指令
  6. ) 用于特权级 的系统代码返回用户空间中
  7. ) SYSEXIT 指令只能从特权级 调用

0x2: sysenter/sysexit和int n/iret的区别

  1. . sysenter/sysexit
  2. ) 目标 Ring 代码段必须是平坦模式(Flat Mode)的 4GB 的可读可执行的非一致代码段
  3. ) 目标 RING 堆栈段必须是平坦模式(Flat Mode)的 4GB 的可读可写向上扩展的栈段
  4. ) sysenter/sysexit 指令并不成对,sysenter 指令并不会把 SYSEXIT 所需的返回地址压栈,sysexit 返回的地址并不一定是 sysenter 指令的下一个指令地址。调用 sysenter/sysexit 指令地址的跳转是通过设置一组特殊寄存器实现的,这些寄存器可以通过 wrmsr 指令来设置。这些寄存器包括:
  5. 3.1) SYSENTER_CS_MSR: 用于指定要执行的 Ring 代码的代码段选择符,由它还能得出目标 Ring 所用堆栈段的段选择符
  6. 3.2) SYSENTER_EIP_MSR: 用于指定要执行的 Ring 代码的起始地址
  7. 3.3) SYSENTER_ESP_MSR: 用于指定要执行的Ring 0代码所使用的栈指针
  8.  
  9. . int n/iret
  10. ) int n/iret是成对出现的,iret 返回的地址并一定是 int n 指令的下一个指令地址

需要明白的是,不管是以前的INT 0x80中断方式进入系统调用,还是使用sysenter方式进入系统调用,对于系统调用来说,最终都是通过"sys_call_table"来根据调用号寻址,跳转到对应的系统调用处理例程里面的,所以我们对sys_call_table进行hijack replace hook不管在linux 2.4还是2.6以后都是有效的

0x3: sysenter执行流程

在 Ring3 的代码调用了 sysenter 指令之后,CPU 会做出如下的操作:

  1. . SYSENTER_CS_MSR 的值装载到 cs 寄存器
  2. .将 SYSENTER_EIP_MSR 的值装载到 eip 寄存器
  3. .将 SYSENTER_CS_MSR 的值加 (Ring0 的堆栈段描述符)装载到 ss 寄存器
  4. .将 SYSENTER_ESP_MSR 的值装载到 esp 寄存器
  5. .将特权级切换到 Ring0
  6. .如果 EFLAGS 寄存器的 VM 标志被置位,则清除该标志
  7. .开始执行指定的 Ring0 代码

0x3: sysexit执行流程

在 Ring0 代码执行完毕,调用 SYSEXIT 指令退回 Ring3 时,CPU 会做出如下操作:

  1. . SYSENTER_CS_MSR 的值加 (Ring3 的代码段描述符)装载到 cs 寄存器
  2. .将寄存器 edx 的值装载到 eip 寄存器
  3. .将 SYSENTER_CS_MSR 的值加 (Ring3 的堆栈段描述符)装载到 ss 寄存器
  4. .将寄存器 ecx 的值装载到 esp 寄存器
  5. .将特权级切换到 Ring3
  6. .继续执行 Ring3 的代码

Relevant Link:

  1. http://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu/
  2. http://chenyufei.info/blog/2007-05-12/post-070512-221011-78/
  3. http://articles.manugarg.com/systemcallinlinux2_6.html

5. sysenter/sysexit编程示例

  1. #include <stdio.h>
  2.  
  3. int pid;
  4.  
  5. int main() {
  6. __asm__(
  7. "movl $20, %eax \n"
  8. "call *%gs:0x10 \n" /* offset 0x10 is not fixed across the systems */
  9. "movl %eax, pid \n"
  10. );
  11. printf("pid is %d\n", pid);
  12. return ;
  13. }

6. Linux SCI

Linux中系统调用的实现会根据不同的架构而有所变化,而且即使在某种给定的体架构上也会不同。例如,早期的x86处理器使用了中断机制从用户空间迁移到内核空间中,不过新的IA-32处理器则提供了一些指令对这种转换进行优化(使用sysentersysexit指令)

0x1: 基于多路分解的系统调用实现

在Linux内核中,多路分解是一种很常见的逻辑架构,每个系统调用都是通过一个单一的入口点多路传入内核。eax寄存器用来标识应当调用的某个系统调用。例如,BSD(Berkeley Software Distribution)socket 调用(socket、bind、 connect 等)都与一个单独的系统调用索引(__NR_socketcall)关联在一起,不过在内核中会进行多路分解,通过另外一个参数进入适当的调用。请参看 ./linux/net/socket.c中的sys_socketcall 函数

关于BSD sys_socketcall的相关知识,请参阅另一篇文章

  1. http://www.cnblogs.com/LittleHann/p/3875451.html
  2. //搜索:2. connect() API原理

0x2: 直接内核态子函数调用实现系统调用

通过一个系统调用,将工作委托给多个其他函数,是内核前期的常见做法,内核后来移植的某些体系结构(例如IA-64、AMD64)没有实现多路分解,而是直接使用原始多路复用的子函数直接作为系统调用
例如socketcall的多路分解就演变成了直接的子函数系统调用

Relevant Link:

  1. http://www.ibm.com/developerworks/cn/linux/l-system-calls/
  2. http://blog.chinaunix.net/uid-29643701-id-4240657.html

Copyright (c) 2014 LittleHann All rights reserved

Linux Systemcall Int0x80方式、Sysenter/Sysexit Difference Comparation的更多相关文章

  1. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  2. centos shell编程4【分发系统】 服务器标准化 mkpasswd 生成密码的工具 expect讲解 expect传递参数 expect自动同步文件 expect指定host和要同步的文件 expect文件分发系统 expect自动发送密钥脚本 Linux脚本执行方式 第三十八节课

    centos shell编程4[分发系统] 服务器标准化  mkpasswd 生成密码的工具  expect讲解   expect传递参数   expect自动同步文件  expect指定host和要 ...

  3. centos LAMP第一部分-环境搭建 Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课

    centos LAMP第一部分-环境搭建  Linux软件删除方式,mysql安装,apache,PHP,apache和php结合,phpinfo页面,ldd命令 第十九节课 打命令之后可以输入: e ...

  4. mutex,thread(c++11 windows linux三种方式)

    一 c++11  windows linux三种方式 //#include <stdio.h> //#include <stdlib.h> //#include <uni ...

  5. 操作系统-中断(2)IA-32/Linux的向量中断方式

    一.Intel定义下的异常和中断 不同体系和教材往往对异常和中断有不同的定义. Intel定义:中断是一种典型的由I/O设备触发的.与当前正在执行的指令无关的异步事件:而异常是处理器执行一条指令时,由 ...

  6. Linux实现https方式访问站点

    超文本传送协议(HyperText Transfer Protocol,HTML)是一种通信协议,它允许将超文本标记语言文档从web服务器传送到wel浏览器. HTML的特点: 1.支持客户/服务器模 ...

  7. Linux 开机启动方式设置 inittab 详解,开机直接进入“命令行”模式

    Linux下的 /etc/inittab 中的英文解释: This file describes how the INIT process should set up  the system in a ...

  8. linux shell执行方式

    linux shell执行有两种方式 shell脚本以#!/bin/bash开头,执行shell时先检查首行,在内部以下列方式执行: $/bin/bash script.sh 1. 使用sh执行. $ ...

  9. 进程与线程(四) linux进程间通信的方式总结

    1概述: 上文说到,每个进程都有自己的地址空间,包括什么呢?向下生长得栈,向上生长的堆,代码段,数据段等,这些都是进程私有的,如何实现通信的呢?通信需要媒介,这个媒介很重要. 对于研发人员来说,进程不 ...

随机推荐

  1. (已解决) 未能加载文件或程序集“Newtonsoft.Json, Version=4.0.0.0, Culture=neutral,

    在项目web.config里面添加: <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4F ...

  2. BFGS方法

    今天看了 Nocedal 写的Numerical Optimization 中关于BFGS方法的介绍. BFGS方法有个近亲,叫做DFP方法.下面先介绍DFP方法. 这个方法的意图是找一种方法对Hes ...

  3. f2fs解析(十)nid 如何从nat_root中删除

    上面我们谈到了一个nid如何从free_nid中转移到node_info中去[分别有一个链表和一棵基数树搭伙做事],讲free_nid时,详细说明了free_nid中是如何进如何出的,上一篇说了nid ...

  4. codevs 3008 加工生产调度[贪心]

    3008 加工生产调度  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 某工厂收到了n个产品的订 ...

  5. es2自动发现插件

    https://www.elastic.co/guide/en/elasticsearch/plugins/current/discovery-multicast-usage.html http:// ...

  6. Runtime类及其常用方法

    每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.可以通过 getRuntime 方法获取当前运行时. 常用方法: 1.public static Runt ...

  7. 解决 Windows Update 时提示当前无法检查更新,因为未运行服务

    故障:打开“Windows Update”出现红色盾牌图标 点击“检查更新”,出现“Windows Update 当前无法检查更新,因为未运行服务.您可能需要重新启动计算机” 查看“Windows U ...

  8. mysql-5.7.14-winx64免安装版在win10下的详细配置过程

    1.配置文件 如果使用mysql的默认配置,在使用的过程中会出现很多问题,如汉字是乱码等. 在mysql的根目录(如:D:\mysql\mysql-5.7.14-winx64\)下,新建配置文件my. ...

  9. Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tool

    重装操作系统后,要重新配置Android开发环境.配置成功后,添加原本项目时却出现了错误! Android requires compiler compliance level 5.0 or 6.0. ...

  10. VC6.0读取Excel文件数据

    啰嗦一下:本人所在公司从事碟式斯特林太阳能发电设备的研发与销售.单台设备图如下: 工作原理如下:整个设备大致可分为五个部分, 1.服务器,负责气象.发电等数据存取,电.网连接等处理: 2.气象站,通过 ...