Linux 0.11内核编译错误记录

Linux 0.11内核编译错误记录,第1张

现象1: 提示gas gld 比识别

措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.

现象2: 提示字节对齐需要是 2的倍数

措施: 具体解决方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替换align 2 为 align 4(align 3 替换为 align 8)

sed -i 's/align 2/align 4/g' boot/head.s

sed -i 's/align 3/align 8/g' boot/head.s

现象3: -fcombine-regs -mstring-insns选项不识别

措施: 此两个选项已经过时,直接去掉即可

现象4: warning 特别多

措施: 将-Wall 替换为 -w

现象5: __stack_chk_fail 未定义

措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护

现象6: main.c 中_syscall0重复定义

措施: main.c static inline _syscall0(int, fork) 去掉static即可

现象7: 提示内嵌汇编不符合语法限制

措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i 's/:"\w{2}"(,"\w{2}") )/:) /g' {} 其中's/:"\w{2}"(,"\w{2}") /:/g'

现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。

措施: nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。

现象9: build.c:(.text+0xde): undefined reference to `MAJOR'

措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude

现象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'

措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.

现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’

措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.

当你在IDC主机商购买一台系统为 Linux 服务器之后,我想大家第一时间就是对主机进行一个性能分析,这里我跟大家分享几个命令,能让大家在一分钟以内对自己的性能有一个大致的鸟解?

uptime

dmesg | tail

vmstat 1

mpstat -P ALL 1

pidstat 1

iostat -xz 1

free -m

sar -n DEV 1

sar -n TCP,ETCP 1

top

这10个命令到底是什么意思,我为大家一一解释一下:

1.uptime

# uptime

03:16:26 up 21:31, 1 user, load average: 10.02, 06.43, 09.02

在上面的例子中,平均负载显示是在不断增加的,1 分钟的值是 10,相比 15 分钟的值 09 来说是增加了。这个数字这么大就意味着有事情发生了.

2. dmesg | tail

# dmesg | tail

[  14.102501] ISO 9660 Extensions: RRIP_1991A

[  15.900216] ISO 9660 Extensions: Microsoft Joliet Level 3

[  15.900234] ISO 9660 Extensions: RRIP_1991A

[  17.030540] EXT4-fs (vda1): resizing filesystem from 5242619 to 13106939 blocks

[  17.151434] random: crng init done

[  17.151436] random: 7 urandom warning(s) missed due to ratelimiting

[  18.314268] EXT4-fs (vda1): resized filesystem to 13106939

[  20.394666] new mount options do not match the existing superblock, will be ignored

[  38.405804] ISO 9660 Extensions: Microsoft Joliet Level 3

[  38.407599] ISO 9660 Extensions: RRIP_1991A

这里展示的是最近 10 条系统消息日志,如果系统消息没有就不会展示。主要是看由于性能问题导致的错误。

3. vmstat 1

# vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r  b  swpd  free  buff  cache  si  so    bi    bo  in  cs us sy id wa st

1  0      0 324644 141184 1270628    0    0    10    40  207  431  1  1 99  0  0

0  0      0 324388 141184 1270628    0    0    0    0  130  280  1  1 98  0  0

0  0      0 324388 141184 1270628    0    0    0    0  89  169  0  0 100  0  0

0  0      0 324420 141184 1270628    0    0    0    0  118  225  1  0 99  0  0

0  0      0 324420 141184 1270628    0    0    0    32  125  254  0  0 99  1  0

1  1      0 324420 141184 1270628    0    0    0    68  96  171  0  0 96  4  0

0  0      0 324452 141184 1270628    0    0    0  184  127  166  0  1 96  3  0

^C

r: CPU 上的等待运行的可运行进程数。这个指标提供了判断 CPU 饱和度的数据,因为它不包含 I/O 等待的进程。可解释为:“r” 的值比 CPU 数大的时候就是饱和的。

free:空闲内存,单位是 k。如果这个数比较大,就说明你还有充足的空闲内存。“free -m” 和下面第 7 个命令,可以更详细的分析空闲内存的状态。

si,so:交换进来和交换出去的数据量,如果这两个值为非 0 值,那么就说明没有内存了。

us,sy,id,wa,st:这些是 CPU 时间的分解,是所有 CPU 的平均值。它们是用户时间,系统时间(内核),空闲,等待 I/O 时间,和被偷的时间(这里主要指其它的客户,或者使用 Xen,这些客户有自己独立的 *** 作域)。

4. mpstat -P ALL 1

# mpstat -P ALL 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:33:26 AM  CPU    %usr  %nice    %sys %iowait    %irq  %soft  %steal  %guest  %gnice  %idle

03:33:27 AM  all    0.00    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00  99.00

03:33:27 AM    0    0.00    0.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00  99.00

这个命令打印各个 CPU 的时间统计,可以看出整体 CPU 的使用是不是均衡的。由于我使用的是1H2G主机看不出区别!

5. pidstat 1

# pidstat 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:34:47 AM  UID      PID    %usr %system  %guest  %wait    %CPU  CPU  Command

03:34:48 AM    0      1120    1.00    0.00    0.00    0.00    1.00    0  sshd

pidstat 命令为每个 CPU 统计信息功能。由于我使用的是1H2G主机看不出区别!

6. iostat -xz 1

# iostat -xz 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

avg-cpu:  %user  %nice %system %iowait  %steal  %idle

          0.67    0.01    0.52    0.29    0.00  98.52

Device            r/s    w/s    rkB/s    wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util

loop0            0.00    0.00      0.00      0.00    0.00    0.00  0.00  0.00    0.22    0.00  0.00    9.64    0.00  0.00  0.00

scd0            0.02    0.00      0.48      0.00    0.00    0.00  0.00  0.00    0.21    0.00  0.00    27.72    0.00  0.19  0.00

vda              0.64    4.07      9.15    40.59    0.00    1.99  0.00  32.85    3.58    2.31  0.01    14.31    9.96  0.24  0.11

avg-cpu:  %user  %nice %system %iowait  %steal  %idle

          0.00    0.00    0.00    0.00    0.00  100.00

Device            r/s    w/s    rkB/s    wkB/s  rrqm/s  wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util

r/s, w/s, rkB/s, wkB/s:这些表示设备上每秒钟的读写次数和读写的字节数(单位是k字节)。这些可以看出设备的负载情况。性能问题可能就是简单的因为大量的文件加载请求。

await:I/O 等待的平均时间(单位是毫秒)。这是应用程序所等待的时间,包含了等待队列中的时间和被调度服务的时间。过大的平均等待时间就预示着设备超负荷了或者说设备有问题了。

avgqu-sz:设备上请求的平均数。数值大于 1 可能表示设备饱和了(虽然设备通常都是可以支持并行请求的,特别是在背后挂了多个磁盘的虚拟设备)。

%util:设备利用率。是使用率的百分数,展示每秒钟设备工作的时间。这个数值大于 60% 则会导致性能很低(可以在 await 中看),当然这也取决于设备特点。这个数值接近 100% 则表示设备饱和了。

7. free -m/h

ubuntu@VM-0-17-ubuntu:~# free -m

              total        used        free      shared  buff/cache  available

Mem:          1833        137        313          5        1381        1506

Swap:            0          0          0

ubuntu@VM-0-17-ubuntu:~$ free -h

              total        used        free      shared  buff/cache  available

Mem:          1.8G        139M        311M        5.8M        1.3G        1.5G

Swap:            0B          0B          0B

这个命令我相信大家都熟悉,buffers:用于块设备 I/O 缓冲的缓存,cached:用于文件系统的页缓存。

8. sar -n DEV 1

ubuntu@VM-0-17-ubuntu:~# sar -n DEV 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:43:35 AM    IFACE  rxpck/s  txpck/s    rxkB/s    txkB/s  rxcmp/s  txcmp/s  rxmcst/s  %ifutil

03:43:36 AM      eth0    11.00    10.00      0.79      1.06      0.00      0.00      0.00      0.00

03:43:36 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

使用这个工具是可以检测网络接口的吞吐:rxkB/s 和 txkB/s,作为收发数据负载的度量,也是检测是否达到收发极限。在上面这个例子中,eth0 接收数据达到 0.79 kb 字节/秒,发送数据达到1.06 字节/秒。

9. sar -n TCP,ETCP 1

ubuntu@VM-0-17-ubuntu:~# sar -n TCP,ETCP 1

Linux 4.15.0-88-generic (VM-0-17-ubuntu) 06/15/2020 _x86_64_ (1 CPU)

03:49:56 AM  active/s passive/s    iseg/s    oseg/s

03:49:57 AM      0.00      0.00      5.05      3.03

03:49:56 AM  atmptf/s  estres/s retrans/s isegerr/s  orsts/s

03:49:57 AM      0.00      0.00      0.00      0.00      0.00

这是对 TCP 关键指标的统计,它包含了以下内容:

active/s:每秒本地发起的 TCP 连接数(例如通过 connect() 发起的连接)。

passive/s:每秒远程发起的连接数(例如通过 accept() 接受的连接)。

retrans/s:每秒TCP重传数。

10. top

ubuntu@VM-0-17-ubuntu:~# top

top - 03:53:20 up 1 day,  1:41,  1 user,  load average: 0.01, 0.04, 0.00

Tasks:  89 total,  1 running,  52 sleeping,  0 stopped,  0 zombie

%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

KiB Mem :  1877076 total,  317436 free,  143420 used,  1416220 buff/cache

KiB Swap:        0 total,        0 free,        0 used.  1540856 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM    TIME+ COMMAND                                                                                     

3730 root      20  0  105688  6812  5840 S  0.3  0.4  0:00.01 sshd                                                                                         

7546 root      20  0  644608  14924  6776 S  0.3  0.8  2:48.99 YDService                                                                                   

    1 root      20  0  159892  9260  6796 S  0.0  0.5  0:06.45 systemd                                                                                     

    2 root      20  0      0      0      0 S  0.0  0.0  0:00.00 kthreadd                                                                                     

    4 root      0 -20      0      0      0 I  0.0  0.0  0:00.00 kworker/0:0H                                                                                 

    6 root      0 -20      0      0      0 I  0.0  0.0  0:00.00 mm_percpu_wq                                                                                 

    7 root      20  0      0      0      0 S  0.0  0.0  0:04.29 ksoftirqd/0                                                                                 

    8 root      20  0      0      0      0 I  0.0  0.0  0:08.85 rcu_sched                                                                                   

    9 root      20  0      0      0      0 I  0.0  0.0  0:00.00 rcu_bh                                                                                       

  10 root      rt  0      0      0      0 S  0.0  0.0  0:00.00 migration/0                                                                                 

  11 root      rt  0      0      0      0 S  0.0  0.0  0:00.16 watchdog/0                                                                                   

  12 root      20  0      0      0      0 S  0.0  0.0  0:00.00 cpuhp/0                                                                                     

  13 root      20  0      0      0      0 S  0.0  0.0  0:00.00 kdevtmpfs                                                                                   

top 命令包含了很多我们前面提到的指标。这个命令可以很容易看出指标的变化表示负载的变化,这个看起来和前面的命令有很大不同。

top 的一个缺陷也比较明显,很难看出变化趋势,其它像 vmstat 和 pidstat 这样的工具就会很清晰,它们是以滚动的方式输出统计信息。所以如果你在看到有问题的信息时没有及时的暂停下来(Ctrl-S 是暂停, Ctrl-Q 是继续),那么这些有用的信息就会被清屏。

文章原文: https://www.113p.cn/129.html  (来都来了,就去我博客看下!!)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8500126.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-17
下一篇2023-04-17

发表评论

登录后才能评论

评论列表(0条)

    保存