目录

一、oops输出解析

二、工具

1、objdump

2、gdb

3、addr2line

4、decodecode

5、faddr2line


文档最后有完整的oops输出文件,此处将输出分成多个小块进行分析。

一、oops输出解析

[ 2620.950912] oops_tryv1:try_oops_init():37: Lets Oops!Now attempting to write something to the NULL address 0x0000000000000000
[ 2620.950919] BUG: kernel NULL pointer dereference, address: 0000000000000000
[ 2620.950922] #PF: supervisor write access in kernel mode
[ 2620.950923] #PF: error_code(0x0002) - not-present page
  • 内核指针地址:0000000000000000
  • 程序执行在:监督写模式下
  • 错误码:0x0002
[ 2620.950925] PGD 0 P4D 0
[ 2620.950927] Oops: 0002 [#1] SMP PTI
  • 0002表示特定架构的oops掩码,是非常有用的,此处的架构是x86平台

MMU设置页错误编码为特定的编码,在x86平台下

  • 0002 -> 00010   Bit 2 is 0 :内核模式  Bit 1 is 1 写 Bit 0 is 0 no page found
  • [#1]发生oops的数量,此处是1次
  • SMP:Symmetric Multi-Processing (SMP) :支持多核
  • PTI:Page Table Isolation  (页表隔离)内核中的保护机制
[ 2620.950929] CPU: 7 PID: 4959 Comm: insmod Tainted: G           OE     5.13.0-52-generic #59-Ubuntu
  • CPU 代码在执行oops错误时,发生在哪个CPU上,此处是7
  • PID:进程或线程的PID
  • Comm:进程或线程的名
  • Tainted:标志位掩码 G           OE

  • 内核版本 uname -r   5.13.0-52-generic # 后面是数字是内核编译的次数
  • G | O | E
  • G:  GPL
  • O:  out-of-tree
  • E : unsigned module

参考 https://www.kernel.org/doc/html/latest/admin-guide/taintedkernels.html.

[ 2620.950931] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/22/2020
[ 2620.950932] RIP: 0010:try_oops_init+0x88/0x1000 [oops_tryv1]
  • RIP: CPU寄存器的名字,表示要执行代码的地址,常用此地址来定位出错的地方
  • 0010:代码段
  • try_oops_init+0x88/0x1000

格式如下:
        function_name+off_from_func/size_of_func [module-name]
        0x88:表示函数开始偏移量 (字节)
        0x1000:是函数的大小

[ 2620.950937] Code: 29 4c 63 04 25 00 00 00 00 b9 32 00 00 00 48 c7 c2 30 c1 7e c0 48 c7 c6 67 c0 7e c0 48 c7 c7 72 c0 7e c0 e8 df 9f 85 f7 eb 0b <c7> 04 25 00 00 00 00 78 00 00 00 c9 31 c0 c3 00 00 00 00 00 00 00

这段代码可以用内核中的工具解析,在下文中有介绍 工具所在的位置为 scripts/decodecode 与 scripts/decode_stacktrace.sh

[ 2620.950938] RSP: 0018:ffffad3c8578bc78 EFLAGS: 00010246
[ 2620.950940] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[ 2620.950941] RDX: 0000000000000000 RSI: ffff912c741a0980 RDI: ffff912c741a0980
[ 2620.950942] RBP: ffffad3c8578bc78 R08: 0000000000000000 R09: ffffad3c8578ba68
[ 2620.950943] R10: ffffad3c8578ba60 R11: ffff912c7fec83e8 R12: ffffffffc0781000
[ 2620.950943] R13: ffff912b450a6110 R14: 0000000000000000 R15: ffffffffc07ed000
[ 2620.950945] FS:  00007f526a3a1b80(0000) GS:ffff912c74180000(0000) knlGS:0000000000000000
[ 2620.950946] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2620.950947] CR2: 0000000000000000 CR3: 0000000111048003 CR4: 00000000003706e0

寄存器信息

  • RSP 堆栈指针寄存器 指向的地址 ffffad3c8578bc78
  • EFLAGS 寄存器,包含了状态标志信息
  • Code Segment (CS) 代码段寄存器0x0010

控制寄存器

  • x86_64有16个 CR0 ~ CR15 ,(11个是保留的 CR1 CR5-CR7 CR9-CR15)
  • CR0:可以编程,包含控制位,如保护模式启用、模拟、写保护、对齐掩码、缓存禁用、分页等。
  • CR2:包含KVA,当访问时,它会导致MMU引发导致Oops的页面错误.此处的地址在上面出现过。
  • CR3:位掩码,保存页表的物理地址,实际上,它告诉MMU如何获取运行上下文的分页表。
  • CR4:各种控制位 (PAE)  (PCE)   (SMEP) (SMAP)
[ 2620.950969] Call Trace:
[ 2620.950971]  <TASK>
[ 2620.950974]  do_one_initcall+0x48/0x1d0
[ 2620.950978]  ? kmem_cache_alloc_trace+0xfb/0x240
[ 2620.950984]  do_init_module+0x52/0x270
[ 2620.950987]  load_module+0xa8f/0xb10
[ 2620.950989]  __do_sys_finit_module+0xc2/0x120
[ 2620.950992]  __x64_sys_finit_module+0x18/0x20
[ 2620.950994]  do_syscall_64+0x61/0xb0
[ 2620.950997]  ? fput+0x13/0x20
[ 2620.950999]  ? ksys_mmap_pgoff+0x135/0x260
[ 2620.951000]  ? exit_to_user_mode_prepare+0x37/0xb0
[ 2620.951002]  ? syscall_exit_to_user_mode+0x27/0x50
[ 2620.951004]  ? __x64_sys_mmap+0x33/0x40
[ 2620.951005]  ? do_syscall_64+0x6e/0xb0

调用栈,从下往上读,调用关系

[ 2620.951007]  entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 2620.951009] RIP: 0033:0x7f526a4c470d
[ 2620.951012] Code: 5b 41 5c c3 66 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d f3 66 0f 00 f7 d8 64 89 01 48
[ 2620.951013] RSP: 002b:00007ffd87e48ef8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 2620.951014] RAX: ffffffffffffffda RBX: 0000558a1da0b7c0 RCX: 00007f526a4c470d
[ 2620.951015] RDX: 0000000000000000 RSI: 0000558a1c698c02 RDI: 0000000000000003
[ 2620.951016] RBP: 0000000000000000 R08: 0000000000000000 R09: 00007f526a5bbc60
[ 2620.951017] R10: 0000000000000003 R11: 0000000000000246 R12: 0000558a1c698c02
[ 2620.951018] R13: 0000558a1da0b760 R14: 00007ffd87e49148 R15: 0000558a1da0b8d0
[ 2620.951019]  </TASK>
[ 2620.951020] Modules linked in: oops_tryv1(OE+) kcsan_datarace(OE) xt_conntrack nft_chain_nat xt_MASQUERADE nf_nat nf_conntrack_netlink nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 xfrm_user xfrm_algo nft_counter xt_addrtype nft_compat nf_tables libcrc32c nfnetlink br_netfilter bridge stp llc overlay vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock binfmt_misc nls_iso8859_1 intel_rapl_msr intel_rapl_common snd_ens1371 snd_ac97_codec gameport ac97_bus snd_pcm crct10dif_pclmul ghash_clmulni_intel snd_seq_midi snd_seq_midi_event snd_rawmidi aesni_intel snd_seq crypto_simd cryptd snd_seq_device snd_timer snd rapl vmw_balloon soundcore joydev input_leds serio_raw vmw_vmci mac_hid sch_fq_codel vmwgfx ttm drm_kms_helper cec rc_core fb_sys_fops syscopyarea sysfillrect sysimgblt msr parport_pc ppdev lp parport drm ip_tables x_tables autofs4 hid_generic mptspi usbhid mptscsih mptbase ahci crc32_pclmul psmouse hid e1000 libahci scsi_transport_spi pata_acpi i2c_piix4
[ 2620.951056] CR2: 0000000000000000
[ 2620.951058] ---[ end trace eabb70a32207bb48 ]---
[ 2620.951059] RIP: 0010:try_oops_init+0x88/0x1000 [oops_tryv1]
[ 2620.951061] Code: 29 4c 63 04 25 00 00 00 00 b9 32 00 00 00 48 c7 c2 30 c1 7e c0 48 c7 c6 67 c0 7e c0 48 c7 c7 72 c0 7e c0 e8 df 9f 85 f7 eb 0b <c7> 04 25 00 00 00 00 78 00 00 00 c9 31 c0 c3 00 00 00 00 00 00 00
[ 2620.951062] RSP: 0018:ffffad3c8578bc78 EFLAGS: 00010246
[ 2620.951063] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[ 2620.951064] RDX: 0000000000000000 RSI: ffff912c741a0980 RDI: ffff912c741a0980
[ 2620.951065] RBP: ffffad3c8578bc78 R08: 0000000000000000 R09: ffffad3c8578ba68
[ 2620.951066] R10: ffffad3c8578ba60 R11: ffff912c7fec83e8 R12: ffffffffc0781000
[ 2620.951067] R13: ffff912b450a6110 R14: 0000000000000000 R15: ffffffffc07ed000
[ 2620.951068] FS:  00007f526a3a1b80(0000) GS:ffff912c74180000(0000) knlGS:0000000000000000
[ 2620.951069] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2620.951070] CR2: 0000000000000000 CR3: 0000000111048003 CR4: 00000000003706e0

