文档库 最新最全的文档下载
当前位置:文档库 › 业界观察-Linux内核有待提高的七个领域

业界观察-Linux内核有待提高的七个领域

业界观察:Linux内核有待提高的七个领域

对Linux的商业用户来说,Linux内核的开发可能非常复杂神秘,因为由几十个人维护着不同的部分,有几百名志愿者提交代码,你很难判断新功能的走向。

从本质上来说Linux的开发也没有线路图。要一窥全豹,以下是7个值得关注的开发热点,基于对开发人员和内核维护人员的采访。不是所有的新功能都进展顺利,下文展

现了各新功能进入内核的崎岖之道。

1、虚拟化

认识到虚拟化在这十年里日益成为大趋势,Linux内核维护者把它作为优先考虑的功能,加快了虚拟化技术添加到内核的进程。由初创公司Qumranet的AviKivity提供的KVM虚拟管理程序,就包含在2006年末发布的内核中并在上个月的发布中继续升级。这个例子很好地展现了快速内核发布和缓慢企业版进展之间矛盾。

Novell公司的副总裁霍尔格杜尔夫表示我们认为KVM还不适合企业使用。他补充说,在KVM能被加到SUSELinux之前,它需要在内核子系统包括调度器的交互上经过更多的测试。

最近被CitrixSystems耗费5千万美元收购的商业开源虚拟化公司XenSource,一直在游说想把自己架构的Xen虚拟机管理程序加入到内核里。内核维护人员认为添加这种虚拟化功能会大大增加维护工作量。最终XenSource的工

程师放弃了,但仍继续调整Xen以配合内核的运行。它暂时还进不了内核,只能先增加了一些支持,使Linux在运行虚拟环境时可以识别它。

其他的虚拟化功能发展迅速,包括KVM和Lguest。Lguest 是由IBM工程师RustyRussell开发的一个只有5000行代码的精简hypervisor,它已经包括在最近版本的内核里了。和KVM相似,它支持Intel和AMD芯片的最新虚拟化技术。但又与VMware公司的ESXServer不同,在Lguest

创建的虚拟机里的操作系统知道自己是被虚拟出来的。所以在调用CPU周期时它可以直接向真正的硬件发出请求,而不是作为中间媒介而降低了效率,因此这种架构大大提高了效率。

2、实时操作

Linux在实时操作上获得了长足的提升,因为现在它常常被用作手机和其它设备上的嵌入式系统。但最近发布的2.6.23内核显示它在实时操作上稍有退步,商业嵌入式

Linux厂商MontaVista的首席技术长官和创始人吉姆瑞尔迪抱怨说。这个新的进程调度器更强调公平这意味着要由最终用户告诉处理器哪些待处理的任务可以获得更高的优先级。

实时用户不需要公平,瑞尔迪认为,因为实时要求无论CPU 在做什么,都可以插入一个新的优先级以中断操作。一个简单的例子是,在医疗设备里监控病人呼吸的软件在发现病人呼吸停顿时,能发送一个即时警告,软件无论在处理

什么任务都要先中断停下来。瑞尔迪表示,除非实时性能有改善,否则MontaVista不会把新的内核整合到自己的产品中来。Gartner分析师乔治维斯预测标准版的Linux要到2008年才能成为有竞争力的实时系统。

3、中断处理

维斯那样说其中一个原因是因为内核开发人员正致力于使进程调度器具有实时功能。操作系统的关键环节是中断的管理它决定了哪些任务能获得CPU的处理权,如何排列不

同行为之间的优先级。如果所有的中断处理器都可以被结合到自己的线程中去,那个线程就可以被调度并设置优先级,而不是无法预知地运行和延迟的实时响应。

过去三年来这样的努力一直没有停歇过。MontaVista的斯文托斯滕迪特里奇在2004年就提交了代码,希望防止中断处理程序为了常规任务而中断内核,因为它们干扰了实时响应。但这些代码的破坏性太大,以致无法获得内核调度领域的专家IngoMolnar的认可。这些代码影响了一个关键

