AIRobot

AIRobot quick note


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

编译freeradius报错

发表于 2019-10-25
本文字数: 1.1k 阅读时长 ≈ 1 分钟

主要报错:

error while loading shared libraries: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
解决

1
./configure --prefix=/path --enable-shared

管理员用户

1
2
vim /etc/ld.so.conf.d
ldconfig

linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边,程序连接的时候首先从这个文件里边查找,然后再到ld.so.conf的路径里边去详细找,这就是为什么修改了conf文件要重新运行一下ldconfig的原因

非管理员用户

1
2
LD_LIBRARY_PATH=...
export LD_LIBRARY_PATH

非管理员用户无权限修改,所以添加环境变量更改查找顺序。

某特殊环境下编译freeradius

openssl

1
2
3
./config --prefix=... 
make
make install

python2/3

1
2
3
./configure --prefix=... --enable-shared
make
make install

talloc

1
2
3
./configure --prefix=... 
make
make install

create devrnc

1
2
3
4
5
6
7
PATH=.../python2/bin:.../python2/include:.../python2/lib:$PATH
PATH=.../python3/bin:.../python3/include:.../python3/lib:$PATH
PATH=.../ssl/bin:.../ac/build/ssl/include:.../ac/build/ssl/lib:$PATH
LD_LIBRARY_PATH=.../python3/lib:.../ssl/lib:.../python2/lib

export PATH
export LD_LIBRARY_PATH

freeradius

1
2
3
./configure --prefix=... --with-talloc-lib-dir=... --with-talloc-include-dir=... --with-openssl-lib-dir=... --with-openssl-include-dir=...
make
make install

unsigned char和char的坑

发表于 2019-10-25
本文字数: 388 阅读时长 ≈ 1 分钟

unsigned char和char在内存中都是一字节,区别是有无符号位。

bug举例

在一次使用sunday算法时,遇到了中文内存越界的问题。
其中算法中有个计算移动量的数组move[(unsigned int)c] = xxx.
c是char类型,实际存的值是0xba。

因为符号位的存在,导致(unsigned int)c == 4294967226

总结

1
2
3
4
5
6
7
8
9
10
char c = 0xba;
unsigned char uc = 0xba;
>>> (uint8_t)c
'0xba'
>>> (unsigned int)c
4294967226
>>> (uint8_t)uc
'0xba'
>>> (unsigned int)uc
186

存bytes时用unsigned char为佳,转换时字节数匹配,uint8_t

网络协议帧格式大全

发表于 2019-10-17 分类于 network
本文字数: 4 阅读时长 ≈ 1 分钟

pdf

linux kernel likely unlikely

发表于 2019-10-10 更新于 2019-10-15 分类于 operate system
本文字数: 1.2k 阅读时长 ≈ 1 分钟

前言

  内核版本:linux 4.13

  在linux内核中,经常可以看见if( likely(x))或if( unlikely(x))语句,那么likely和unlikely是什么意思呢?本文将对likely和unlikely进行一些讨论。

likely和unlikely

参考/include/linux/compiler.h */

1
2
# define likely(x)  __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)

上述源码中采用了内建函数__builtin_expect来进行定义,即 built in function。

__builtin_expect的函数原型为long __builtin_expect (long exp, long c),返回值为完整表达式exp的值,它的作用是期望表达式exp的值等于c(如果exp == c条件成立的机会占绝大多数,那么性能将会得到提升,否则性能反而会下降)。注意, __builtin_expect (exp, c)的返回值仍是exp值本身,并不会改变exp的值。

__builtin_expect函数用来引导gcc进行条件分支预测。在一条指令执行时,由于流水线的作用,CPU可以同时完成下一条指令的取指,这样可以提高CPU的利用率。在执行条件分支指令时,CPU也会预取下一条执行,但是如果条件分支的结果为跳转到了其他指令,那CPU预取的下一条指令就没用了,这样就降低了流水线的效率。

另外,跳转指令相对于顺序执行的指令会多消耗CPU时间,如果可以尽可能不执行跳转,也可以提高CPU性能。

简单从表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(value)。

也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意思是value的值为真的可能性更大一些,那么执行if的机会大,而unlikely表示value的值为假的可能性大一些,执行else机会大一些。

加上这种修饰,编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度。

那么上述定义中为什么要使用!!符号呢?

计算机中bool逻辑只有0和1,非0即是1,当likely(x)中参数不是逻辑值时,就可以使用!!符号转化为逻辑值1或0 。比如:!!(3)=!(!(3))=!0=1,这样就把参数3转化为逻辑1了。

那么简单理解就是:

likely(x)代表x是逻辑真(1)的可能性比较大;

unlikely(x)代表x是逻辑假(0)的可能性比较大。

原链接

linux与windows双系统时间不一致的问题

发表于 2019-10-06 分类于 operate system
本文字数: 627 阅读时长 ≈ 1 分钟
  • Linux: 使用UTC(对linux就是 /etc/sysconfig/clock 中 UTC=true)

    开机: BIOS———>UTC(将BIOS中的时间看成是UTC)——(时区变化)—–>CST

    关机:CST——-(时区变化)—–>UTC——-存储到——>BIOS

  • Windows: 不使用UTC(对linux就是 /etc/sysconfig/clock 中UTC=false)

    开机: BIOS———————–>CST(将BIOS中的时间看成是CST)

    关机:CST———存储到——>BIOS

解决办法:

  1. 修改Windows的时间设定

    让 Windows 把硬件时间当作 UTC

    开始->运行->CMD,打开命令行程序(要以管理员方式),在命令行中输入下面命令并回车

    Reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
  2. 修改Sabayon,将BIOS时间作为本地时间:

    修改 /etc/conf.d/hwclock

    将其中clock=”UTC”改为clock=”local”。

    Sabayon使用gedit修改时提示出错,解决办法是 equo install vim,然后用vim来修改即可。
1…111213…26
AIRobot

AIRobot

AIRobot quick note
130 日志
15 分类
23 标签
GitHub E-Mail
Creative Commons
0%
© 2023 AIRobot | 716k | 10:51