Modules linked:显示Oop时内核中加载的所有模块,内核模块是第三方的,当内核遇到错误时,会高度怀疑第三方模块导致的。此处oops_tryv1是出现问题的模块。OE标志在上文有介绍。

最后一行是总结 CR2的值,oop的原因:是(虚拟)地址导致


二、工具

1、objdump

//查看地址
#grep oops_tryv1 /proc/modules
oops_tryv1 24576 1 - Loading 0xffffffffc0223000 (OE+)//使用地址
#objdump -dS --adjust-vma=0xffffffffc0223000 ./oops_tryv1.ko > oops_tryv1.disas

嵌入式环境下  ${CROSS_COMPILE}objdump -dS <path/to/kernel-src/>/vmlinux > vmlinux.disas

查看oops_tryv1.disas的汇编文件

static int __init try_oops_init(void)
{
ffffffffc071b000:       e8 00 00 00 00          call   ffffffffc071b005 <init_module+0x5>
...*(int *)val = 'x';
ffffffffc071b088:       c7 04 25 00 00 00 00    movl   $0x78,0x0
ffffffffc071b08f:       78 00 00 00}
  • RIP的地址0x88
  • ffffffffc071b000 + 0x88 = ffffffffc071b088
  • 即可看到出问题的地方*(int *)val = 'x';