内核功能自旋锁,当进程在等待需要的数据或事件时,它可以锁定CPU。许多进程依赖于自旋锁。Dietrich的代码把几百个自旋锁减少到30个;Molnar的修订保留了Array0个自旋锁,比前者破坏性要来得少些。

把中断处理器集合到一个统一的独立线程的想法看来已开始成熟并准备进入内核了。Ingo替换了我们的做法,但他做得很棒,瑞尔迪说道。MontaVista并不在乎自己的努力是否能获得更多的荣誉,瑞尔迪理解这就是开源合作的方

式,因此他接受正在进入内核的实时功能的修改。

4、安全

人人都希望有个更安全的系统。Novell在发布SUSELinuxEnterpriseServer10的同时一起发布了AppArmor,它是一个限定应用程序可以访问操作系统哪些资源的软件,这样可以限制应用因非法授权访问而造成的危害。然而在近期内它还不太可能会被加进内核。

Linux安全的权威专家、另一套安全机制SELinux的开发

人员斯蒂芬斯玛莱则认为AppArmor不能被加进内核是因为它的保护机制是基于路径名称的方式,它本质上就是一个白名单设置,AppArmor只允许应用程序访问在名单上的文件,所有其他的文件都不能访问了。根据去年乔纳森科贝特的一份报告,斯玛莱认为一个狡猾的入侵者可以利用合法路径名称而猜出其他的名字,制造不必要的暴露。内核维护人员安德鲁莫顿同意是因为这种路径名机造成AppArmor不能进入内核的根本原因。我不是个安全程序

员,他说。我不知道可以怎样解决这个问题。

5、系统诊断

Solaris可以使用DTrace工具检测操作系统核心的运行状况,但Linux缺乏用户界面友好的检测工具。目前仅有的几个工具之一是ptrace,该程序可以让一个进程跟踪另一个进程的行为。但ptrace使用起来非常笨拙并容易发生错误,现在有了替代品utrace,它已经进入Morton的内存管理代码树,即将会被提交给李纳斯托沃兹。当Utrace

被一个程序执行时它可以跟踪该进程的行为,却没有ptrace的那些问题,但它仍然会导致内核里的锁问题。科贝特预测在下一版本的内核里仍然不可能包含该工具。6、文件系统

Reiser4文件系统已被考虑额外增加到内核里去,内核现在已经包含30多种文件系统。Reiser4是一个大型的文件管理系统,根据汉斯瑞塞尔的文档,它的优势在于只需要最少的磁盘空间,就能处理数量众多的小文件。

该文件系统要求对文件的操作要不就完成,要不就放弃,以避免文件操作完成到一半导致文件被破坏。这对许多Linux应用看起来很完美,但经过多年的争辩,Reiser4还是没能加入内核。它与内核的某些部分配合不好,而且最重要的开发人员瑞塞尔本人已经退出了项目。要使它成为Linux主流的一部分,它需要一个新的带头人,科贝特在本月早些时候预测它的前景时说。

ZFS是SunMicrosystems的128位文件系统,它可以乘数

方式扩展Linux的地址空间,远超现在系统的最大使用需求。它的支持者认为它应该被加进内核。但它目前的授权与LinuxGPL不兼容。

7、电源管理

Linux在电源管理上相对落后,而Windows笔记本上的电源管理则令人刮目相看,这刺激了Intel工程师内核开发人员Molnar和托马斯格雷赛纳尔以及其它人推动电源管理的改进。一年前,内核加入tick-lessidle机制,当没

有工作需要完成的时候通知处理器处于空闲状态。如果没有它CPU的时钟就会每秒向内核发出1000次询问,查看是否有工作要完成,白白浪费了电力。

Intel的首席Linux技术员德克亨德尔预计在电源管理上会有进一步的改进。但内核和系统时钟里的任何改动都会影响许多其他的交互。他认为,这些事情可能会困难重重,需要花费很长的时间,但是我肯定这个发展方向是正确的。對Linux的商業用戶來說,Linux內核的開發可能非常復

