-
在内核中添加一个可以在用户态调用的函数
2012-12-25 10:13:02其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及...系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及提高资源利用率的作用。
Linux操作系统作为自由软件的代表,它优良的性能使得它的应用日益广泛,不仅得到专业人士的肯定,而且商业化的应用也是如火如荼。在Linux中,大部分的系统调用包含在Linux的libc库中,通过标准的C函数调用方法可以调用这些系统调用。那么,对Linux的发烧友来说,如何在Linux中增加新的系统调用呢?
1 Linux系统调用机制在Linux系统中,系统调用是作为一种异常类型实现的。它将执行相应的机器代码指令来产生异常信号。产生中断或异常的重要效果是系统自动将用户态切换为核心态来对它进行处理。这就是说,执行系统调用异常指令时,自动地将系统切换为核心态,并安排异常处理程序的执行。Linux用来实现系统调用异常的实际指令是:
Int $0x80这一指令使用中断/异常向量号128(即16进制的80)将控制权转移给内核。为达到在使用系统调用时不必用机器指令编程,在标准的C语言库中为每一系统调用提供了一段短的子程序,完成机器代码的编程工作。事实上,机器代码段非常简短。它所要做的工作只是将送给系统调用的参数加载到CPU寄存器中,接着执行int $0x80指令。然后运行系统调用,系统调用的返回值将送入CPU的一个寄存器中,标准的库子程序取得这一返回值,并将它送回用户程序。
为使系统调用的执行成为一项简单的任务,Linux提供了一组预处理宏指令。它们可以用在程序中。这些宏指令取一定的参数,然后扩展为调用指定的系统调用的函数。
这些宏指令具有类似下面的名称格式:
_syscallN(parameters)其中N是系统调用所需的参数数目,而parameters则用一组参数代替。这些参数使宏指令完成适合于特定的系统调用的扩展。例如,为了建立调用setuid()系统调用的函数,应该使用:
_syscall1( int, setuid, uid_t, uid )syscallN( )宏指令的第1个参数int说明产生的函数的返回值的类型是整型,第2个参数setuid说明产生的函数的名称。后面是系统调用所需要的每个参数。这一宏指令后面还有两个参数uid_t和uid分别用来指定参数的类型和名称。
另外,用作系统调用的参数的数据类型有一个限制,它们的容量不能超过四个字节。这是因为执行int $0x80指令进行系统调用时,所有的参数值都存在32位的CPU寄存器中。使用CPU寄存器传递参数带来的另一个限制是可以传送给系统调用的参数的数目。这个限制是最多可以传递5个参数。所以Linux一共定义了6个不同的_syscallN()宏指令,从_syscall0()、_syscall1()直到_syscall5()。
一旦_syscallN()宏指令用特定系统调用的相应参数进行了扩展,得到的结果是一个与系统调用同名的函数,它可以在用户程序中执行这一系统调用。
2 添加新的系统调用
如果用户在Linux中添加新的系统调用,应该遵循几个步骤才能添加成功,下面几个步骤详细说明了添加系统调用的相关内容。(1) 添加源代码
第一个任务是编写加到内核中的源程序,即将要加到一个内核文件中去的一个函数,该函数的名称应该是新的系统调用名称前面加上sys_标志。假设新加的系统调用为mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代码,如下所示:
asmlinkage int sys_mycall(int number){
return number;
}
作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值。
(2) 连接新的系统调用
添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在。为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件。
在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码。文件中每一行的格式如下:
#define __NR_name NNN其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码。应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号。我们的系统调用如下:
#define __NR_mycall 191系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190。
第二个要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
.long SYMBOL_NAME()该清单用来对sys_call_table[]数组进行初始化。该数组包含指向内核中每个系统调用的指针。这样就在数组中增加了新的内核函数的指针。我们在清单最后添加一行:
.long SYMBOL_NAME(sys_mycall)(3) 重建新的Linux内核
为使新的系统调用生效,需要重建Linux的内核。这需要以超级用户身份登录。
#pwd
/usr/src/linux
#超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核。
#make config
#make dep
#make clearn
#make bzImage编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:
/usr/src/linux/arch/i386/boot/bzImage
(4) 用新的内核启动系统
要使用新的系统调用,需要用重建的新内核重新引导系统。为此,需要修改/etc/lilo.conf文件,在我们的系统中,该文件内容如下:boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-onlyother=/dev/hda1
label=dos
table=/dev/had首先编辑该文件,添加新的引导内核:
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only添加完毕,该文件内容如下所示:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-onlyimage=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-onlyother=/dev/hda1
label=dos
table=/dev/hda这样,新的内核映象bzImage-new成为缺省的引导内核。为了使用新的lilo.conf配置文件,还应执行下面的命令:
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new其次配置lilo:
# /sbin/lilo
现在,当重新引导系统时,在boot:提示符后面有三种选择:linux-new 、linux、dos,新内核成为缺省的引导内核。
至此,新的Linux内核已经建立,新添加的系统调用已成为操作系统的一部分,重新启动Linux,用户就可以在应用程序中使用该系统调用了。
(5)使用新的系统调用
在应用程序中使用新添加的系统调用mycall。同样为实验目的,我们写了一个简单的例子xtdy.c。
/* xtdy.c */#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d /n",mycall(100));
}
编译该程序:
# cc -o xtdy xtdy.c执行:
# xtdy结果:
# 100注意,由于使用了系统调用,编译和执行程序时,用户都应该是超级用户身份。
-
添加内核驱动模块(6)(mydriver.c+ Konfig+Makefile )
2019-04-19 11:34:47创建数据结构,分配设备描述块,申请内核资源描述块。 填充这些描述块, 为这些设备描述块和内核资源描述块之间创建关联,赋值各个指针成员。 当SYSCALL调用驱动代码时,通过这些设备描述块,能够找到其他的需要...大多数函数和代码,是用来
创建数据结构,分配设备描述块,申请内核资源描述块。
填充这些描述块,
为这些设备描述块和内核资源描述块之间创建关联,赋值各个指针成员。
当SYSCALL调用驱动代码时,通过这些设备描述块,能够找到其他的需要的资源描述块。
最终发生硬件操作时,是由spi_write和gpio_set_value来完成的。
而发生文件系统操作时,是由fops里面的函数完成的。PMOD流程梳理:
首先是编写修饰代码,定义整个驱动的名字,提示信息等。然后是编写OFDRIVER的驱动框架。
包括PLATDRIVER的描述块,OFDEVICEID的描述块数组。以及把他们用注册宏注册到内核资源池中。
包括probe函数和remove函数的框架。调用probe函数的caller,会把它的PDEV描述块传给probe。
PDEV内含的DEV成员,它又有一个OFNODE成员,这是一个指向DEVICENODE描述块的指针。DEVICENODE是内核资源。
probe里面,分配内存,
创建PMOD描述块,创建DISP_BUF缓冲区,然后填充PMOD描述块。
创建PDATA描述块,然后填充这个PDATA描述块,创建一个PDEV描述块,然后填充这个PDEV描述块。把刚才创建的PDATA的指针填充到PDEV中。PDEV描述块,有一个成员dev,dev成员有一个platdata成员,这是一个指针,指向PDATA描述块。
填充PMOD描述块的pdev成员,这是一个指针,指向一个PDEV描述块。我们把PMOD和刚才创建的PDEV描述块关联起来。
将刚才创建的PDEV描述块注册到内核资源池中。
填充PMOD的name成员,用传入的DEVICE_NODE的name成员填充。让他和系统中的关联的DEVICE_NODE同名。
将PMOD描述块所需要的资源注册到SPIBUS中。
填充DEVICE_NODE的data成员,把PMOD描述块的指针赋值给data成员。这样,DEVICE_NODE就关联到了创建的PMOD描述块。
分配一个CDEV的ID。
创建一个CLASS描述块。这是为本模块分配的内核资源。在模块中用静态变量保存这个资源指针。
将SPIDRIVER注册到内核中。这是一个模块中的静态变量,在本模块中使用。
创建一个SPIDEVICE,并关联到PMOD描述块中的spi成员。当SPIDRIVER注册到内核中时,会调用对应的probe函数。
这个probe函数被内核调用时,内核传递一个SPI_DEVICE描述块给它。
配置了SPIDEVICE的参数。
创建了一个CDEV描述块。
初始化了GPIO。
初始化了显示缓冲区。在创建CDEV的时候,把PMOD内含的cdev成员注册到了内核资源池中。fops用的是模块内的一个静态变量。
注册了CDEV后,为CDEV在系统中添加DEVICE_NODE。 -
横瓜文件FTP下载资源搜索服务器 v3.2.zip
2019-07-17 11:39:39横瓜文件FTP下载资源搜索服务器主要用来架构图片搜索下载、视频搜索下载、图书搜索下载、软件搜索下载、电影搜索下载、MP3搜索下载、音乐搜索下载、游戏搜索下载等任何资源文件的搜索下载服务器。最大并发连接数可达... -
【安装oracle——准备工作】配置内核参数+添加用户组及用户+为oracle用户配置shell限制+创建目录结构+设置...
2013-04-15 22:45:02一、配置内核参数 为了让oracle数据服务器正常运行,必须配置一定的操作...修改内核参数的方法有好几种,比如可以通过修改/proc伪文件系统的方法动态地修改内核参数。除了修改内核参数的方法以外,/proc文件系统还含一、配置内核参数
为了让oracle数据服务器正常运行,必须配置一定的操作系统资源。默认情况下,这些资源的设置不足以满足oracle 10g数据库的正常启动与运行。不过好在linux操作系统允许动态修改这些参数,使得内核参数调整以后不用重新启动操作系统。
修改内核参数的方法有好几种,比如可以通过修改/proc伪文件系统的方法动态地修改内核参数。除了修改内核参数的方法以外,/proc文件系统还含有内核系统的性能及配置信息。
1.使用/proc伪文件系统配置内核参数
linux需要配置的参数包括信号量、共享内存、可同时打开的最大文件数以及端口号的范围。信号量参数全部保存在/proc/sys/kernel/sem文件中,分别是semmsl、semmns、semopm和semmni。这些参数的配置必须达到下面的最低标准:
参数 值 描述 semmsl 250 每个ID的最大信号数目 semmns 32000 系统中信号量的最大数目(必须大于或等于semmni*semmsl) semopm 100 每次信号量调用的最大操作次数 semmnni 128 信号量识符的最大数目 SGA的大小由/proc/sys/kernel/shmall、/proc/sys/kernel/shmmax和/proc/sys/kernel/shmmni等文件中的共享内存参数决定,这些文件描述如下:
参数 值 描述 shmall 297152 系统共享内存页面的最大数目 shmmax 内存容量的1/2 共享内存段的最大尺寸 shmmni 4096 系统共享内存段的最大数目 除此之外,需要设置的参数还包括/proc/sys/fs/file-max和/proc/sys/net/ipv4/ip_local_port_range,如下所述:
参数 值 描述 /proc/sys/fs/file-max 65536 linux分配的最大文件句柄数 /proc/sys/net/ipv4/ip_local_port_range 1024~6500 ip端口号,默认为1024~4999,只允许3975个向外的连接,但这不够oracle的使用 以上为/proc使用伪文件系统修改配置内核参数,该方法为动态地,任何时候都可以修改,但是系统每次重启时都会恢复!
修改方式:
e.g.
查看当前参数值:
cat /proc/sys/kernel/shmmax
修改参数值:
echo 2147483638 > /proc/sys/kernel/shmmax
如果希望每次启动时都能自动执行上述修改参数的命令,可以将他们写入/etc/rc.local文件,该文件与shell脚本类似:
# configuration parameters for oracle
echo "2147483638" > /proc/sys/kernel/shmmax
............
每次系统启动都会执行/etc/rc.local文件,从而可以重新设置这些参数。不过,最好的方法还是修改/etc/sysctl.conf文件。
2.使用/etc/sysctl.conf文件配置内核参数
除了前面所说的方法,还可以将参数写入/etc/sysctl.conf文件,就可以在系统启动时设置内核参数。/etc/sysctl.conf文件中包含/proc目录下的文件及其值,如下所示:
kernel.shmall = 2098152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range= 1024 65000
可以运行/sbin/sysctl -p 程序载入这些数据,并检查这些参数的设置是否正确。默认情况下,red hat linux启动时会读取这个文件,对于suse linux,则可以使用以下命令激活该文件:
/sbin/chkconfig boot.sysctl on
二、添加用户及用户组
oracle的账号必须属于oinstall用户组,并且必须是dba组的成员。
添加用户组:
groupadd oinstall
groupadd dba
添加用户账号:
useradd -g oinstall -G dba oracle
三、为oracle用户配置shell限制
提高oracle用户的shell限制,以便可以创建和打开大文件。完成这些工作需要修改/etc/profile文件,提高其中设置的上限。将下列内容添加到/etc/profile文件中:
if [ $USER = "oracle" ] ; then
if [ $SHELL = "/bin/ksh" ] ; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
此外,还需要在/etc/security/limits.conf 文件中加入以下几行内容,已修改单个用户允许使用的进程和文件数目:
*soft nproc 2047
*hard nproc 16384
*soft nofile 1024
*hard nofile 65536
最后,再修改/etc/pam.d/login文件,在其中添加下面一行代码:
sessionrequired/lib/security/pam_limits.so
四、创建目录结构
需要创建3个目录:
- oracle base 此目录作为oracle的基本目录
- oracle inventory 此目录用于oracle统一安装程序(oracle universal installer,OUI)
- oracle home 此目录用于安装某些特定的软件,通常作为oracle base的子目录
通常使用/u01、/u02 ...作为数据文件的安装点,使用opt/oracle作为oracle home目录,而oracle inventory的目录则通常为oracle_base/oraInventory
修改oracle目录权限:oracle目录的所有者应设为oracle用户,且用户组应设为oinstall,同事权限应设置为755。
e.g.
mkdir /opt/oracle
chown -R oracle.oinstall /opt/oracle
chmod -R 755 /opt/oracle
五、设置oracle环境
在安装oracle 10g时只需要在.bash_profile文件中添加以下内容:
umask 022
这个命令用来设置默认的文件创建掩码,将掩码设置为022后,创建的文件默认权限将为644,即rw-r--r--。
如果临时目录没有足够的空间,则应设置temp和tempdir环境变量:
TEMP=/u01/temp
TEMPDIR=/u01/temp
export TEMP TEMPDIR
最后是设置oracle_base和oracle_sid环境变量:
ORACLE_BASE=/opt/oracle
ORACLE_SID=orac
export ORACLE_BASE ORACLE_SID
接下来就可以安装oracle了!
——摘自Edward Whalen《基于linux平台的oracle database 10g管理》
---------------------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
-
物理机内核调优
2020-11-26 19:36:27内核调优 ulimit 优化(系统资源限制设置) vim /etc/security/limits.conf 注:①一般soft的值会比hard小,也可相等。 ②/etc/security/limits.d/里面配置会覆盖/etc/...该文件中添加 * soft nproc 65535内核调优
ulimit 优化(系统资源限制设置)
vim /etc/security/limits.conf
注:①一般soft的值会比hard小,也可相等。
②
/etc/security/limits.d/
里面配置会覆盖/etc/security/limits.conf
的配置 ③只有root用户才有权限修改/etc/security/limits.conf
④如果limits.conf没有做设定,则默认值是1024
该文件中添加
* soft nproc 65535 * hard nproc 65535 * soft nofile 65535 * hard nofile 65535 * soft memlock unlimited * hard memlock unlimited
网友的版本
* soft core unlimit * hard core unlimit * soft fsize unlimited * hard fsize unlimited * soft data unlimited * hard data unlimited * soft nproc 65535 * hard nproc 63535 * soft stack unlimited * hard stack unlimited * soft nofile 409600 * hard nofile 409600
nproc 最大进程数
nofile 最大文件打开数
* 表示修改所有用户的限制
设置限制数量,第一列表示用户,* 表示所有用户
soft nproc :单个用户可用的最大进程数量(超过会警告);
hard nproc:单个用户可用的最大进程数量(超过会报错);
soft nofile :可打开的文件描述符的最大数(超过会警告);
hard nofile :可打开的文件描述符的最大数(超过会报错);ulimit -a #查看当前系统的所有限制值
ulimit -n # 查看用户同时打开的文件数
cat /proc/sys/fs/file-max 查看Linux系统级的最大打开文件数限制
“soft” 和 “hard” 的区别
soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。 hard xxx : 代表严格的设定,不允许超过这个设定的值。
如:soft 设为1024,hard设为2048 ,则当你使用数在11024之间时可以随便使用,10242048时会出现警告信息,大于2048时,就会报错。
“nproc” 和 "nofile"的区别
nproc : 是操作系统级别对每个用户创建的进程数的限制 nofile : 是每个进程可以打开的文件数的限制
内核优化
vim /etc/sysctl.conf
在该文件中添加:
vm.swappiness = 0 fs.file-max = 655360 vm.max_map_count = 262144 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.tcp_max_orphans = 409600 net.core.netdev_max_backlog = 40960 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 1000 65000 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_retries1 = 3 net.ipv4.tcp_retries2 = 5 net.ipv4.tcp_syn_retries = 2 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 40960 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 8192 net.netfilter.nf_conntrack_max = 655350 net.netfilter.nf_conntrack_tcp_timeout_established = 1200 net.core.rmem_max = 8388608 net.core.rmem_default = 65536 net.core.wmem_max = 8388608 net.core.wmem_default = 65536 net.ipv4.tcp_mem = 8388608 8388608 8388608 net.ipv4.tcp_rmem = 4096 87380 8388608 net.ipv4.tcp_wmem = 4096 65536 8388608 net.ipv4.ip_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_max = 65536 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
sysctl -p # 保存退出之后执行,使参数永久生效
解释
vm.swappiness = 0 fs.file-max = 655360 #系统打开最大文件句柄的数量。 vm.max_map_count = 262144 #最大内存映射区域数。 net.ipv6.conf.all.disable_ipv6 = 1 #关闭ipv6 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.tcp_max_orphans = 409600 #系统中允许存在多少tcp套接字不被关联到任何一个用户文件 句柄上,可防止Dos。 net.core.netdev_max_backlog = 40960 #接口接收数据包速率大于内核处理包速率时,允许发送到队 列的数据包的最大数目。 net.ipv4.tcp_timestamps = 0 #时间戳,可以避免序列号的卷绕, 0表示关闭。 net.ipv4.tcp_tw_recycle = 0 #表示开启TCP连接快速回收, 0表示关闭。 net.ipv4.tcp_tw_reuse = 1 #表示开启重用。 net.ipv4.ip_local_port_range = 1000 65000 #tcp/udp可用的本地端口的范围。 net.ipv4.tcp_fin_timeout = 15 #保持在FIN-WAIT-2状态的时间。 net.ipv4.tcp_keepalive_time = 1200 #TCP发送keepalive消息的频率 .秒。 net.ipv4.tcp_keepalive_probes = 3 #确定该连接已经断开的次数。 net.ipv4.tcp_keepalive_intvl = 30 #内核向远程主机发送探测指针的时间间隔。 net.ipv4.tcp_synack_retries = 2 #对于远端的连接请求SYN,内核会发送SYN+ACK数据包,以确认 收到上一个SYN连接请求包。 net.ipv4.tcp_retries1 = 3 net.ipv4.tcp_retries2 = 5 net.ipv4.tcp_syn_retries = 2 #对于本机应用程序主动发起的连接超时后内核发送SYN包的重试次 数。 net.ipv4.tcp_syncookies = 1 #开启SYN Cookies,可防范少量SYN攻击。 net.core.somaxconn = 40960 #服务端所能处理数据的最大客户端数量,即完成连接上限。 net.ipv4.tcp_max_syn_backlog = 8192 #SYN同步包的最大客户端数量,即半连接上限。 net.ipv4.tcp_max_tw_buckets = 8192 #当TIME_WAIT状态的连接超出参数值的部分TCP连接导致会 服务不可用。 net.netfilter.nf_conntrack_max = 655350 #最大跟踪连接个数。 net.netfilter.nf_conntrack_tcp_timeout_established = 1200 #连接状态保留时间。 net.core.rmem_max = 8388608 #最大接收缓冲大小。 net.core.rmem_default = 65536 #默认接收缓冲大小。 net.core.wmem_max = 8388608 #最大发送缓冲大小。 net.core.wmem_default = 65536 #默认发送缓冲大小。 net.ipv4.tcp_mem = 8388608 8388608 8388608 #定义tcp协议使用的内存空间。 net.ipv4.tcp_rmem = 4096 87380 8388608 #定义tcp协议用于接收缓冲的内存空间。 net.ipv4.tcp_wmem = 4096 65536 8388608 #定义tcp协议用于发送缓冲的内存空间。
内核参数说明
/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。
配置说明:内核参数 参数说明 net.inet.tcp.sendspace=65536 最大的待发送TCP数据缓冲区空间 net.inet.tcp.recvspace=65536 最大的接受TCP缓冲区空间 net.inet.udp.sendspace=65535 最大的接受UDP缓冲区大小 net.inet.udp.maxdgram=65535 最大的发送UDP数据缓冲区大小 net.local.stream.sendspace=65535 本地套接字连接的数据发送空间 net.inet.tcp.rfc1323=1 net.inet.tcp.rfc1644=1 net.inet.tcp.rfc3042=1 net.inet.tcp.rfc3390=1 加快网络性能的协议 kern.ipc.maxsockbuf=2097152 最大的套接字缓冲区 kern.maxfiles=65536 系统中允许的最多文件数量 kern.maxfilesperproc=32768 每个进程能够同时打开的最大文件数量 net.inet.tcp.delayed_ack=0 当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。 net.inet.icmp.drop_redirect=1 net.inet.icmp.log_redirect=1 net.inet.ip.redirect=0 net.inet6.ip6.redirect=0 屏蔽ICMP重定向功能 net.inet.icmp.bmcastecho=0 net.inet.icmp.maskrepl=0 防止ICMP广播风暴 net.inet.icmp.icmplim=100 限制系统发送ICMP速率 net.inet.icmp.icmplim_output=0 net.inet.tcp.drop_synfin=1 安全参数,编译内核时加了options TCP_DROP_SYNFIN才可以用。 net.inet.tcp.always_keepalive=1 设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接 net.inet.ip.intr_queue_maxlen=1000 若看到net.inet.ip.intr_queue_drops在增加,就要调大net.inet.ip.intr_queue_maxlen,net.inet.ip.intr_queue_drops为0时最好。 net.inet.tcp.msl=7500 防止DOS攻击,默认为30000 net.inet.tcp.blackhole=2 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包 net.inet.udp.blackhole=1 接收到一个已经关闭的端口发来的所有UDP包直接drop net.inet.tcp.inflight.enable=1 为网络数据连接时提供缓冲 net.inet.ip.fastforwarding=0 如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表。 kern.polling.enable=1 kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用。 kern.ipc.somaxconn=32768 并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大。 security.bsd.see_other_uids=0 禁止用户查看其他用户的进程 kern.securelevel=0 设置kernel安全级别 net.inet.tcp.log_in_vain=1 记录下任何TCP连接 net.inet.udp.log_in_vain=1 记录下任何UDP连接 net.inet.udp.checksum=1 防止不正确的udp包的攻击 net.inet.tcp.syncookies=1 防止DOS攻击 kern.ipc.shm_use_phys=1 仅为线程提供物理内存支持,需要256兆以上内存 kern.ipc.shmmax=67108864 线程可使用的最大共享内存 kern.ipc.shmall=32768 最大线程数量 kern.coredump=0 程序崩溃时不记录 net.local.stream.recvspace=65536 net.local.dgram.maxdgram=16384 net.local.dgram.recvspace=65536 lo本地数据流接收和发送空间 net.inet.tcp.mssdflt=1460 数据包数据段大小,ADSL为1452。 net.inet.tcp.inflight_enable=1 为网络数据连接时提供缓冲 net.inet.tcp.minmss=1460 数据包数据段最小值,ADSL为1452 net.inet.raw.maxdgram=65536 本地数据最大数量 net.inet.raw.recvspace=65536 本地数据流接收空间 net.inet.ip.fw.dyn_max=65535 ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接 net.inet.ipf.fr_tcpidletimeout=864000 设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时) net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭; net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭; net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。 net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。 net.ipv4.tcp_keepalive_time = 1200 表示当启用keepalive时,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。 net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。 net.ipv4.tcp_timestamps 开启tcp时间戳
常用内核参数参考值(需要根据系统配置进行调优)
# 最大socket写buffer,可参考的优化值:873200 /proc/sys/net/core/wmem_max # 最大socket读buffer,可参考的优化值:873200 /proc/sys/net/core/rmem_max # TCP写buffer,可参考的优化值: 8192 436600 873200 /proc/sys/net/ipv4/tcp_wmem # TCP读buffer,可参考的优化值: 32768 436600 873200 /proc/sys/net/ipv4/tcp_rmem /proc/sys/net/ipv4/tcp_mem 包含3个值,分别是: net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力. net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段. net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket. 上述内存单位是页,而不是字节.可参考的优化值是:786432 1048576 1572864 # 进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000. /proc/sys/net/core/netdev_max_backlog # listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到256. /proc/sys/net/core/somaxconn # socket buffer的最大初始化值,默认10K. $ /proc/sys/net/core/optmem_max # 进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到2048. $ /proc/sys/net/ipv4/tcp_max_syn_backlog # TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源. /proc/sys/net/ipv4/tcp_retries2 #这3个参数与TCP KeepAlive有关。 /proc/sys/net/ipv4/tcp_keepalive_time /proc/sys/net/ipv4/tcp_keepalive_intvl /proc/sys/net/ipv4/tcp_keepalive_probes 默认值是: tcp_keepalive_time = 7200 (单位:second) tcp_keepalive_probes = 9 tcp_keepalive_intvl = 75 (单位:second) 意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可以调整到: /proc/sys/net/ipv4/tcp_keepalive_time 1800 /proc/sys/net/ipv4/tcp_keepalive_intvl 30 /proc/sys/net/ipv4/tcp_keepalive_probes 3 # 指定端口范围的一个配置,默认是32768 61000,已够大. /proc/sys/net/ipv4/ip_local_port_range
查看内核参数
查看所有内核参数 sysctl -a 查看特定内核参数 cat /proc/sys/net/ipv4/icmp_echo_ignore_all 或 sysctl net.ipv4.tcp_syncookies
修改内核参数
使用命令进行修改(当前有效,重启后无效) echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all 或 sysctl -w net.ipv4.icmp_echo_ignore_all=1 说明:sysctl的参数名与等于文件路径去掉/proc/sys/,并且"/ “改成”." 修改配置文件(永久生效) vim /etc/sysctl.conf 添加:net.ipv4.icmp_echo_ignore_all=1 让修改立即生效: sysctl -p 或 sysctl --system 说明:这个命令会重新加载 /etc/sysctl.conf 的配置。 sysctl --system与sysctl -p的区别在于: sysctl --system会重新加载以下所有配置文件的配置: /run/sysctl.d/*.conf /etc/sysctl.d/*.conf /usr/local/lib/sysctl.d/*.conf /usr/lib/sysctl.d/*.conf /lib/sysctl.d/*.conf /etc/sysctl.conf
参数迁移
1、保存当前主机所有配置 sysctl -a > mysys.conf 1 2、拷贝到其他主机并执行 sysctl -p -f mysys.conf 1
内核参数调优
6.1 高并发Web服务器内核参数调优 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 (不推荐,NAT下会产生大量的timeout) net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_syn_backlog=65536 net.core.somaxconn=32768 net.core.netdev_max_backlog=65536 sysctl -w net.ipv4.ip_conntrack_max=65536 6.2 其他调优参数 #设置是否响应 icmp echo 请求广播 #net.ipv4.icmp_echo_ignore_broadcasts = 1 #设置之后,可以忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。 #net.ipv4.icmp_ignore_bogus_error_responses = 1 #开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理 net.ipv4.tcp_syncookies = 1 #Default should work for all interfaces net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1 #禁用所有IP源路由 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 #打开反向路径过滤功能,防止ip地址欺骗 net.ipv4.conf.all.rp_filter = 1 #启用源路由核查功能,减少DDoS攻击,防止IP Spoofing net.ipv4.conf.default.rp_filter = 1 #禁止接收路由重定向报文,防止路由表被恶意更改 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 #只接受来自网关的“重定向”icmp报文 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 #禁止转发重定向报文 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.tcp_window_scaling = 1 #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。 net.ipv4.tcp_max_syn_backlog = 8192 #timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小) net.ipv4.tcp_max_tw_buckets = 4096 #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。 net.ipv4.tcp_keepalive_time = 20 #禁用路由转发,只有在服务器上个开启了 ip_forward后,到达服务器的请求才会被iptables转发出去 net.ipv4.ip_forward = 0 #当TCP使用了该值的内存页面数时 net.ipv4.tcp_mem = 192000 300000 732000 TCP读buffer net.ipv4.tcp_rmem = 51200 131072 204800 #min4096(4K)为TCP socket预留用于发送缓冲的内存最小值,default 16384(16K) max131072(128K) net.ipv4.tcp_wmem = 51200 131072 204800 #探测消息未获得响应时,重发该消息的间隔时间(秒)(默认75) net.ipv4.tcp_keepalive_intvl = 20 #在认定TCP连接失效之前,最多发送多少个keepalive探测消息。(默认9) net.ipv4.tcp_keepalive_probes = 2 #对孤立的socket重试的最大次数 net.ipv4.tcp_orphan_retries = 3 #在内核放弃建立连接之前发送SYN包的数量 net.ipv4.tcp_syn_retries = 3 #为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量 net.ipv4.tcp_synack_retries = 3 #在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15 net.ipv4.tcp_retries2 = 5 #如果套接字由本端要求关闭,这个参数 决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些 net.ipv4.tcp_fin_timeout = 30 #系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息 net.ipv4.tcp_max_orphans = 200000 #开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接 net.ipv4.tcp_tw_reuse = 1 #启用timewait快速回收 net.ipv4.tcp_tw_recycle = 1 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000 net.ipv4.ip_local_port_range = 10000 65000 #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 net.core.netdev_max_backlog = 4096 #在所有标记的二进制程序中被启用。 kernel.exec-shield = 1 #参数值为2时,表示启用随机地址功能;0表示关闭; kernel.randomize_va_space = 1 #增加系统文件描述符限制 #fs.file-max = 65535 #PID分配限制值。当内核下一个PID值到达这个值,它会回到最低的PID值。PID的最大的pid_max未分配,默认值为32768 kernel.pid_max = 65536 #该文件表示强制Linux VM最低保留多少空闲内存 vm.min_free_kbytes=409600 #该项表示内核回收用于directory和inode cache内存的倾向 vm.vfs_cache_pressure=200 #缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存 vm.swappiness = 40 #缺省是3000,也就是30秒,如果系统写操作压力很大,可以适当减小该值,但也不要太小;建议设置为 vm.dirty_expire_centisecs = 1500 #这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,持续的写入降低,短期的写入并且数据不打并且内存多,应该增大数值 vm.dirty_writeback_centisecs = 1000 #单个进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行。 vm.dirty_ratio = 20 #所有全局系统进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行 vm.dirty_background_ratio = 10 6.3 tcp_tw_recycle内核参数说明 服务器端打开tcp_tw_recycle参数时,必须要非常小心,因为它依赖于客户机的时间戳。这可能会导致共享套接字的NAT系统出现问题,从而导致服务器端内核丢弃SYN包并忽略连接尝试,造成客户端connection refused,这将导致客户端发生随机连接故障。 当客户端访问一个net.ipv4.tcp_tw_recycle打开的服务器时,客户端连接可能会被有规律的丢弃,因为NAT后面的主机没有同步的TCP时钟。 如果客户端没有启用net.ipv4.tcp_timestamps内核参数,则服务端net.ipv4.tcp_tw_recycle内核参数无法正常工作。
磁盘IO优化
1、cfq是一种比较通用的调度算法,是一种以进程为出发点考虑的调度算法,保证尽量公平。 2、deadline是一种以提高机械硬盘吞吐量为思考出发点的调度算法,只有当有IO请求达到最终期限的时候 才进行调度,非常适合业务比较单一并且IO压力比较重的业务,比如数据库。 3、noop在固态硬盘这种场景下,使用noop是最好的,deadline次之,而cfq由于复杂度的原因,效率最 低。 1.改变调度器 echo noop > /sys/block/sdX/queue/scheduler 2.增加请求队列 #参数可以大幅提升磁盘的吞吐量,缺点会牺牲一定的内存。 echo 4096 > /sys/block/sdX/queue/nr_requests 3.增加预读数 #针对读大文件时可减少查找次数。 echo 4096 > /sys/block/sdX/queue/read_ahead_kb IO内核参数 /proc/sys/vm/dirty_ratio 这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使 用到系统内存多少的时候,开始向磁盘写出数 据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大 提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是 10。 /proc/sys/vm/dirty_background_ratio 这个参数控制文件系统的pdflush进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当 写缓冲使用到系统内存多少的时候, pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写 缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动 上缺省是 5。 /proc/sys/vm/dirty_writeback_centisecs 这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成 多次写操作。如果你的系统是短期地尖峰式的写操作,并且写入数据不大(几十M/次)且内存有比较多富裕, 那么应该增大此数值。 /proc/sys/vm/dirty_expire_centisecs 这个参数声明Linux内核写缓冲区里面的数据多"旧"了之后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这 个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。建议设置为 1500,也就是 15秒算旧。 echo 1500 > /proc/sys/vm/dirty_expire_centisecs 当然,如果你的系统内存比较 大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十M),那么这个值还是大些的好。
-
Linux 编译内核且增加一个系统调用
2020-06-07 17:16:04在添加系统调用之前需要先编译一个Linux的内核。解压安装依赖编译安装内核二.系统调用声名和定义系统调用函数声名定义添加一个系统调用id进行编译可能出现的错误运行检验 一.在添加系统调用之前需要先编译一个Linux... -
Linux内核设计与实现 五、系统调用
2020-10-09 21:41:36如读写文件时,应用程序就可以不管磁盘类型和介质,甚至不用管文件所在的文件系统到底是哪种类型。 ●系统调用保证了系统的稳定和安全。内核可以基于权限、用户类型等规则对访问进行裁决。 ●内核需要知道应用程序... -
centos7 内核优化
2018-09-04 21:51:441.系统资源限制设置 使用ulimit -a 可以查看当前系统的所有限制值, 使用ulimit -n<可以同时打开的文件数>设置用户可以同时打开的 最大文件数 linux系统默认的只要1024 当做负载较大的服务器时,很容易遇... -
《Linux内核设计与实现》第四周读书笔记——第五章
2016-03-24 10:44:00这些接口让应用程序受限地访问硬件设备,提供了创建进程并与已有进程进行通信的机制,也提供了申请操作系统其它资源的能力。 5.1 与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要... -
S5PC100芯片的linux-lcd驱动移植(基于2.6.35.13内核)
2013-03-14 10:56:39第一步:添加和添加平台资源: 1,在文件mach-smdkc100.c里面修改lcd平台资源(根据芯片手册) static struct s3c_fb_pd_win smdkc100_fb_win0 = { /* this is to ensure we use win0 */ .win_mode = { .... -
Fedora运行级别及其虚拟文件系统/proc
2014-01-16 20:55:26在现有的Linux系统中添加新硬件时,你希望知道当前系统的资源配置状态,那么应该如何查看呢?很方便,/proc文件系统中包含了内核关于资源分配的一些信息。 -
inotify 文件系统事件监视 rsync结合使用
2014-11-10 11:50:11每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题...Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加 -
如何在Linux系统中添加新的系统调用
2020-07-30 19:44:45其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及... -
关于linux分区,文件系统,目录结构的概述
2021-01-20 16:15:38Linux内核读取光驱,硬盘等资源时均通过“设备文件”的形式进行,因此在linux系统中,将硬盘和分区表示为不同的文件。具体表述形式如下: 硬盘:对于IDE接口的硬盘设备,表示为“hdX”形式的文件名:而对于SCSI接口的... -
使用pull方法解析Xml文件(省市县Xml)
2016-11-07 09:53:39很多资源文件中,很多都是xml格式,在android系统中解析这些xml的方式,是使用pul解析器进行解析的,它和sax解析一样,也是采用事件驱动进行解析的,同时,由于android内核已经内嵌了pull,所以我们不需要添加第三方... -
ubuntu如何添加kylin镜像源_【干货】5分钟看懂Linux虚拟化Docker之Docker镜像
2020-11-22 22:20:50我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。...Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置... -
如何在Linux中添加新的系统调用
2010-04-13 11:39:00如何在Linux中添加新的系统调用来源: 系统之家 | 日期:2010-2-23 07:48 | 作者: 要命的小雨 系统调用是应用程序和操作系统内核之间的功能接口。其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/... -
QMediaPlaylist QMediaPlayer QVideoWidget 实现多媒体资源播放
2020-05-03 21:41:24QMediaPlaylist是一个列表,它可以保存媒体文件,包括媒体路径等信息,它具有着列表的性质,比如添加删除插入等,但它能做的,比单纯的储存要多得多。设置播放顺序,对播放的控制,保存到本地,从本地读取,都可以很... -
如何在Linux中添加新的系统调用
2009-11-20 21:49:00其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及... -
怎么在Linux中添加新的系统调用
2010-01-07 16:11:00其主要目的是使得用户能使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信及存储管理等方面的功能,而不必了解系统程式的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统及提高... -
在Linux中添加新的系统调用
2006-01-08 21:51:00其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及... -
Linux添加新的系统调用(for arm )
2010-06-22 10:46:00其主要目的是使得用户可以使用操作系统提供的有关设备管理、输入/输入系统、文件系统和进程控制、通信以及存储管理等方面的功能,而不必了解系统程序的内部结构和有关硬件细节,从而起到减轻用户负担和保护系统以及... -
docker容器安全分析
2020-04-29 10:02:48容器与虚拟机的区别 隔离性 虚拟机通过添加 Hypervisor 层,虚拟出网卡、内存、CPU 等虚拟硬件,再在其上建立 ...容器与宿主机共享内核、文件系统、硬件等资源 性能 容器消耗资源更少 虚拟机的安全性更好,从虚拟... -
Docker安全管理(实战!!!)
2020-01-14 19:48:43Docker安全 Docker与虚拟机的区别 隔离与共享 虚拟机通过添加 Hypervisor 层,虚拟出网卡、内存、CPU 等虚拟硬件,再在其上建立 虚拟机,每个虚拟机都有自己的...容器与宿主机共享内核、文件系统、硬件等资源。... -
容器与容器云——docker安全(TLS加密通讯)
2020-04-29 12:13:52docker 容器与虚拟机的区别 隔离与共享 虚拟机通过添加 Hypervisor 层,虚拟出网卡、内存、CPU等虚拟硬件,再在其上建立虚拟机,每个虚拟机都有自己的...容器与宿主机共享内核、文件系统、硬件等资源 性能与损...
-
输入年月得到当月日历(升级版)
-
虚幻4引擎基础
-
自动控制原理笔记.pdf
-
redis 的过期策略和内存淘汰策略
-
Spartan6 XC6SLX9-2FTG256C FPGA开发板ALTIUM硬件原理图+PCB+封装库文件.zip
-
编码-源码
-
网络爬虫-源码
-
基于代码覆盖数据分析的代码去冗优化
-
eslint-plugin-immutable:ESLint插件可禁用JavaScript中的所有突变-源码
-
libFuzzer视频教程
-
数学建模-层次分析法建模
-
12 | 为什么我的 MySQL 会 “ 抖 ” 一下?
-
成语小秀才云开发代码 成语答题小程序源码
-
程序员创业利与弊
-
《软件架构评估》学习笔记
-
leetcode刷题最强指南(版本1.0)(这个让人体系思路清晰很多,不会看到leetcode很茫然)
-
graalvm-demo-源码
-
ROS树莓派发送USB摄像头信息发送从机PC端显示
-
Amoeba 实现 MySQL 高可用、负载均衡和读写分离
-
SpringBoot使用Quartz