2、gdb

# gdb -q ./oops_tryv1.ko
Reading symbols from ./oops_tryv1.ko...
(gdb) list *try_oops_init+0x88
0x12f is in try_oops_init (/home/wy/misc/kernel/Linux-Kernel-Debugging/ch7/oops_tryv1/oops_tryv1.c:60).
55           * https://www.kernel.org/doc/Documentation/printk-formats.txt
56           */
57      } else                     // try writing to NULL
58          *(int *)val = 'x';
59
60      return 0;       /* success */
61  }
62
63  static void __exit try_oops_exit(void)
64  {

3、addr2line

将地址转化为相应的行号,可用在模块与系统启动出现的错误

使用的语法

        addr2line -e </path/to/>vmlinux -p -f <faulting_kernel_address>

-e  Set the input file name (default is a.out)

-p  Make the output easier to read for humans

-f   Show function names

# addr2line -e ./oops_tryv1.o -p -f 0x88
try_oops_init at <>/oops_tryv1/oops_tryv1.c:58//在58行的位置查看源码
# vim oops_tryv1.c
...57         } else                     // try writing to NULL58                 *(int *)val = 'x';59 60         return 0;
...

内核帮助脚本

$ objdump -d <...>/linux-5.10.60/vmlinux | <...>/linux-5.10.60/
scripts/checkstack.pl$ </path/to/>/linux-5.10.60/scripts/decode_stacktrace.sh
Usage:
<...>/linux-5.10.60/scripts/decode_stacktrace.sh -r <release> |
<vmlinux> [base path] [modules path]

4、decodecode