雜神秘,因為由幾十個人維護著不同的部分,有幾百名志願者提交代碼,你很難判斷新功能的走向。

從本質上來說Linux的開發也沒有線路圖。要一窺全豹,以下是7個值得關註的開發熱點,基於對開發人員和內核維護人員的采訪。不是所有的新功能都進展順利,下文展現瞭各新功能進入內核的崎嶇之道。

1、虛擬化

認識到虛擬化在這十年裡日益成為大趨勢,Linux內核維

護者把它作為優先考慮的功能,加快瞭虛擬化技術添加到內核的進程。由初創公司Qumranet的AviKivity提供的KVM虛擬管理程序,就包含在2006年末發佈的內核中並在上個月的發佈中繼續升級。這個例子很好地展現瞭快速內核發佈和緩慢企業版進展之間矛盾。

Novell公司的副總裁霍爾格杜爾夫表示我們認為KVM還不適合企業使用。他補充說,在KVM能被加到SUSELinux之前,它需要在內核子系統包括調度器的交互上經過更多的

測試。

最近被CitrixSystems耗費5千萬美元收購的商業開源虛擬化公司XenSource,一直在遊說想把自己架構的Xen虛擬機管理程序加入到內核裡。內核維護人員認為添加這種虛擬化功能會大大增加維護工作量。最終XenSource的工程師放棄瞭,但仍繼續調整Xen以配合內核的運行。它暫時還進不瞭內核,隻能先增加瞭一些支持,使Linux在運行虛擬環境時可以識別它。

其他的虛擬化功能發展迅速,包括KVM和Lguest。Lguest 是由IBM工程師RustyRussell開發的一個隻有5000行代碼的精簡hypervisor,它已經包括在最近版本的內核裡瞭。和KVM相似,它支持Intel和AMD芯片的最新虛擬化技術。但又與VMware公司的ESXServer不同,在Lguest 創建的虛擬機裡的操作系統知道自己是被虛擬出來的。所以在調用CPU周期時它可以直接向真正的硬件發出請求,而不是作為中間媒介而降低瞭效率,因此這種架構大大提

Linux内核崩溃原因分析及错误跟踪技术

Linux内核崩溃原因分析及错误跟踪技术 随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,要求系统达到安全完整性等级3级以上[1],故障率(每小时出现危险故障的可能性)为10-7以下,相当于系统的平均故障间隔时间(MTBF)至少要达到1141年以上,因此提高系统可靠性已成为一项艰巨的任务。对某公司在工业领域14 878个控制器系统的应用调查表明,从2004年初到2007年9月底,随着硬软件的不断改进,根据错误报告统计的故障率已降低到2004年的五分之一以下,但查找错误的时间却增加到原来的3倍以上。 这种解决问题所需时间呈上升的趋势固然有软件问题,但缺乏必要的手段以辅助解决问题才是主要的原因。通过对故障的统计跟踪发现,难以解决的软件错误和从发现到解决耗时较长的软件错误都集中在操作系统的核心部分,这其中又有很大比例集中在驱动程序部分[2]。因此,错误跟踪技术被看成是提高系统安全完整性等级的一个重要措施[1],大多数现代操作系统均为发展提供了操作系统内核“崩溃转储”机制,即在软件系统宕机时,将内存内容保存到磁盘[3],或者通过网络发送到故障服务器[3],或者直接启动内核调试器[4]等,以供事后分析改进。 基于Linux操作系统内核的崩溃转储机制近年来有以下几种: (1) LKCD(Linux Kernel Crash Dump)机制[3]; (2) KDUMP(Linux Kernel Dump)机制[4]; (3) KDB机制[5]; (4) KGDB机制[6]。 综合上述几种机制可以发现,这四种机制之间有以下三个共同点: (1) 适用于为运算资源丰富、存储空间充足的应用场合; (2) 发生系统崩溃后恢复时间无严格要求; (3) 主要针对较通用的硬件平台,如X86平台。 在嵌入式应用场合想要直接使用上列机制中的某一种,却遇到以下三个难点无法解决: (1) 存储空间不足 嵌入式系统一般采用Flash作为存储器,而Flash容量有限,且可能远远小于嵌入式系统中的内存容量。因此将全部内存内容保存到Flash不可行。

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.wendangku.net/doc/f712240415.html, 来源: https://www.wendangku.net/doc/f712240415.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

