linux系统的优缺点

linux系统的优缺点,第1张

优点:

1、Linux是一款免费的 *** 作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的 *** 作系统所做不到的。

2、Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式 *** 作系统,可以运行在掌上电脑、机顶盒或游戏机上。

3、完全兼容POSIX1.0标准,这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。

缺点:

1、Linux内核提供了一个调度程序来管理系统中运行的进程。几乎总是,先发制人的;这意味着调度程序执行一段时间,如果进程尚未完成,则调度程序将停止进程并开始执行另一个进程。

2、内存管理器是内核最重要的核心部分之一。它提供物理到虚拟内存映射功能以及分页和交换到物理磁盘。内存管理器使用与体系结构相关的代码来访问计算机的物理内存。虽然内核维护自己的虚拟地址空间,但用户空间中的每个进程都有自己的虚拟地址空间。

扩展资料:

桌面环境

在图形计算中,一个桌面环境(Desktop environment,有时称为桌面管理器)为计算机提供一个图形用户界面(GUI)。但严格来说窗口管理器和桌面环境是有区别的。

桌面环境就是桌面图形环境,它的主要目标是为Linux/Unix *** 作系统提供一个更加完备 的界面以及大量各类整合工具和使用 程序,其基本 易用性吸引着大量的新用户。

桌面环境名称来自桌面比拟,对应于早期的文字命令行界面(CLI)。一个典型的桌面环境提供图标,视窗,工具栏,文件夹,壁纸以及像拖放这样的能力。整体而言,桌面环境在设计和功能上的特性,赋予了它与众不同的外观和感觉。

现今主流的桌面环境有KDE,gnome,Xfce,LXDE等,除此之外还有Ambient,EDE,IRIX Interactive Desktop,Mezzo,Sugar,CDE等。

参考资料来源:百度百科-linux系统

Linux和Windows是两种 *** 作系统,对于服务器运维的人来说,在为服务器选择 *** 作系统系统的时候,是选择Linux还是Windows是让人困惑的事?

从用户群来说Linux是一个以开发者为中心的 *** 作系统,而windows是以消费者为中心的 *** 作系统,这也是两个 *** 作系统作为根本的区别。简单来讲,两个系统的选择就是看你是开发用还是作为消费者使用。

具体到Linux与Windows的优缺点,可以总结为一下几点

1.Linux可以看到源代码,windows不行。

这一点直接导致的结果就是在特殊应用的场合可以自行剪裁和定制所需的内核模块,这对于高级系统内核管理优化和驱动程序的开发相当有利,另外也因为代码可见,不用担心恶意功能或者后门,对于军政企的使用比较有利。另外在系统出现严重问题的时候,可以自行修改代码或者接个几k的patch就能编译然后使用,而windows你得等微软的补丁。

2、Linux命令行功能强大,可以做任何事情,windows也有命令行,但是属于附属品。

命令行是Linux的根本,甚至你对某些命令不满意,你也可以自己修改或者编个自己的命令出来。命令行的好处是可重复。想要知道命令行的具体是什么你可以访问老男孩教育。如果你想要告诉别人一件事怎么做,一个命令行发过去就可以,想要再做一遍之前做过的一件事,调出历史命令记录重新执行一下就行。很多要定时做的事情写成脚本设个crontab定时,就完事儿。另外这样也可以保证你用一样的命令行,做的是一样的事情。

3、开放源码和高度可定制

开放源码的初衷,不是为了自由而是为了定制。AT&T UNIX从来就是有版权的,但是源代码仍然可用,这是为了让用户能够根据需要,去修改它。Linux社区所赞赏的软件和系统,多半遵循同样的规则——它应该能够适应不同用户的不同环境,能够轻易的改变自己的行为,能够轻松的与不同环境整合。与其假设别人和你的需求一致,不如给予它们定制系统的自由。

4、去中心化

分散的软件开发,也注定了系统的接口和形式不统一——因为大家都喜欢发明轮子。而每个人的轮子或多或少更适合自己和社区,而非所有人,而在Linux的环境下又没有人能强迫所有人用自己的轮子(除了Kernel开发者,但其实很多distro对kernel也有patch),所以与其制定一种实践,Linux更多的让用户去选择生活的方式。

你会看到Linux生态环境中有大量的distro,不同的distro有不同的init方式,不同的软件包管理器和安装策略;每个人习惯使用不同的VCS,不同的shell,不同的编辑器,都就是更多的选择的哲学的体现。

5、Linux是基于网络的,诞生于网络。

远程连接上SSH,你就可以轻松 *** 控远在千里之外的Linux服务器,只要有相应的权限,几乎和坐在物理机面前没有区别,哪怕网速很糟糕,实际只是一些加密的字符在传送,需要的带宽很小。