# /kernel/linux-5.15/scripts/decodecode < dmesg_oops_buginworkq.txt
[ 380.853996] Code: 29 4c 63 04 25 00 00 00 00 b9 32 00 00 00 48 c7 c2 78 41 22 c0 48 c7 c6 67 40 22 c0 48 c7 c7 72 40 22 c0 e8 28 90 fd cd eb 0b <c7> 04 25 00 00 00 00 78 00 00 00 48 8d 65 f0 31 c0 5b 41 5c 5d c3
All code
========0:  29 4c 63 04             sub    %ecx,0x4(%rbx,%riz,2)4:  25 00 00 00 00          and    $0x0,%eax9:  b9 32 00 00 00          mov    $0x32,%ecxe: 48 c7 c2 78 41 22 c0    mov    $0xffffffffc0224178,%rdx15:  48 c7 c6 67 40 22 c0    mov    $0xffffffffc0224067,%rsi1c:  48 c7 c7 72 40 22 c0    mov    $0xffffffffc0224072,%rdi23:  e8 28 90 fd cd          call   0xffffffffcdfd905028:    eb 0b                   jmp    0x352a:* c7 04 25 00 00 00 00    movl   $0x78,0x0        <-- trapping instruction31:  78 00 00 00 35: 48 8d 65 f0             lea    -0x10(%rbp),%rsp39:  31 c0                   xor    %eax,%eax3b: 5b                      pop    %rbx3c:  41 5c                   pop    %r123e:  5d                      pop    %rbp3f:  c3                      ret    Code starting with the faulting instruction
===========================================0:    c7 04 25 00 00 00 00    movl   $0x78,0x07:  78 00 00 00 b:  48 8d 65 f0             lea    -0x10(%rbp),%rspf:   31 c0                   xor    %eax,%eax11: 5b                      pop    %rbx12:  41 5c                   pop    %r1214:  5d                      pop    %rbp15:  c3                      ret    

汇编代码精确显示了陷阱所在的位置
*    c7 04 25 00 00 00 00     movl   $0x78,0x0        <-- trapping instruction

5、faddr2line

usage: faddr2line [--list] <object file> <func+offset>

先查看内核配置有没有开启配置文件

#grep  CONFIG_RANDOMIZE_BASE /boot/config-5.15.0-47-genericCONFIG_RANDOMIZE_BASE=y
# <>/scripts/faddr2line  ./oops_tryv1.ko try_oops_init+0x88
try_oops_init+0x88/0x100:
try_oops_init at <...>/oops_tryv1/oops_tryv1.c:58

定位到了58行

如果发现

# ./oops_tryv1.ko try_oops_init+0xdb
bad symbol size: base: 0x0000000000000000 end: 0x0000000000000000

请参考:[PATCH] scripts/faddr2line: Fix overlapping text section failures - Josh Poimboeuf

需要更新faddr2line   5.19的内核已经解决这个问题


全部的oops输出文件