Linux 操作系统查看服务器系统信息命令(linux系统)

Linux 操作系统查看服务器系统信息命令(linux 系统系统: # uname -a # 查看内核 /操作系统 /CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看 CPU 信息 # hostname # 查看计算机名 # lspci -tv # 列出所有 PCI 设备 # lsusb -tv # 列出所有 USB 设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 资源 : # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh <目录名 > # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载 磁盘和分区 :

# mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数 (仅适用于 IDE 设备 # dmesg | grep IDE # 查看启动时 IDE 设备检测状况 网络 : # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息 用户 : # w # 查看活动用户 # id <用户名 > # 查看指定用户信息 # last # 查看用户登录日志 # cut -d: -f1 /etc/passwd # 查看系统所有用户 # cut -d: -f1 /etc/group # 查看系统所有组 # crontab -l # 查看当前用户的计划任务

如何查询centos查看系统内核版本,系统版本,32位还是64位

【转】如何查询centos查看系统内核版本,系统版本,32位还是64位 查看centos内核的版本: 1)[root@localhost ~]# cat /proc/version Linux version 2.6.18-194.el5 (mockbuild@https://www.wendangku.net/doc/f712240415.html,) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Fri Apr 2 14:58:14 EDT 2010 2) [root@localhost ~]# uname -a Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux 3) [root@localhost ~]# uname -r 2.6.18-194.el5 2. 查看linux版本: 1) 列出所有版本信息, [root@localhost ~]# lsb_release -a LSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3.1-amd64:graphics -3.1-ia32:graphics-3.1-noarch Distributor ID: CentOS Description: CentOS release 5.5 (Final) Release: 5.5 Codename: Final 注:这个命令适用于所有的linux,包括Redhat、SuSE、Debian等发行版。 2) 执行cat /etc/issue,例如如下: [root@localhost ~]# cat /etc/issue CentOS release 5.5 (Final) Kernel r on an m 3) 执行cat /etc/redhat-release ,例如如下: [root@localhost ~]# cat /etc/redhat-release CentOS release 5.5 (Final) 查看系统是64位还是32位: 1、getconf LONG_BIT or getconf WORD_BIT [root@localhost ~]# getconf LONG_BIT 64 2、file /bin/ls [root@localhost ~]# file /bin/ls /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 3、lsb_release -a [root@localhost ~]# lsb_release -a

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

查看linux系统版本,内核,CPU,MEM,位数的相关命令