这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程。主要从模块开发中的常用指令、内核模块程序的结构、模块使用计数以及模块的编译等角度对内核模块进行介绍。在Linux系统开发过程中,以模块的形式开发其重要性不言自明,而在嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性——用户只需要拿到相关驱动模块,再插入到用户的内核中,即可灵活地使用你的设备。二. 文章提纲1. 摘要2. 文章提纲3. 概述4. 模块开发常用的指令5. 内核模块程序结构6. 模块使用计数7. 模块的编译8. 使用模块绕开GPL9. 总结三.概述Linux内核整体结构已经很庞大,包含了很多的组件,而对于我们工程师而言,有两种方法将需要的功能包含进内核当中。 一:将所有的功能都编译进Linux内核。 二:将需要的功能编译成模块,在需要的时候动态地添加。上述两种方式优缺点分析: 第一种: 优点:不会有版本不兼容的问题,不需要进行严格的版本检查 缺点:生成的内核会很大;要在现有的内核中添加新的功能,则要编译整个内核 第二种:优点:模块本身不编译进内核,从而控制了内核的大小;模块一旦被加载,将和其它的部分完全一样。缺点:可能会有内核与模块版本不兼容的问题,导致内核崩溃;会造成内存的利用率比较低。 四.模块开发常用的指令在内核模块开发的过程中常用的有以下指令。1) insmod: 将模块插入内核中,使用方法:#insmod XXX.ko2) rmmod: 将模块从内核中删除,使用方法:#rmmod XXX.ko3) lsmod: 列表显示所有的内核模块,可以和grep指令结合使用。使用方法:#lsmod | grep XXX4) modprobe: modprobe可载入指定的个别模块,或是载入一组相依赖的模块。modprobe会根据depmod所产生的依赖关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。依赖关系是通过读取 /lib/modules/2.6.xx/modules.dep得到的。而该文件是通过depmod 所建立。5) modinfo: 查看模块信息。使用方法:#modinfo XXX.ko6) tree –a: 查看当前目录的整个树结构。使用方法:#tree -a 五.内核模块程序结构1) 模块加载函数(一般需要)在用insmod或modprobe命令加载模块时,该函数被执行。完成模块的初始化工作。Linux内核的模块加载函数一般用__init标识声明,模块加载函数必须以module_init(函数名)的形式被指定。该函数返回整型值,如果执行成功,则返回0,初始化失败时则返回错误编码,Linux内核当中的错误编码是负值,在<linux/errno.h>中定义。在Linux中,标识__init的函数在连接时放在.init.text这个区段,而且在.initcall.init中保留一份函数指针,初始化的时候内核会根据这些指针调用初始化函数,初始化结束后释放这些init区段(包括前两者)。代码清单:1 static int __init XXX_init(void) 2 3 { 4 5 return 06 } 7 8 9 10 moudle_init(XXX_init)2) 模块卸载函数(一般需要)在用rmmod或modprobe命令卸载模块时,该函数被执行。完成与加载相反的工作。模块的卸载函数和模块加载函数实现相反的功能,主要包括若模块加载函数注册了XXX,则模块卸载函数注销XXX若模块加载函数动态分配了内存,则模块卸载函数释放这些内存若模块加载函数申请了硬件资源,则模块卸载函数释放这些硬件资源若模块加载函数开启了硬件资源,则模块卸载函数一定要关闭这些资源代码清单:1 static void __exit XXX_exit(void)2 3 {4 5 }6 7 8 9 moudle_exit(XXX_exit)3) 模块许可证声明(必须)如果不声明,则在模块加载时会收到内核被污染的警告,一般应遵循GPL协议。代码清单:1 MODULE_LICENSE("GPL")4) 模块参数(可选)模块在被加载时传递给模块的值,本身应该是模块内部的全局变量。示例程序book.c1 #include <linux/init.h>2 3 #include <linux/module.h>4 5 6 7 static char *bookName = "Good Book."8 9 static int bookNumber = 10010 11 12 13 static int __init book_init(void)14 15 {16 17 printk(KERN_INFO "Book name is %s\n", bookName)18 19 printk(KERN_INFO "Book number is %d\n", bookNumber)20 21 return 022 23 }24 25 26 27 static void __exit book_exit(void)28 29 {30 31 printk(KERN_INFO "Book module exit.\n")32 33 }34 35 36 37 module_init(book_init)38 39 module_exit(book_exit)40 41 module_param(bookName, charp, S_IRUGO)42 43 module_param(bookNumber, int, S_IRUGO)44 45 46 47 MODULE_LICENSE("GPL")在向内核插入模块的时候可以用以下方式,并且可以在内核日志中看到模块加载以后变量已经有了值。5) 模块导出符号(可选)使用模块导出符号,方便其它模块依赖于该模块,并使用模块中的变量和函数等。在Linux2.6的内核中,/proc/kallsyms文件对应着符号表,它记录了符号和符号对应的内存地址。对于模块而言,使用下面的宏可以导出符号。1 EXPORT_SYMBOL(符号名)或1 EXPORT_GPL_SYMBOL(符号名)6) 模块信息(可选)模块信息则是指模块的作者信息等。 六.模块使用计数Linux内核提供了MOD_INC_USE_COUNT和MOD_DEC_USE_COUNT宏来管理模块使用计数。但是对于内核模块而言,一般不会自己管理使用计数。 七.模块的编译将下面的Makefile文件放在book.c同级的目录下,然后使用#make命令或者#make all命令编译即可生成book.ko模块文件。对应的Makefile:1 ifneq ($(KERNELRELEASE),) 2 3 mymodule_objs := book.o 4 5 obj-m := book.o 6 7 else 8 9 PWD := $(shell pwd)10 11 KVER ?= $(shell uname -r)12 13 KDIR := /usr/src/linux-headers-2.6.38-8-generic14 15 16 17 all:18 19 $(MAKE) -C $(KDIR) M=$(PWD)20 21 clean:22 23 rm -rf *.mod.c *.mod.o *.ko *.o *.tmp_versions *.order *symvers24 25 endif八.使用模块绕开如果功能不编译成模块,则无法绕开GPL,编译成模块后公司发布产品则只需要发布模块,而不需要发布源码。为了Linux系统能够支持模块,需要做以下的工作:内核编译时选择“可以加载模块”,嵌入式产品一般都不需要卸载模块,则可以不选择“可卸载模块”将我们的ko文件放在文件系统中Linux系统实现了insmod、rmmod等工具使用时可以用insmod手动加载模块,也可以修改/etc/init.d/rcS文件,从而在系统启动的时候就加载模块。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存