2620.950912] oops_tryv1:try_oops_init():37: Lets Oops!Now attempting to write something to the NULL address 0x0000000000000000
[ 2620.950919] BUG: kernel NULL pointer dereference, address: 0000000000000000
[ 2620.950922] #PF: supervisor write access in kernel mode
[ 2620.950923] #PF: error_code(0x0002) - not-present page
[ 2620.950925] PGD 0 P4D 0
[ 2620.950927] Oops: 0002 [#1] SMP PTI
[ 2620.950929] CPU: 7 PID: 4959 Comm: insmod Tainted: G           OE     5.13.0-52-generic #59-Ubuntu
[ 2620.950931] Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 07/22/2020
[ 2620.950932] RIP: 0010:try_oops_init+0x88/0x1000 [oops_tryv1]
[ 2620.950937] Code: 29 4c 63 04 25 00 00 00 00 b9 32 00 00 00 48 c7 c2 30 c1 7e c0 48 c7 c6 67 c0 7e c0 48 c7 c7 72 c0 7e c0 e8 df 9f 85 f7 eb 0b <c7> 04 25 00 00 00 00 78 00 00 00 c9 31 c0 c3 00 00 00 00 00 00 00
[ 2620.950938] RSP: 0018:ffffad3c8578bc78 EFLAGS: 00010246
[ 2620.950940] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[ 2620.950941] RDX: 0000000000000000 RSI: ffff912c741a0980 RDI: ffff912c741a0980
[ 2620.950942] RBP: ffffad3c8578bc78 R08: 0000000000000000 R09: ffffad3c8578ba68
[ 2620.950943] R10: ffffad3c8578ba60 R11: ffff912c7fec83e8 R12: ffffffffc0781000
[ 2620.950943] R13: ffff912b450a6110 R14: 0000000000000000 R15: ffffffffc07ed000
[ 2620.950945] FS:  00007f526a3a1b80(0000) GS:ffff912c74180000(0000) knlGS:0000000000000000
[ 2620.950946] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2620.950947] CR2: 0000000000000000 CR3: 0000000111048003 CR4: 00000000003706e0
[ 2620.950969] Call Trace:
[ 2620.950971]  <TASK>
[ 2620.950974]  do_one_initcall+0x48/0x1d0
[ 2620.950978]  ? kmem_cache_alloc_trace+0xfb/0x240
[ 2620.950984]  do_init_module+0x52/0x270
[ 2620.950987]  load_module+0xa8f/0xb10
[ 2620.950989]  __do_sys_finit_module+0xc2/0x120
[ 2620.950992]  __x64_sys_finit_module+0x18/0x20
[ 2620.950994]  do_syscall_64+0x61/0xb0
[ 2620.950997]  ? fput+0x13/0x20
[ 2620.950999]  ? ksys_mmap_pgoff+0x135/0x260
[ 2620.951000]  ? exit_to_user_mode_prepare+0x37/0xb0
[ 2620.951002]  ? syscall_exit_to_user_mode+0x27/0x50
[ 2620.951004]  ? __x64_sys_mmap+0x33/0x40
[ 2620.951005]  ? do_syscall_64+0x6e/0xb0
[ 2620.951007]  entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 2620.951009] RIP: 0033:0x7f526a4c470d
[ 2620.951012] Code: 5b 41 5c c3 66 0f 1f 84 00 00 00 00 00 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d f3 66 0f 00 f7 d8 64 89 01 48
[ 2620.951013] RSP: 002b:00007ffd87e48ef8 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 2620.951014] RAX: ffffffffffffffda RBX: 0000558a1da0b7c0 RCX: 00007f526a4c470d
[ 2620.951015] RDX: 0000000000000000 RSI: 0000558a1c698c02 RDI: 0000000000000003
[ 2620.951016] RBP: 0000000000000000 R08: 0000000000000000 R09: 00007f526a5bbc60
[ 2620.951017] R10: 0000000000000003 R11: 0000000000000246 R12: 0000558a1c698c02
[ 2620.951018] R13: 0000558a1da0b760 R14: 00007ffd87e49148 R15: 0000558a1da0b8d0
[ 2620.951019]  </TASK>
[ 2620.951020] Modules linked in: oops_tryv1(OE+) kcsan_datarace(OE) xt_conntrack nft_chain_nat xt_MASQUERADE nf_nat nf_conntrack_netlink nf_conntrack nf_defrag_ipv6 nf_defrag_ipv4 xfrm_user xfrm_algo nft_counter xt_addrtype nft_compat nf_tables libcrc32c nfnetlink br_netfilter bridge stp llc overlay vsock_loopback vmw_vsock_virtio_transport_common vmw_vsock_vmci_transport vsock binfmt_misc nls_iso8859_1 intel_rapl_msr intel_rapl_common snd_ens1371 snd_ac97_codec gameport ac97_bus snd_pcm crct10dif_pclmul ghash_clmulni_intel snd_seq_midi snd_seq_midi_event snd_rawmidi aesni_intel snd_seq crypto_simd cryptd snd_seq_device snd_timer snd rapl vmw_balloon soundcore joydev input_leds serio_raw vmw_vmci mac_hid sch_fq_codel vmwgfx ttm drm_kms_helper cec rc_core fb_sys_fops syscopyarea sysfillrect sysimgblt msr parport_pc ppdev lp parport drm ip_tables x_tables autofs4 hid_generic mptspi usbhid mptscsih mptbase ahci crc32_pclmul psmouse hid e1000 libahci scsi_transport_spi pata_acpi i2c_piix4
[ 2620.951056] CR2: 0000000000000000
[ 2620.951058] ---[ end trace eabb70a32207bb48 ]---
[ 2620.951059] RIP: 0010:try_oops_init+0x88/0x1000 [oops_tryv1]
[ 2620.951061] Code: 29 4c 63 04 25 00 00 00 00 b9 32 00 00 00 48 c7 c2 30 c1 7e c0 48 c7 c6 67 c0 7e c0 48 c7 c7 72 c0 7e c0 e8 df 9f 85 f7 eb 0b <c7> 04 25 00 00 00 00 78 00 00 00 c9 31 c0 c3 00 00 00 00 00 00 00
[ 2620.951062] RSP: 0018:ffffad3c8578bc78 EFLAGS: 00010246
[ 2620.951063] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[ 2620.951064] RDX: 0000000000000000 RSI: ffff912c741a0980 RDI: ffff912c741a0980
[ 2620.951065] RBP: ffffad3c8578bc78 R08: 0000000000000000 R09: ffffad3c8578ba68
[ 2620.951066] R10: ffffad3c8578ba60 R11: ffff912c7fec83e8 R12: ffffffffc0781000
[ 2620.951067] R13: ffff912b450a6110 R14: 0000000000000000 R15: ffffffffc07ed000
[ 2620.951068] FS:  00007f526a3a1b80(0000) GS:ffff912c74180000(0000) knlGS:0000000000000000
[ 2620.951069] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 2620.951070] CR2: 0000000000000000 CR3: 0000000111048003 CR4: 00000000003706e0