查看linux系统版本,内核,CPU,MEM,位数的相关命令 1.查看版本,内核 [oracle@svr15 ~]$ cat /etc/issue Red Hat Enterprise Linux AS release 4 (Nahant) Kernel \r on an \m [oracle@svr15 ~]$ cat /proc/version Linux version 2.6.9-5.ELsmp (bhcompile@https://www.wendangku.net/doc/f712240415.html,) (gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)) #1 SMP Wed Jan 5 19:30:39 EST 2005 [oracle@svr15 ~]$ uname -r 2.6.9-5.ELsmp 2.查看cpu,mem [oracle@svr15 ~]$ grep "model name" /proc/cpuinfo model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz [oracle@svr15 ~]$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU 5130 @ 2.00GHz stepping : 6 cpu MHz : 1995.006 cache size : 64 KB physical id : 0 siblings : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 10 wp : yes

基于Linux内核编程的实验报告(Linux内核分析实验报告)

基于Linux内核编程的实验报告(Linux内核分析实验 报告) 以下是为大家整理的基于Linux内核编程的实验报告(Linux内核分析实验报告)的相关范文,本文关键词为基于,Linux,内核,编程,实验,报告,分析,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 Linux内核分析实验报告

实验题目:文件系统实验 实验目的:linux文件系统使用虚拟文件系统VFs作为内核文件子系统。可以安装多种 不同形式的文件系统在其中共存并协同工作。VFs对用户提供了统一的文件访问接口。本实验的要求是 (1)编写一个get_FAT_boot函数,通过系统调用或动态模块调用它可以提 取和显示出FAT文件系统盘的引导扇区信息。这些信息的格式定义在内核文件的fat_boot_sector结构体中。函数可通过系统调用或动态模块调用。 (2)编写一个get_FAT_dir函数,通过系统调用或动态模块调用它可以 返回FAT文件系统的当 前目录表,从中找出和统计空闲的目录项(文件名以0x00打头的为从未使用过目录项,以0xe5打头的为已删除的目录项),将这些空闲的目录项集中调整到目录表的前部。这些信息的格式定义在内核文件的msdos_dir_entry结构体中。 硬件环境:内存1g以上 软件环境:Linux(ubuntu)2-6实验步骤: 一:实验原理: 以实验4为蓝本,在优盘中编译并加载模块,启动测试程序,查

/proc/mydir/myfile的文件内容。从优盘得到fat文件系统的内容存在msdos_sb_info结构中,然后得到msdos_sb_info结构相应的属性值,得到实验一的数据。实验二中,得到fat文件系统第一个扇区的十六个文件信息。然后按照文件名头文字的比较方法,应用归并排序的方法,将头文件是0x00和0xe5的文件调到前面,其他的文件调到后面 二:主要数据结构说明: (1)超级块对象: 数据结构说明:一个已经安装的文件系统的安装点由超级块对象代表。 structsuper_block{... conststructsuper_operations*s_op;} (2)索引i节点对象 数据结构说明:索引i节点对象包含了内核要操作的文件的全部控制信息,对应着打开文件的i节点表。structinode{ conststructinode_operations*i_op;...} (3)目录项对象 数据结构说明:录项对象代表了文件路径名的各个部分,目录文件名和普 通文件名都属于目录项对象。structdentry{

Linux查看系统命令

系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh <目录名> # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载# cat /proc/loadavg # 查看系统负载 磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况 网络 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息 进程 # ps -ef # 查看所有进程 # top # 实时显示进程状态 用户

linux查看驱动版本

Linux下查看驱动版本以及硬件信息 2009-05-13 09:58 lsmod 看看你要查看的驱动模块名字,例如100M网卡e100 modinfo e100 则会出现相关的版本信息 常用命令整理如下: 用硬件检测程序kuduz探测新硬件:service kudzu start ( or restart) 查看CPU信息:cat /proc/cpuinfo 查看板卡信息:cat /proc/pci 查看PCI信息:lspci (相比cat /proc/pci更直观) 查看内存信息:cat /proc/meminfo 查看USB设备:cat /proc/bus/usb/devices 查看键盘和鼠标:cat /proc/bus/input/devices 查看系统硬盘信息和使用情况:fdisk & disk - l & df 查看各设备的中断请求(IRQ):cat /proc/interrupts 查看系统体系结构:uname -a dmidecode查看硬件信息,包括bios、cpu、内存等信息 dmesg | more 查看硬件信息 对于“/proc”中文件可使用文件查看命令浏览其内容,文件中包含系统特定信息:Cpuinfo 主机CPU信息 Dma 主机DMA通道信息 Filesystems 文件系统信息 Interrupts 主机中断信息 Ioprots 主机I/O端口号信息 Meninfo 主机内存信息 Version Linux内存版本信息 另外我们还可以使用hardinfo 这个软件来查看硬件信息。

通常,linux系统启动的时候当加载网卡的时候,会产生一条日志信息写道/var/log/messages或者dmesg里面,这里面就有比较详细的网卡信息,包括版本号码等。 对于网卡: 用ethtool -i ethX可以查询该网络设备的版本信息 包括driver版本信息和firmware版本信息 用此命令也能看到总线信息和该设备所用的driver模块名称 假定该网卡使用的驱动模块是intel的e1000 再用modinfo e1000就可看到该driver模块的详细信息 查看网卡属性:ethtool -g eth0;查看网卡信息:dmesg

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

linux内核gpio操作函数解析

详解内核驱动操作GPIO引脚API函数 函数原型: void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function); unsigned int s3c2410_gpio_getcfg(unsigned int pin); void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); unsigned int s3c2410_gpio_getpin(unsigned int pin); unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change); int s3c2410_gpio_getirq(unsigned int pin); 关于函数中用到的虚拟地址到物理地址转换的变量及算法可以参考 https://www.wendangku.net/doc/f712240415.html,/hefeng330467115@126/blog/static/78205842201 0620511659/ 或https://www.wendangku.net/doc/f712240415.html,/u3/102836/showart_2065945.html 看简单led驱动程序是用到的文件及头文件可能有: linux/include/asm-arm/arch-s3c2410/map.h linux/include/asm-arm/arch-s3c2410/regs-gpio.h linux/arch/arm/plat-s3c24xx/gpio.c linux/include/asm-arm/io.h 用Source Insight 打开这些文件,然后再看驱动程序,可以随意跳转到定义处,很是方便 pin参数: gpio引脚及特殊功能寄存器助记符都在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义: eg: S3C2410_GPACON S3C2410_GPADAT S3C2410_GPA0 - S3C2410_GPA22 //引脚 S3C2410_GPA0_OUT - S3C2410_GPA22_OUT //设置引脚为输出 用到哪个不清楚的可以直接到这个文件去查找 还有中断和GSTATUS: S3C2410_EXTINT0 -> irq sense control for EINT0..EINT7 S3C2410_EXTINT1 -> irq sense control for EINT8..EINT15 S3C2410_EXTINT2 -> irq sense control for EINT16..EINT23 …… function参数: 指定引脚功能:输出、输入还是特殊功能,也在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义。 函数功能: 1原型:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int

