zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209313 《Linux内核原理与分析》第五周作业

    实验一:实验楼

    1. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
    2. 系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl

    操作

    1. 查找系统调用列表
      man syscalls
    2. 选择想要使用的系统调用:write,查到系统调用号为 4
      打开/usr/include/asm/unistd.h /usr/include/bits/syscall.h
      32位#define __NR_write 4
    3. 用man分析write
      输入指令 man 2 write
      得到write的函数原型和返回值
      ssize_t write(int fd, const void *buf, size_t count);


    4. 编写C代码:hello.c

    5. 编写内嵌汇编C代码:hello_ASM.c

    6.测试两个代码:成功,效果相同

    分析

    一、汇编代码调用系统调用的工作过程,特别是参数的传递的方式等
    替换printf的汇编代码
    // ssize_t write(int fd, const void buf, size_t count); 系统调用write的原型
    asm volatile(
    "movl $1, %%ebx; " /
    传入参数:文件描述符fd=1,标准输出stdout)/
    "movl %1, %%ecx; " /
    传入参数:要显示的字符串word/
    "movl %2, %%edx; " /
    传入参数:要显示的字符串长度 count/
    "movl $0x4, %%eax; " /
    用eax传递系统调用号:4 write()/
    "int $0x80 " /
    触发系统调用中断/
    "movl %%eax,%0; " /
    返回系统调用返回值/
    :"=m"(flag) /
    输出部分/
    :"m"(word),"r"(count) /
    输入部分:字符串和字符串长度变量*/
    :"%eax");

    总结

    总结部分需要阐明自己对“系统调用的工作机制”的理解。

    1. 实质:系统调用属于操作系统的三级接口中的第二级程序接口,且为一种软中断方式
    2. 解决的问题:为用户态提供接口调用OS的功能,屏蔽底层细节,且维护了操作系统的稳定性、可移植性和安全性
    3. 工作机制:实际上是中断程序执行的过程
      程序在调用与内核空间交互的API时,通过软中断发出中断请求,执行int指令触发中断,实现目态到管态的切换,将所需参数通过寄存器传递和返回,通过中断服务程序system_call查找中断处理程序表,找到中断程序入口,(如系统调用号在表中对应的程序入口地址),执行系统调用,并在执行完成后通过寄存器返回值,在处理完中断请求和进程调度后,返回用户态。

    遇到的问题

    1、fd文件描述符不用传入参数,直接指定终端文件就可以了
    // 0 ,1,2叫文件描述符;Linux中,每打开一个文件都有一个小的整数与之对应,就是文件描述符!
    // 0 是标准输入的 (stdin)
    // 1 是标准输出的 (stdout)
    // 2 是标准报错输出的 (stderr)
    2、size_t count要根据传入的字符串大小来赋值,一开始少赋值导致少了感叹号和换行号


    笔记一 简述

    一、方法流:分析-学习-实现

    1. 分析程序
      首先分析现有的Linux命令,了解它的功能及实现原理。能写出实现该命令的伪代码。
    2. 学习系统调用
      看程序都用到哪些系统调用,以及每个系统调用的功能(参数,返回值,错误码...)和使用方法(相关头文件,库文件,相关系统调用...)。
    3. 编程实现
      利用学到的原理和系统调用,自己编程实现原来程序所实现的功能。

    Linux中学习Linxu系统编程的方法:

    1. 问题驱动,使用man手册学习
      man -k key1|grep key2|...在manpages中搜索你要的内容
    2. 阅读.h文件: 可以通过grep -nr XXXX /usr/incldue查找相关的宏定义,结构体定义,类型定义等
    3. 解决一个问题要多个系统调用,可以参考manpages的SEE ALSO部分来得到相关系统调用的信息

    二、思考流:what、how、do

    以上3步可以通过下面3个问题来实现:

    1. 它能做什么?
    2. 它是如何实现的?
    3. 能不能自己编写一个?

    三、实现

    写程序要写三种代码:

    • 伪代码:确定你解决了问题没
    • 产品代码: 用计算机语言解决问题,伪代码是产品代码最好的注释
    • 测试代码:是不是正确的解决了问题

    笔记二:如何使用manpage

    一、manual的使用
    (一)、manual的中英文切换命令
    LANG="en_US.utf8"
    sudo apt-get install manpages-zh
    (二)、man手册结构
    1是普通的Linux命令
    2是系统调用,操作系统的提供的服务接口
    3是库函数, C语言中的函数
    5是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义
    6是给游戏留的,由各个游戏自己定义
    7是附件还有一些变量,比如向environ这种全局变量在这里就有说明
    8是系统管理用的命令,这些命令只能由root使用,如ifconfig
    (三)、man命令

    搜索命令

    man -k sort (man -k 有个等价的命令apropos)
    多关键字查找:grep 命令和管道,可以
    man -k key1 | grep key2 | grep key3 | ...

    查看命令的基本功能

    man -f cmd (等价于whatis)
    (四)系统调用列表
    man syscalls
    (五)linux 系统调用号表
    /usr/include/asm/unistd.h
    32位

    #ifndef _ASM_X86_UNISTD_32_H
    #define _ASM_X86_UNISTD_32_H 1
    
    #define __NR_restart_syscall 0
    #define __NR_exit 1
    #define __NR_fork 2
    #define __NR_read 3
    #define __NR_write 4
    #define __NR_open 5
    #define __NR_close 6
    #define __NR_waitpid 7
    #define __NR_creat 8
    #define __NR_link 9
    #define __NR_unlink 10
    #define __NR_execve 11
    #define __NR_chdir 12
    #define __NR_time 13
    #define __NR_mknod 14
    #define __NR_chmod 15
    #define __NR_lchown 16
    #define __NR_break 17
    #define __NR_oldstat 18
    #define __NR_lseek 19
    #define __NR_getpid 20
    #define __NR_mount 21
    #define __NR_umount 22
    #define __NR_setuid 23
    #define __NR_getuid 24
    #define __NR_stime 25
    #define __NR_ptrace 26
    #define __NR_alarm 27
    #define __NR_oldfstat 28
    #define __NR_pause 29
    #define __NR_utime 30
    #define __NR_stty 31
    #define __NR_gtty 32
    #define __NR_access 33
    #define __NR_nice 34
    #define __NR_ftime 35
    #define __NR_sync 36
    #define __NR_kill 37
    #define __NR_rename 38
    #define __NR_mkdir 39
    #define __NR_rmdir 40
    #define __NR_dup 41
    #define __NR_pipe 42
    #define __NR_times 43
    #define __NR_prof 44
    #define __NR_brk 45
    #define __NR_setgid 46
    #define __NR_getgid 47
    #define __NR_signal 48
    #define __NR_geteuid 49
    #define __NR_getegid 50
    #define __NR_acct 51
    #define __NR_umount2 52
    #define __NR_lock 53
    #define __NR_ioctl 54
    #define __NR_fcntl 55
    #define __NR_mpx 56
    #define __NR_setpgid 57
    #define __NR_ulimit 58
    #define __NR_oldolduname 59
    #define __NR_umask 60
    #define __NR_chroot 61
    #define __NR_ustat 62
    #define __NR_dup2 63
    #define __NR_getppid 64
    #define __NR_getpgrp 65
    #define __NR_setsid 66
    #define __NR_sigaction 67
    #define __NR_sgetmask 68
    #define __NR_ssetmask 69
    #define __NR_setreuid 70
    #define __NR_setregid 71
    #define __NR_sigsuspend 72
    #define __NR_sigpending 73
    #define __NR_sethostname 74
    #define __NR_setrlimit 75
    #define __NR_getrlimit 76
    #define __NR_getrusage 77
    #define __NR_gettimeofday 78
    #define __NR_settimeofday 79
    #define __NR_getgroups 80
    #define __NR_setgroups 81
    #define __NR_select 82
    #define __NR_symlink 83
    #define __NR_oldlstat 84
    #define __NR_readlink 85
    #define __NR_uselib 86
    #define __NR_swapon 87
    #define __NR_reboot 88
    #define __NR_readdir 89
    #define __NR_mmap 90
    #define __NR_munmap 91
    #define __NR_truncate 92
    #define __NR_ftruncate 93
    #define __NR_fchmod 94
    #define __NR_fchown 95
    #define __NR_getpriority 96
    #define __NR_setpriority 97
    #define __NR_profil 98
    #define __NR_statfs 99
    #define __NR_fstatfs 100
    #define __NR_ioperm 101
    #define __NR_socketcall 102
    #define __NR_syslog 103
    #define __NR_setitimer 104
    #define __NR_getitimer 105
    #define __NR_stat 106
    #define __NR_lstat 107
    #define __NR_fstat 108
    #define __NR_olduname 109
    #define __NR_iopl 110
    #define __NR_vhangup 111
    #define __NR_idle 112
    #define __NR_vm86old 113
    #define __NR_wait4 114
    #define __NR_swapoff 115
    #define __NR_sysinfo 116
    #define __NR_ipc 117
    #define __NR_fsync 118
    #define __NR_sigreturn 119
    #define __NR_clone 120
    #define __NR_setdomainname 121
    #define __NR_uname 122
    #define __NR_modify_ldt 123
    #define __NR_adjtimex 124
    #define __NR_mprotect 125
    #define __NR_sigprocmask 126
    #define __NR_create_module 127
    #define __NR_init_module 128
    #define __NR_delete_module 129
    #define __NR_get_kernel_syms 130
    #define __NR_quotactl 131
    #define __NR_getpgid 132
    #define __NR_fchdir 133
    #define __NR_bdflush 134
    #define __NR_sysfs 135
    #define __NR_personality 136
    #define __NR_afs_syscall 137
    #define __NR_setfsuid 138
    #define __NR_setfsgid 139
    #define __NR__llseek 140
    #define __NR_getdents 141
    #define __NR__newselect 142
    #define __NR_flock 143
    #define __NR_msync 144
    #define __NR_readv 145
    #define __NR_writev 146
    #define __NR_getsid 147
    #define __NR_fdatasync 148
    #define __NR__sysctl 149
    #define __NR_mlock 150
    #define __NR_munlock 151
    #define __NR_mlockall 152
    #define __NR_munlockall 153
    #define __NR_sched_setparam 154
    #define __NR_sched_getparam 155
    #define __NR_sched_setscheduler 156
    #define __NR_sched_getscheduler 157
    #define __NR_sched_yield 158
    #define __NR_sched_get_priority_max 159
    #define __NR_sched_get_priority_min 160
    #define __NR_sched_rr_get_interval 161
    #define __NR_nanosleep 162
    #define __NR_mremap 163
    #define __NR_setresuid 164
    #define __NR_getresuid 165
    #define __NR_vm86 166
    #define __NR_query_module 167
    #define __NR_poll 168
    #define __NR_nfsservctl 169
    #define __NR_setresgid 170
    #define __NR_getresgid 171
    #define __NR_prctl 172
    #define __NR_rt_sigreturn 173
    #define __NR_rt_sigaction 174
    #define __NR_rt_sigprocmask 175
    #define __NR_rt_sigpending 176
    #define __NR_rt_sigtimedwait 177
    #define __NR_rt_sigqueueinfo 178
    #define __NR_rt_sigsuspend 179
    #define __NR_pread64 180
    #define __NR_pwrite64 181
    #define __NR_chown 182
    #define __NR_getcwd 183
    #define __NR_capget 184
    #define __NR_capset 185
    #define __NR_sigaltstack 186
    #define __NR_sendfile 187
    #define __NR_getpmsg 188
    #define __NR_putpmsg 189
    #define __NR_vfork 190
    #define __NR_ugetrlimit 191
    #define __NR_mmap2 192
    #define __NR_truncate64 193
    #define __NR_ftruncate64 194
    #define __NR_stat64 195
    #define __NR_lstat64 196
    #define __NR_fstat64 197
    #define __NR_lchown32 198
    #define __NR_getuid32 199
    #define __NR_getgid32 200
    #define __NR_geteuid32 201
    #define __NR_getegid32 202
    #define __NR_setreuid32 203
    #define __NR_setregid32 204
    #define __NR_getgroups32 205
    #define __NR_setgroups32 206
    #define __NR_fchown32 207
    #define __NR_setresuid32 208
    #define __NR_getresuid32 209
    #define __NR_setresgid32 210
    #define __NR_getresgid32 211
    #define __NR_chown32 212
    #define __NR_setuid32 213
    #define __NR_setgid32 214
    #define __NR_setfsuid32 215
    #define __NR_setfsgid32 216
    #define __NR_pivot_root 217
    #define __NR_mincore 218
    #define __NR_madvise 219
    #define __NR_getdents64 220
    #define __NR_fcntl64 221
    #define __NR_gettid 224
    #define __NR_readahead 225
    #define __NR_setxattr 226
    #define __NR_lsetxattr 227
    #define __NR_fsetxattr 228
    #define __NR_getxattr 229
    #define __NR_lgetxattr 230
    #define __NR_fgetxattr 231
    #define __NR_listxattr 232
    #define __NR_llistxattr 233
    #define __NR_flistxattr 234
    #define __NR_removexattr 235
    #define __NR_lremovexattr 236
    #define __NR_fremovexattr 237
    #define __NR_tkill 238
    #define __NR_sendfile64 239
    #define __NR_futex 240
    #define __NR_sched_setaffinity 241
    #define __NR_sched_getaffinity 242
    #define __NR_set_thread_area 243
    #define __NR_get_thread_area 244
    #define __NR_io_setup 245
    #define __NR_io_destroy 246
    #define __NR_io_getevents 247
    #define __NR_io_submit 248
    #define __NR_io_cancel 249
    #define __NR_fadvise64 250
    #define __NR_exit_group 252
    #define __NR_lookup_dcookie 253
    #define __NR_epoll_create 254
    #define __NR_epoll_ctl 255
    #define __NR_epoll_wait 256
    #define __NR_remap_file_pages 257
    #define __NR_set_tid_address 258
    #define __NR_timer_create 259
    #define __NR_timer_settime 260
    #define __NR_timer_gettime 261
    #define __NR_timer_getoverrun 262
    #define __NR_timer_delete 263
    #define __NR_clock_settime 264
    #define __NR_clock_gettime 265
    #define __NR_clock_getres 266
    #define __NR_clock_nanosleep 267
    #define __NR_statfs64 268
    #define __NR_fstatfs64 269
    #define __NR_tgkill 270
    #define __NR_utimes 271
    #define __NR_fadvise64_64 272
    #define __NR_vserver 273
    #define __NR_mbind 274
    #define __NR_get_mempolicy 275
    #define __NR_set_mempolicy 276
    #define __NR_mq_open 277
    #define __NR_mq_unlink 278
    #define __NR_mq_timedsend 279
    #define __NR_mq_timedreceive 280
    #define __NR_mq_notify 281
    #define __NR_mq_getsetattr 282
    #define __NR_kexec_load 283
    #define __NR_waitid 284
    #define __NR_add_key 286
    #define __NR_request_key 287
    #define __NR_keyctl 288
    #define __NR_ioprio_set 289
    #define __NR_ioprio_get 290
    #define __NR_inotify_init 291
    #define __NR_inotify_add_watch 292
    #define __NR_inotify_rm_watch 293
    #define __NR_migrate_pages 294
    #define __NR_openat 295
    #define __NR_mkdirat 296
    #define __NR_mknodat 297
    #define __NR_fchownat 298
    #define __NR_futimesat 299
    #define __NR_fstatat64 300
    #define __NR_unlinkat 301
    #define __NR_renameat 302
    #define __NR_linkat 303
    #define __NR_symlinkat 304
    #define __NR_readlinkat 305
    #define __NR_fchmodat 306
    #define __NR_faccessat 307
    #define __NR_pselect6 308
    #define __NR_ppoll 309
    #define __NR_unshare 310
    #define __NR_set_robust_list 311
    #define __NR_get_robust_list 312
    #define __NR_splice 313
    #define __NR_sync_file_range 314
    #define __NR_tee 315
    #define __NR_vmsplice 316
    #define __NR_move_pages 317
    #define __NR_getcpu 318
    #define __NR_epoll_pwait 319
    #define __NR_utimensat 320
    #define __NR_signalfd 321
    #define __NR_timerfd_create 322
    #define __NR_eventfd 323
    #define __NR_fallocate 324
    #define __NR_timerfd_settime 325
    #define __NR_timerfd_gettime 326
    #define __NR_signalfd4 327
    #define __NR_eventfd2 328
    #define __NR_epoll_create1 329
    #define __NR_dup3 330
    #define __NR_pipe2 331
    #define __NR_inotify_init1 332
    #define __NR_preadv 333
    #define __NR_pwritev 334
    #define __NR_rt_tgsigqueueinfo 335
    #define __NR_perf_event_open 336
    #define __NR_recvmmsg 337
    #define __NR_fanotify_init 338
    #define __NR_fanotify_mark 339
    #define __NR_prlimit64 340
    #define __NR_name_to_handle_at 341
    #define __NR_open_by_handle_at 342
    #define __NR_clock_adjtime 343
    #define __NR_syncfs 344
    #define __NR_sendmmsg 345
    #define __NR_setns 346
    #define __NR_process_vm_readv 347
    #define __NR_process_vm_writev 348
    #define __NR_kcmp 349
    #define __NR_finit_module 350
    #define __NR_sched_setattr 351
    #define __NR_sched_getattr 352
    #define __NR_renameat2 353
    #define __NR_seccomp 354
    #define __NR_getrandom 355
    #define __NR_memfd_create 356
    #define __NR_bpf 357
    #define __NR_execveat 358
    #define __NR_socket 359
    #define __NR_socketpair 360
    #define __NR_bind 361
    #define __NR_connect 362
    #define __NR_listen 363
    #define __NR_accept4 364
    #define __NR_getsockopt 365
    #define __NR_setsockopt 366
    #define __NR_getsockname 367
    #define __NR_getpeername 368
    #define __NR_sendto 369
    #define __NR_sendmsg 370
    #define __NR_recvfrom 371
    #define __NR_recvmsg 372
    #define __NR_shutdown 373
    #define __NR_userfaultfd 374
    #define __NR_membarrier 375
    #define __NR_mlock2 376
    #define __NR_copy_file_range 377
    #define __NR_preadv2 378
    #define __NR_pwritev2 379
    
    #endif /* _ASM_X86_UNISTD_32_H */
    

    参考:

    1. 别出心裁的Linux系统调用学习法
    2. linux 系统调用号表
    3. 系统调用,API,运行库函数和C标准库函数的区别
    4. 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  • 相关阅读:
    python命令行工具模块-click
    python项目代码打包成Docker镜像
    背包九讲
    秒杀项目的3个奇数问题:并发队列的选择,请求接口的合理设计,高并发下的数据安全
    java类加载过程
    索引失效
    java面试
    进程间通信
    HashMap在Jdk1.7和1.8中的实现
    十大排序算法
  • 原文地址:https://www.cnblogs.com/assignment/p/13921922.html
Copyright © 2011-2022 走看看