Linux内核中oops 错误解析以及问题定位相关推荐

  1. Linux内核中的vfs,解析 Linux 中的 VFS 文件系统机制

    在Linux系统中,每个分区都是一个文件系统,都有自己的目录层次结构.Linux的最重要特征之一就是支持多种文件系统,这样它更加灵 活,并可以和许多其它种操作系统共存.由于系统已将Linux文件系统的 ...

  2. 【Linux 内核】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 )

    文章目录 一.进程特殊形式 ( 内核线程 | 用户线程 ) 二.C 标准库与 Linux 内核中进程相关概念 三.Linux 查看进程命令及输出字段解析 一.进程特殊形式 ( 内核线程 | 用户线程 ...

  3. linux内核中的 哈希表_Linux内核中的设备模型及SCSI示例解析

    关于硬件架构 想要了解Linux操作系统的内核设备和驱动模型,最好先了解一下现在计算机硬件的架构.对计算机硬件有一定了解之后,对理解Linux内核中的设备和驱动模型非常有帮助.如图1是常规计算机的硬件 ...

  4. Linux内核中的内存管理(图例解析)

    一 ,内核管理内存的方式 (1)内核把物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理,所以,从虚拟内存角度来看,页就是最小单位. 大多数32位系统支持4kb的页,64位系统支持8kb ...

  5. 关于linux内核中jiffies和jiffies_64解析

    1.前言 linux内核中定义了jiffies变量来记录从系统启动到当前时刻系统时钟所产生的tick数.jiffies变量是一个无符号整型数值,即unsigned long类型.     它的声明如下 ...

  6. Linux内核中内存管理相关配置项的详细解析3

    接前一篇文章:Linux内核中内存管理相关配置项的详细解析2 5. 2:1 compression allocator (zbud) 对应配置变量为:CONFIG_ZBUD. 此项默认为选中(如果前一 ...

  7. Linux内核中makefile有什么作用?深入解析makefile工作过程和原理

    Table of Contents Makefile 中的变量 常用的变量有以下几类: 1) 版本信息 2) CPU 体系结构:ARCH 3) 路径信息:TOPDIR, SUBDIRS 4) 内核组成 ...

  8. linux内核中锁有哪些,Linux内核中有哪些锁

    Linux内核中的各种锁 在LInux操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问.尤其是在多处理器系统上,更需 ...

  9. linux内核中的copy_to_user和copy_from_user(一)

    linux内核中的copy_to_user和copy_from_user(一) 2017年12月21日 20:07:32 prike 阅读数:4768 linux内核中的copy_to_user和co ...

最新文章

  1. 软件中常用的“发送邮件”、“打印文档”,其本质是“队列”!
  2. mongodb的监控与性能优化
  3. jQuery源码分析系列
  4. Xorequ(BZOJ3329+数位DP+斐波那契数列)
  5. html中的expand属性,expand的用法总结大全
  6. 第十一届河南省赛--H : Attack City and Capture Territory
  7. 分布式与人工智能课程(part3)--第三课
  8. Java日志操作总结
  9. wampserver php乱码,WampServer搭建php环境可能遇到的问题
  10. 天然纤维复合材料行业调研报告 - 市场现状分析与发展前景预测
  11. expdp 简单例子
  12. 利用多线程提高程序性能(for Android)
  13. Lync和Exchange 2013集成PART1:准备所需证书
  14. 文件那些事儿之一(初稿)
  15. c#SqlServer总结
  16. 遥感水文前景_遥感水文
  17. 【WLAN】【基础知识】WIFI那些事儿之Beamforming
  18. 单片机测试开发板用什么软件,怎么知道单片机开发板的好坏
  19. 基于JAVA学生成绩管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  20. mysql的append用法_insert 中append 用法详解

热门文章

  1. 大功率IGBT驱动保护
  2. rk3399pro-EVB开发板源码编译opencv4.5.1
  3. 单片机外设(ram、寄存器)地址详解
  4. 【详解】IIC通讯上拉电阻的选择和计算公式
  5. GCP---Big Data大数据
  6. NLP-预训练模型-2019:XLM-Roberta【一种多语言预训练模型】
  7. 数字与能源,交织成新基建的摩比斯环
  8. c# 彩色图片变为黑白图片
  9. 人机博弈-吃跳棋游戏(三)代移动
  10. SEO优化|2018年百度算法一览