如何查看LINUX操作系统是多少位的

方法一 Linux系统查看当前安装的系统是32位还是64位方法如下: [root@localhost mysql-5.1.57]# getconf LONG_BIT 64 通过上面命令,可以很方便看到是64位,如果结果是32就是32位系统。 查看Linux版本信息命令如下: [root@localhost mysql-5.1.57]# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics- 4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing- 4.0-ia32:printing-4.0-noarch Distributor ID: CentOS Description: CentOS release 5.8 (Final) Release: 5.8 Codename: Final 方法二 (1) 终端输入: file /sbin/init 如显示: /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 即是32位的linux, 如是64位的, 显示的是64-bit (2) 终端输入: uname -a 如显示: Linux redhat-tj 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux 则是32位 (3)(?) 终端输入: getconf WORD_BIT 如显示: 32 则是32位的linux

Linux查看系统状态命令

inux 查看系统信息命令是linux初学者必备的基础知识, 这些命令也非常有用, 因为进入linux第一件事就可能是首先查看系统信息, 因此必要的系统的学习一下这些linux系统信息命令还是非常有必要的! 下面给除了各linux发行版比较常用的系统信息查询的命令, 大家可以参考, 同时也可以测试学习, 必要的时候man, 一定要学学使用man命令, 呵呵 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh <目录名> # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况网络 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程

Linux内核源码分析方法

Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些人都可以称得上一顶一的代码高手。透过阅读Linux 内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。 我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。这种“按需索取”的方式使得我们可以把握源码的主线,而非过度纠结于具体的细节。 2.内核的设计是优美的。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。但是我们都 知道软件执行效率和软件的可维护性很多情况下是背道而驰的。如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。 3.神奇的编程技巧。在一般的应用软件设计领域,编码的地位可能不被过度的重视,因为开发者更注重软件的良好设计,而编码仅仅是实现手段问题——就像拿斧子劈柴一样,不用太多的思考。但是这在内核中并不成立,好的编码设计带来的不光是可维护性的提高,甚至是代码性能的提升。 每个人对内核的了理解都会有所不同,随着我们对内核理解的不断加深,对其设计和实现的思想会有更多的思考和体会。因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。而我也并非内核源码方面的专家,这么做也只是希望分享我自己的分析源码的经验和心得,为那些需要的人提供参考和帮助,说的“冠冕堂皇”一点,也算是为计算机这个行业,尤其是在操作系统内核方面贡献自己的一份绵薄之力。闲话少叙(已经罗嗦了很多了,囧~),下面我就来分享一下自己的Linix内核源码分析方法。 二、内核源码难不难? 从本质上讲,分析Linux内核代码和看别人的代码没有什么两样,因为摆在你面前的一般都不是你自己写出来的代码。我们先举一个简单的例子,一个陌生人随便给你一个程序,并要你看完源码后讲解一下程序的功能的设计,我想很多自我感觉编程能力还可以的人肯定觉得这没什么,只要我耐心的把他的代码从头到尾看完,肯定能找到答案,并且事实确实是如此。那么现在换一个假设,如果这个人是Linus,给你的就是Linux内核的一个模块的代码,你还会觉得依然那么 轻松吗?不少人可能会有所犹豫。同样是陌生人(Linus要是认识你的话当然不算,呵呵~)给 你的代码,为什么给我们的感觉大相径庭呢?我觉得有以下原因:

Linux内核源代码解读

Linux内核源代码解读!! 悬赏分:5 - 提问时间2007-1-24 16:28 问题为何被关闭 赵炯书中,Bootsect代码中有 mov ax , #BOOTSEG 等 我曾自学过80x86汇编,没有见过#的用法,在这为什么要用#? 另外, JMPI 的用法是什么?与JMP的区别是什么? 提问者: Linux探索者 - 一级 答复共 1 条 检举 系统初始化程序 boot.s 的分析 [转] 系统初始化程序 boot.s 的分析: 阚志刚,2000/03/20下午,在前人的基础之上进行整理完善 ******************************************************************************** ************** boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there. 当PC 机启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入0x7C00(31K;0111,1100,0000,0000),并开始执行此处的代码。这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自己装入到绝对地址0x90000(576K; 1001,0000,0000,0000,0000),再将其后的2k字节装入到地址0x90200(576.5k;1001,0000,0010,0000,0000)处,最后将核心的其余部分装入到0x10000(64k; 1,0000,0000,0000,0000). It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in it's own tables, and enable interrupts as needed. 然后,关掉所有中断,把系统下移到0x0000(0k;0000,0000,0000,0000,0000)处,改变到保护模式,然后开始系统的运行.系统必须重新在保护模式下初始化自己的系统表格,并且打开所需的中断. NOTE 1! currently system is at most 8*65536(8*64k=512k; 1000,0000,0000,0000,0000) bytes long. This should be no problem, even in the future. I want to keep it simple. This 512 kB kernel size should be enough - in fact more would mean we'd have to move not just these start-up routines, but also do something about the cache-memory

Linux查看系统各项配置信息

Linux大部分操作是通过命令实现的,并不像windows那么直观。linux查看硬件信息也是需要通过linux查看硬件 信息命令查询的 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量 资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh<目录名> # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载 磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备) # dmesg | grep IDE # 查看启动时IDE设备检测状况 网络 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息 进程 # ps -ef # 查看所有进程 # top # 实时显示进程状态 用户 # w # 查看活动用户 # id <用户名> # 查看指定用户信息 # last # 查看用户登录日志

相关文档
相关文档 最新文档