绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
http://lwn.net/Articles/2.6-kernel-api/的翻译
2020-05-19 10:41:22

没有特别追求符合原文,就是大致表达那个意思。贴在这里,希望能提供一点有用的东西。

原文地址:http://lwn.net/Articles/2.6-kernel-api/

--------------------
2.6内核系列的API改变
由corbet在2006年5月11日提交

2.6内核的开发系列不同于它原来的,它变得更大,并且潜在的不稳定的改变被合并到每个发布版。在这些改变中有内部编程接口的修改,是针对内核的。结果是内核开发者必须更努力工作,来跟上持续切换的API。内核内部API的稳定从来不是持续的-即使在稳定的开发系列中-但是现在的改变更多了。

这一文章将会被更新,跟踪每个2.6内核版本的内部改变。它的的位置是:
http://lwn.net/Articles/2.6-kernel-api/
这一页,毫无疑问的,将在一段时间中是不完善的。如果你看起来觉得冗长,请让我们知道,通过发送一个信息到kernel@lwn.net,而不是在这里发表评论。确定升级的机会是很高的,这一文章将不会因为多余的评论而混乱,我们愿意把信任交给你。
如果你是一个《Linux设备驱动(第三版)》的读者,查找那书发布以来的改变:LDD3用的是2.6.10的内核,那么有关2.6.11的改变是相关的。

上次更新:2008年4月29日

2.6.25(2008年4月16日)

低层次的设备模型API有很多改变,是用来处理kobject和kset的。这些改变依次强制在整个源码树上的一个很大数量的调整。请看Documentation/kobject.txt,查看新的API的概述。

有一系列新的安全模块功能,处理文件系统挂载和卸载操作。

chained scatterlist API被增加,和sg_table补丁一起。

对块请求完成API有一些改变。请看http://lwn.net/Articles/266914/,了解新的做这一事情的方法。

很大数量的 SUNRPC 符号被改变到GPL形式的导出。

flatmem和discontigmem内存模型在64位x86体系上被移除;sparsemem被用在所有的建立上。

fastcall 函数在x86体系上没有做任何事情,所以它被移除了。

x86平台增加了一些函数,用来操作页面属性。他们是:
set_memory_uc(unsigned long addr, int numpages); /* Uncached */
set_memory_wb(unsigned long addr, int numpages); /* Cached */
set_memory_x(unsigned long addr, int numpages); /* Executable */
set_memory_nx(unsigned long addr, int numpages); /* Non-executable */
set_memory_ro(unsigned long addr, int numpages); /* Read-only */
set_memory_rw(unsigned long addr, int numpages); /* Read-write */
还有一些set_pages_* 函数使用 struct page 指针,而不是一个开始地址。

早期的启动调试,在x86平台上,通过FireWire端口,现在被支持了。

Bidirectional 命令支持被增加到SCSI层。

有一个新的进程状态称为TASK_KILLABLE。它是一个堵塞状态,类似于TASK_UNINTERRUPTIBLE,不同在于唤醒发生在有一个严重错误信号发生。这个想法是允许(基本上这样)不可中断的睡眠,但是仍然允许进程被直接杀掉-这样不可杀死的进程停留在“D”状态。有一些新的函数用来使用这一状态:wait_event_killable(),schedule_timeout_killable(), mutex_lock_killable(), 等

add_disk_randomness() 不再被导出,因为树中没有用户在用。

pci_enable_device_bars() 被用两个函数替换:pci_enable_device_io() 和 pci_enable_device_mem()。

高分辨率的计时器API被增大为:
unsigned long hrtimer_forward_now(struct hrtimer *timer,
ktime_t interval);
它将移动给定的计时器的呼气知道过了当前时间,由相关的时钟决定的。

device结构现在有一个指针指向一个device_dma_parameters 结构:
struct device_dma_parameters {
unsigned int max_segment_size;
unsigned long segment_boundary_mask;
};
这些层被DMA映射层(和IOMMU特别的映射代码)使用,来确定I/O操作被约束在设备上。PCI层支持这一特征用两个函数:
int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);
int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask);
设备驱动,使用不常用的严格的DMA限制应该使用这些函数来确定约束的使用。

许多nopage()方法没有用新的fault()API来替换;短期的计划是也移除nopage()。请看http://lwn.net/Articles/242625/,有关“页面不存在”的处理的新方法。

一个通用的资源计数机制以内存控制补丁的形式合并;请看<linux/res_counter.h>,查看更多的细节。

reserve_bootmem() 有一个新的标记参数。许多调用者将它设置为BOOTMEM_DEFAULT;kdump的代码,使用BOOTMEM_EXCLUSIVE 来确定它是的访问内存的。

许多体系现在支持cmpxchg64() 和 cmpxchg_local()。

一系列新的字符串函数:
extern int strict_strtoul(const char *string, unsigned int base,
unsigned long *result);
extern int strict_strtol(const char *string, unsigned int base,
long *result);
extern int strict_strtoull(const char *string, unsigned int base,
unsigned long long *result);
extern int strict_strtoll(const char *string, unsigned int base,
long long *result);
这些函数转换给定的字符串为各种形式的long值,但他们将返回一个错误的状态,如果给定的string值不表示一个合适的整形值。这些函数现在用来分析内核参数。


2.6.24(2008年1月24日)

i386/x86_64 architecture merger在这里内核系列中存在。结果是一个单一的体系,叫做x86,可以用来为32位和64位的处理器编译。

Video4Linux 层有一些新的内部支持,针对一些复杂的设备调用,多于一个设备(许多V4L2设备包含,至少,分离的驱动为控制器和感应器)。

也是在Video4Linux中:video-buf 层被用一个更通用的实现替换,可以为更大范围的设备工作(包括USB设备和不支持scatter/gather DMA的)。

NAPI 接口,在网络驱动中使用的,重新工作(http://lwn.net/Articles/244640/),更好地支持有多条传输序列的设备。

网络层有一个新的函数打印MAC地址:
char *print_mac(char *buf, const u8 *addr);
buf应该用DECLARE_MAC_BUF()来声明;输出可以在printk用“%%s”来格式化。

NETIF_F_LLTX (少锁的转换)标记,对网络设备的,已经不再使用,并应该在新的代码中不使用。

ktime_sub_us() 和 ktime_sub_ns() 被增加;他们减去给定的数量的微秒和纳秒,从一个ktime_t值中。

hard_header() 方法从struct net_device中移除;它用一个预协议的header_ops 结构指针替换。

debugfs 文件系统有一些新的函数(debugfs_create_x8(), debugfs_create_x16(), debugfs_create_x32()),让它更容易地导出文件包含的十六进制数字。

各种小的sysfs相关的API改变产生。name字段从kobject结构中移除。用户事件回调的原型被改变。许多子系统相关的调用被移除。子系统从来不真正做什么事情,get_bus() 和 put_bus()不再存在。

一个新的值DMA_MASK_NONE能被存储在device结构的dma_mask 字段来指示设备不能做DMA。

VFS 有一系列新的地址空间操作(write_begin() 和 write_end())。目标在于修改一些死锁场景;请看http://lwn.net/Articles/254856/。

scatterlist chaining 补丁被合并,许多内核的地方被更新,使用这一特征。

CFLAGS= 和 CPPFLAGS= 选项现在和内核编译系统一起工作,以理想的状态。标记被分别传递给C编译器和预处理器。

slab构建回调函数的原型改为:
void (*ctor)(struct kmem_cache *cache, void *object);
不用的flags参数被移除,其他两个参数的顺序被保留以适应其他的slab函数。

DECLARE_MUTEX_LOCKED() 宏被移除。

SA_* 系列长的不用的宏被移除,更青睐于用IRQF_* 这等价形式。

一些块层实体原型被改变。明显的改变,可能是,bio_endio()和相关的bio_end_io_t:
void bio_endio(struct bio *bio, int error);
typedef void (bio_end_io_t) (struct bio *, int);
这些函数并不总是完成整个的BIO,所以size参数被移除。

paravirt_ops 结构被拆分为更小的,更特别的操作向量。这包含pv_init_ops (启动时间操作),pv_time_ops (时间相关操作),pv_cpu_ops (特权指令),pv_irq_ops (中断处理),pv_mmu_ops (页表管理)和一些其他的。

这是一些新增加的位操作:
int test_and_set_bit_lock(unsigned long nr, unsigned long *addr);
void clear_bit_unlock(unsigned long nr, unsigned long *addr);
void __clear_bit_unlock(unsigned long nr, unsigned long *addr);
这些操作致力于创建单一位的锁定;他们工作不需要任何附加内存屏障。

有一个新的KERN_CONT 优先级为printk。它事实上是空的;它意味着是printk调用的一个标记,继续前一个(不用新行符结束)打印行。

文件系统的导出操作,使文件系统在一些协议如NFS上是可用的,被重写。两个新的方法(fh_to_dentry() and fh_to_parent())替换了旧的get_dentry() 接口。这是一个新的结构(struct fid),用来描述文件句柄。这一工作目标在于使导出接口更早可用,并(终)支持64位inode节点号。

virtio补丁,提供了一个基础,给I/O的进入和虚拟客户的退出-被合并。

2.6.23(2007年10月9日)

UIO接口,用来创建用户空间的驱动,被合并了。当UIO专注于用户空间时,有一个组件,用来做驱动的注册和中断处理。

unregister_chrdev() 现在返回void。

现在有一个新的通知链,能被用来(通过register_pm_notifier()调用),获取通知,在休眠操作之前或之后。

新的“lockstat”结构,提供静态信息,在花费用来等待和保持锁定的时间线程数量上。

新的fault() VMA操作替换了nopage() 和 populate()。请看http://lwn.net/Articles/242625/,有当前的fault()API的描述。

通用的netlink API现在能够注册(和解除注册)多个组,立即的。

结构的意见被从kmem_cache_create()中移除,因为解构不再被支持。所有在内核的调用器被更新了。

有一个新的clone() 标记-CLONE_NEWUSER -它创建一个新的用户命名空间,为进程;它主要用于容器系统。

有一个新的rtnetlink API,用来管理软件网络设备。

网络设备核心现在可以和有多个传输队列的设备一起工作。这是一个特征,需要被用来支持一些无线设备。

sysfs核心被值得注目地重写,以削弱连接,在sysfs实体和内部kobject对象之间。新的代码应该让生活更容易,对驱动的编写者来说,将有更少的对象循环问题需要担心。

从来没被使用的enable_wake() PCI驱动方法被移除。

想从PCI配置空间获取修订ID,应该现在只使用值,这个值是pci_dev 结构的新的revision 成员。所有源码树中的驱动,已经被修改,来使用这一方法。

SCSI层获取一系列scatter/gather 的辅助功能-scsi_dma_map() 和scsi_dma_unmap() -为一系列scatter/gather列表和双向请求准备。大多数驱动,在内核中的,已经更新,来使用这些函数。

idr代码有一系列辅助函数:idr_for_each() and idr_remove_all()。

sys_ioctl()不再被导出到模块。

页面表辅助函数ptep_establish(), ptep_test_and_clear_dirty() 和 ptep_clear_flush_dirty(),已经被移除-在内核中他们没有被使用。

内核线程默认是不冻结的;任一内核线程应该被冻结,为了一个挂起到磁盘的操作,应该现在调用 set_freezable() 来安排这一事情的发生。

SLUB分配算符现在是默认的。

新的函数is_owner_or_cap(inode),测试访问权限的,基于当前的fsuid和承受力;它替换之前在多个文件系统中发现的开放代码的测试。

这是一个新的有用的函数:
char *kstrndup(const char *s, size_t max, gfp_t gfp);
这一函数复制一个字符串,沿着用户空间的strndup()函数。


2.6.22(2007年7月8日)

mac80211(以前的Devicescape),无限栈被合并,创建了一整套新的API,以创建无线驱动,特别是那些需要软件MAC支持的。

eth_type_trans() 函数现在设置 skb->dev 区域,保持一致,和类似的函数,用作其他链接类型操作的。结果是,许多以太网驱动被改变用来移除多余的赋值。

sk_buff 结构的头部区域被重新命名,也不是union了。网络代码和驱动现在可以只使用skb->transport_header, skb->network_header, 和 skb->mac_header。有一些新的函数,可用来发现特别的包的头:tcp_hdr(), udp_hdr(), ipip_hdr(), 和 ipipv6_hdr()。

同样在网络区域:包调度器被重写以使用ktime 值,而不是jiffies。

i2c层有一些新的改变,使i2c驱动看起来更像其他线路的驱动。那就是说,比如,新的probe() 和 remove() 方法,用来做设备通知的,当i2c外围来和走的时候。既然i2c不是一个自我描述的总线,仍然需要代码支持,来帮助知道i2c设备可能在哪里;对很多设备类来说,这一信息可从系统BIOS中获取。

加密API有一系列新的函数可以使用,带有异步的密码块。有一个新的cryptd内核线程,能把任何同步密码运行在异步的状态下。

subsystem 结构被移除,从linux设备模型中;从来没有哪里真正需要它。大多代码应该有一个struct subsystem 参数的,被改变,使用了相关的kset 来代替。

有一个新的版本的内核内置rpcbind (portmapper) 客户端,它支持2-4的版本的rpcbind 协议。结果是portmapper API被改变了。

大量的改变赋予了paravirt_ops方法。另外,paravirt_ops不再只是一个GPL的导出。

一个新的成员函数:
void *krealloc(const void *p, size_t new_size, gfp_t flags);
正想所期望的,它改变分配内存的大小,如果需要的话移动它。

SLUB allocator被合并,作为一个试验性(现在来说)的交互,对于slab代码。SLUB API通常符合slab,但对0长度的分配的处理有些改变。http://lwn.net/Articles/236920/

一个新的宏被增加,使slab cashes的创建更容易:
struct kmem_cache KMEM_CACHE(struct-type, flags);
结果是缓存保持对象struct_type的创建,在那一类型后命名,并且有辅助的slab标记(如果有的话)。

SLAB_DEBUG_INITIAL标记被移除,相关的SLAB_CTOR_VERIFY 标记被传递给构造函数。结果是一系列改变,在一些源文件中进行。没哟被使用的SLAB_CTOR_ATOMIC 标记也不存在了。

SuperH 体系现在又可以和kgdb一起工作了。

ia64 体系有一个新的工具,将注射机器检查错误到一个运行的系统。对称为产品的机器来说不需要。

deferrable timers patch补丁被合并。还有一个宏,用来初始化工作队列实体(INIT_DELAYED_WORK_DEFERRABLE()),引起任务以一种听从的方式被排队。

旧的SA_* 标记作为原来的计划安排,还没有移除,但是使用他们将在编译时产生一些警告。

有一个新的list_first_entry() 宏,令人惊讶地,从一个列表中得到个实体。

atomic64_t和local_t类型现在完全支持一个广泛的体系。

工作队列(Workqueue )被重写了。这里是新的函数:
void cancel_work_sync(struct work_struct *work);
这一函数试图去取消一个单一的工作队列实体,但它是在共享(keventd)或一个私有的工作队列。同时run_scheduled_work() 也被移除。


2.6.21(2007年4月25日)

sysfs现在支持“影子目录”的概念-一个目录的多个版本使用同一个名字。这一特征被用来和容器应用程序一起,允许每个命名空间有资源(例如,网络接口)使用同样的名字。到那之后,两个新的函数被增加了:
int sysfs_make_shadowed_dir(struct kobject *kobj,
void *(*follow_link)(struct dentry *,
struct nameidata *));
struct dentry *sysfs_create_shadow_dir(struct kobject *kobj);
sysfs_make_shadowed_dir() 为一个kobject使用存在的目录,并且让它被阴影化-有能力拥有多个实例。follow_link() 方法必须挑选出任何给定条件的正确版本。一个对sysfs_create_shadow_dir() 的调用将创建一个新的目录实例,它已经被阴影化。
注意到这一特征将在2.6.22中被改变。

一系列kobject函数-kobject_init(), kobject_del(), kobject_unregister(), kset_register(), kset_unregister(), subsystem_register(), subsystem_unregister(), 和 subsys_create_file()-现在如果传送一个NULL指针,会返回无害的。

许多内核子系统使用了class_device 结构,改为使用struct device 代替;这一工作朝向一个长期的目标,从类树改为用一个单一的设备树在sysfs中。

有一个新的函数:
int device_schedule_callback(struct device *dev,
void (*func)(struct device *))
这一函数安排func()被调用在一些未来的时间,在进程上下文。这意味着要允许设备的属性来反注册他们自己,但也可以想象其他的应用程序。

在芯片层(ASoC)上的ALSA系统提供扩展支持,为实现声音驱动,在嵌入式系统上;请看文档文件,内核中的,里面有很多细节信息。

有效的改变被用到秘密支持接口上。

设备资源管理补丁,让大量的驱动代码更容易被写,已经被合并了。

DMA 内存区(ZONE_DMA)现在是可选的,并且可以不出现在任何内核中。

local_t 类型在不同体系中一致化,并且得到了一些文档。

nopfn() 地址空间操作现在能返回NOPFN_REFAULT来表明严重错误指令应该被重新执行。

一个新的函数,vm_insert_pfn(),允许插入一个新的页面到一个进程地址空间,通过页面帧计数。

一个新的驱动API,针对通用目的的I/O信号已经被增加了。

sysctl代码已经被大量重写,导致一些内部API的改变。

时钟事件和动态tick补丁被合并。大多数代码将不要求改变,但是内核开发者应该知道代码依赖于jiffies。

2.6.20(2007年2月4日)

工作队列API已经是主要被重写,也需要在所有使用工作队列的代码中做更改。简短来说:存在两种不同类型的工作队列,依赖于什么延迟特征被使用或没有使用。工作函数不再得到一个随意的数据指针;它的参数,替代来说,是一个work_struct结构的指针,描述这一工作。如果你有代码被这些改变破坏了,David Howells 的这些指令集是有用的。

一些附加的工作队列改变被合并了。有一个新的“冻结”工作队列类型,表明工作队列可以被安全地冻结,在软件挂起过程中。新的函数create_freezeable_workqueue()将创建一个。另一个新的函数,run_scheduled_work(),将引起一个前面的调度的工作队列实体被异步运行。注意到run_scheduled_work() 不能被延迟队列使用。

许多sysfs相关的代码被改变,用来使用struct device代替struct class_device。后面的一种方法终将被取消,因为类和设备机制要合并。

有一个新的函数:
int device_move(struct device *dev, struct device *new_parent);
这一函数将重新指定一个父给new_parent,让要求的sysfs改变并产生一个特别的KOBJ_MOVE 事件,在用户空间中。

一些数量的内核头文件将包含其他头,不再这样做。比如,<linux/fs.h> 不再包含 <linux/sched.h>。这些改变将会加速内核编译时间,通过减少大量的不必要的包含,但可能破坏一些不再源码树中的模块,他们没有显示地包含他们需要的头文件。

内部的__alloc_skb() 函数有一个新的参数,是NUMA节点的数量,这一结构应该被分配。

slab分配器API已经被或多或少地清除。旧的kmem_cache_t定义不再需要;struct kmem_cache 应该被用来代替。变化的slab标记(SLAB_ATOMIC, SLAB_KERNEL, ...),是等价的GFP_标记的别名,所以他们被移除。

一个新的启动时间参数(prof=sleep),引起内核概括不间断的睡眠的时间花费。

dma_cache_sync()有一个新的参数:device 结构给做DMA的设备。

paravirt_ops 代码不再使用,让内核更容易支持多管理程序。任何人想移植一个管理程序到这代码上应该注意到是违反原则的,并且看起来保持那一方法一段时间。

struct path 的改变被合并,包括波动到文件系统和设备驱动子系统的改变。简短地说,访问dentry指针的代码来自结构file的指针,用来读file->f_dentry,现在应该读file->f_path.dentry。当然还存在定义可以让旧的代码工作。

针对客户输入设备有一个通用层;USB HID 代码在这一新层上被切换。

一个新的函数round_jiffies(),使一个jiffies值趋向下一整秒(增加一个每CPU的偏移)。它的目的是鼓励休息在一起发生,结果是CPU醒来的频率更少。

“活动函数”块,一个回调,用软件来实现磁盘活动灯,已经被移除;没有人想实际地去使用它。


2.6.19(2006年11月29日)

中断处理函数原型被改变。简短地说,regs 参数被移除,因为基本上没有人使用它。任何中断处理,需要预先中断的注册状态,使用 get_irq_regs() 来获取。

latency tracking infrastructure patch补丁被合并。

readv() 和 writev() 方法,在file_operations 结构中,已经被移除,以有利于aio_readv() 和 aio_writev() (原型被改变了)。请看这篇文章:http://lwn.net/Articles/202449/。

no_pfn() 地址空间操作被增加。

SRCU- 一个版本的“读复制更新”,可允许读时阻塞-已经被合并了。请看http://lwn.net/Articles/202847/,Paul McKenney 写的,有很多细节。

CHECKSUM_HW 值在网络子系统中被使用,来支持硬件校验。这一值被替换,用CHECKSUM_PARTIAL(针对出去的包,这个工作应该由硬件来完成)和CHECKSUM_COMPLETE (针对进来的包,由硬件来完成)。

一些数量的内存管理改变被合并,包括跟踪脏页面,在共享内存映射中,使DMA32 和 HIGHMEM 区是可选的,和一个体系独立的机制,对跟踪内存范围(和他们之间的洞)。

pud_page()和pgd_page() 宏现在返回一个struct page 指针,而不是一个内核虚拟地址。代码需要后者使用pud_page_vaddr() 或 pgd_page_vaddr() 。

一定数量的驱动核心改变包括实验性的并行设备探测和一些挂起/继续过程的提高。

有一个通知器链针对内存用完的情况;这一想法在这里是安装函数,这函数可能在内存紧张的时候释放内存。

kmap() API的语义被改变了一点:在复杂的内存一致问题的体系上,kmap() 和 kunmap() 被期望管理映射页面的一致,这消除了要显示地刷新缓存中的页面。

PCI快速的错误报告现在支持PCI层。

一定数量的改变被用到inode结构上,这份努力是为了让它更小。

许多提高,挂起和继续支持USB层。

一系列新的函数被增加,以允许USB驱动快速检查一个终点的方向和传输模式。

一个有点减缩的无线扩展21。许多原来的功能被移除,这是因为无线扩展可能随后被一些其他的东西替代。

大数量的符号允许sparse实体检测 big/little endian(高低字节存储方式)错误。

struct request 结构的标记字段已经被分为两个字段: cmd_type和cmd_flags。前一个包含一个值描述请求的类型(文件系统请求,感知,电源管理等),而后者修改命令工作的方式(读/写,阻挡等)。

块层在内核配置时间能被完全禁止;这一选项能被用在一些嵌入式环境中。

内核现在有一个通用的布尔类型,叫做bool;它替换了一些数量的自有的boolean类型,在内核的各个地方。

现在有一个新的函数分配一个块内存的复制:
void *kmemdup(const void *src, size_t len, gfp_t gfp);
一些数量的分配后复制代码序列已经被更新,用 kmemdup() 代替。


2.6.18(2006年9月19日)

Video4Linux 2的API被改变:大量的ioctl() 方法被移动到V4L2代码里。视频驱动提供了一个非常长的方法列表,特别为这些ioctl() 命令而准备。请看<media/v4l2-dev.h>。

通用的IRQ层被合并。SA_* 标记用于request_irq() 的,被重新命名;新的前缀是IRQF_。一个长的系列的补丁转换源码树中的驱动为新的名字;旧的名字将安排在2007年一月被移除。

64位资源现在被支持。这一改变影响了一部分资源管理API的用户。

内核锁定验证器被引入,和一系列由这个验证器发现的潜在的死锁的修正。

终于,devfs子系统被移除。

一个API和支持针对Intel I/OAT DMA 引擎。

skb_linearize() 函数被重写,不再有一个GFP标记参数。
同时有一个新的函数skb_linearize_cow() ,来确认SKB的结果是可写的。

网络驱动不再操作xmit_lock 这一spinlock锁定,它在net_device 结构中;取而代之的是,下面的新函数被使用:
int netif_tx_lock(struct net_device *dev);
int netif_tx_lock_bh(struct net_device *dev);
void netif_tx_unlock(struct net_device *dev);
void netif_tx_unlock_bh(struct net_device *dev);
int netif_tx_trylock(struct net_device *dev);

长的不再使用的inter_module API终也被移除了。

新的内核API被提供,可以访问“inotify”这一功能。

旧的scsi_request基础结构被移除,因为在源码树中不再有任何驱动使用它。

包含文件<linux/usb_input.h>现在改为<linux/usb/input.h>。

VFS的get_sb() 文件系统方法有一个新的原型:
int (*get_sb)(struct file_system_type fstype, int flags,
const char *dev_name, void *data,
struct vfsmount *mnt);
mnt参数是新的;它允许文件系统接收一个指针到目标挂载点结构。这个挂载点应该关联get_sb() 方法中的superblock ,通过一个调用:
int simple_set_mnt(struct vfsmount *mnt, struct super_block *sb);
get_sb() 的返回值被改变为一个int型错误状态。各种get_sb_*() 函数有同样的改变被应用。所有这些工作的目的是允许NFS来通过挂载点共享superblock。

statfs()这一操作有一个新的原型:
int (*statfs)(struct dentry *dentry, struct kstatfs *stats);
旧的struct super_block指针现在由一个dentry 指针代替.

一些函数被增加,可以让内核代码更方便地分配一个缓存,使用vmalloc(),并且映射它到用户空间。他们是:
void *vmalloc_user(unsigned long size);
void *vmalloc_32_user(unsigned long size);
int remap_vmalloc_range(struct vm_area_struct *vma, void *addr,
unsigned long pgoff);
前两个函数是vmalloc() 的变体,可以获取要映射到用户空间的内存;在其他的事情中,他们清零整个范围,来避免数据泄露。vmalloc_32_user()只分配低端内存。一个对remap_vmalloc_range() 的调用将完成这个工作;它将拒绝,无论如何,重映射内存没有使用上面的两个函数中任一个分配。

read-copy-update API现在只访问GPL协议的模块。不推荐的函数 synchronize_kernel() 被移除。

有一个新的库函数strstrip() ,可以移除一个字符串的前后空格。

一个新的宏WARN_ON_ONCE ,将测试一个条件,并且给出提示,如果那个条件为真-但仅仅每次启动只有一次。

一定数量的加密API改变被合并,大的改变是,大多数算法函数,用一个指针指向crypto_tfm结构,而不是旧的“context”指针。这一改变需要用来支持参数化的算法。

有一个新的make目标,为“headers_install”。它的目的是安装一系列内核头,用于库和用户空间的工具。一定限制的部分头被安装,这些头在目标目录中被sanitized(整理?)。希望未来发行人将使用这一机制来安装内核头文件。


2.6.17(2006年6月17日)

支持SPARC 平台的“Niagara”体系。

EXPORT_SYMBOL_GPL_FUTURE()被并入。

safe notifier patch补丁被并入,创建了一个新的API给所有通知的用户。

SLAB_NO_REAP slab缓存选项,当系统在内存压力下,引起slab不能被整理干净,已经被移除。kmem_cache_t定义也被淘汰,而青睐于struct kmem_cache。

“softmac”802.11子系统被并入。这一代码可能终被淘汰,而用Devicescape 的代码。

有一个新的实时时钟子系统,提供通用化的RTC支持和一个被很好定义的驱动接口。

一个新的实用函数被增加:
int execute_in_process_context(void (*fn)(void *data),
void *data,
struct execute_work *work);
这一函数将安排fn() 被调用,在一个进程(它可以是睡眠的)上下文中。依赖于execute_in_process_context() 什么时候被调用,fn() 将被调用立即地,或者在一个工作队列中延迟调用。

SMP alternatives补丁被并入。

relayfs API被重写-但是sysfs接口现在没有考虑。

针对开发者调试块子系统代码有一个新的跟踪机制。

一个新的内部标记被使用FMODE_EXEC,来表明一个文件被打开,被执行。

旧的MODULE_PARM() 宏再也不存在了。

一个新的函数,flush_anon_page(),可被用来联合get_user_pages() ,来安全地执行DMA,在用户空间的匿名页上。

零填充内存现在可以从slab缓存重用kmem_cache_zalloc()分配。有一个新的slab调试选项,来创建一个/proc/slab_allocators 文件,包含详细的分配信息。

有四种新的方法创建mempool(内存池):
mempool_t *mempool_create_page_pool(int min_nr, int order);
mempool_t *mempool_create_kmalloc_pool(int min_nr, size_t size);
mempool_t *mempool_create_kzalloc_pool(int min_nr, size_t size);
mempool_t *mempool_create_slab_pool(int min_nr,
struct kmem_cache *cache);
个创建一个内存池,分配整个页(数量由order决定),第二个和第三个分别通过kmalloc() 和 kzalloc()来调用。第四个是创建slab支持的内存池的简短形式。

hrtimer_forward() 原型被改变:
unsigned long hrtimer_forward(struct hrtimer *timer,
ktime_t now, ktime_t interval);
新的now参数理应是当前的时间。这一改变允许一些调用被优化。data字段也被从hrtimer结构中移除。

整个的通用的对位的操作集(找出个集,计算集合中位的数量,等)被增加,帮助在不同体系和子系统中统一代码。

inode 的f_ops 指针-file_operations 结构中与打开文件有关-已经被标记为const。很有一部分代码,改变那一结构的,做了改变。同样的改变在很多文件系统存在。“目标一是增加正确性(难以预料偶然的写到共享结构中),二是缩减共享缓存行的失败,如果.data中不整洁(当.rodata置为只读时,缓存才是干净的)。”

local_t现在是一个带符号类型。

sysfs中的属性现在可以poll化(http://lwn.net/Articles/174660/)。

class_device 现在有在注册时创建的属性组;要体会这一优点,存储你的groups到新的groups字段中。(原文中有个单词写错了,groups写为gropus)

splice(), vmsplice(),和tee()系统调用被并入。支持这些调用需要实现两个新的file_operations 方法。请看http://lwn.net/Articles/180620/,那里有splice_read() 和 splice_write() 函数的后的形式。


2.6.16(2006年3月19日)

http://lwn.net/Articles/167034/中代码被并入。信号量的相互排除现在是不被推荐使用的,当前的信号量API可能也会一起不再被推荐使用。

高分辨率内核时钟代码被并入。新的API允许时间值的大的精度,虽然下面的实现仍然有限制,由时钟中断解析而引起的。

一个新的列表函数,list_for_each_entry_safe_reverse(),就做所期望的那样的。

一个64位的原子类型,atomic_long_t,被增加。支持的函数有:
long atomic_long_read(atomic_long_t *l);
void atomic_long_set(atomic_long_t *l, long i);
void atomic_long_inc(atomic_long_t *l);
void atomic_long_dec(atomic_long_t *l);
void atomic_long_add(long i, atomic_long_t *l);
void atomic_long_sub(long i, atomic_long_t *l);

SLOB内存分配器被并入。SLOB是一个对slab分配器的顺便的替换,用于非常低内存的系统。

dentry 结构被改变:d_child 和 d_rcu 字段现在覆盖在一个union中。这一改变收缩了这一重要使用的结构,并且提高了它的缓存行为。

usb_driver 结构有一个新的字段(no_dynamic_id),让一个驱动禁用增加的动态设备的ID。owner 字段也从这一结构中移除。

device probe() 和 remove() 方法被从struct device_driver 移动到struct bus_type。总线级别的方法将覆盖任何的存在的驱动方法。

一个有效的改变,给SCSI子系统的,用于消除旧的scsi_request结构的使用。SCSI软件IRQ不再被使用;后处理通过通用的块软件IRQ来代替。

大多数内核设备模型代码被再改造,使用“uevent”来代替“hotplug”。一些改变在核心代码外可见的改变包括:
kobject_hotplug() 变为 kobject_uevent()
struct kset_hotplug_ops 变为 struct kset_uevent_ops, 同时它的 hotplug() 成员现在是 uevent()
add_hotplug_env_var() 变为 add_uevent_var()

块I/O的barrier代码被重写。这一补丁改变barrier 的API,也增加了一个新的参数给end_that_request_last()。

block_device_operations 结构有一个新的方法getgeo();它的工作是填充一个hd_geometry 结构,使用驱动器的信息。使用这一适当的操作,许多块驱动不再需要一个ioctl()函数。

http://lwn.net/Articles/143390/,PCI错误恢复补丁被并入。

gcc 3.2前的编译器不能再被用来编译内核。

如果内核被配置为在大小上优化,gcc(如果是4.x系列)有这样的自由,决定inline 函数是否真正inline 化。__always_inline 属性现在是强制在所有的情况下inline化的。这是在年初http://lwn.net/Articles/166172/中讨论的结果。

2.6.15(2006年1月2日)

http://lwn.net/Articles/156281/,nested的类设备补丁被并入。允许class_device 结构有其他的class_devices 作为父。这一补丁是一个让输入子系统和sysfs一起工作的修改。这一代码将会在未来再次被改变;请看 Greg Kroah-Hartman的文章http://lwn.net/Articles/162242/。

驱动模型类接口方法的原型, add() 和remove() 被有所改变;现在有一个新的interface 结构的参数指针。

一个新的platform_driver结构被增加,来描述编译到核心平台的设备的驱动。

struct device_driver 中的suspend() 和 resume() 方法原型被改变。他们在每个事件中也只被调用一次,而不是在之前的内核中的三次。

两个新的字段被增加到device_pm_info ,它控制驱动应该如何处理硬件创建的唤醒时间。详情看http://lwn.net/Articles/157949/。

有一个新的通知机制,当一个USB设备被增加(或移除)到系统中时,让感兴趣的设备知道。这一系统被一些核心代码使用;驱动一般不需要hook(挂钩)到上面。

gfp_t类型现在在整个内核中使用。如果你有一个函数,使用内存分配标记,它应该使用这一类型。

使用读/写信号量的代码可以现在使用rwsem_is_locked() 来测试信号量没有块操作时的读状态。

新的 vmalloc_node() 函数分配内存,在一个指定的NUMA 节点上。

对内存页的“保留”位,因为实际的原因,被移除。

vm_insert_page() 被增加,来让驱动更容易重新映射RAM到用户空间VMA中。

有一个新的kthread_stop_sem()函数可被用来停止一个内核线程,它可能正被阻塞在一个信号量上。

RapidIO 总线支持被并入主线开发中。见http://lwn.net/Articles/139118/。

netlink连接器机制让netlink代码更容易被写(http://lwn.net/Articles/131802/)。一个类型安全的netlink接口被增加,并在一些网络子系统中使用。

这些内核符号被“不导出”,并不再面向模块:clear_page_dirty_for_io, console_unblank, cpu_core_id hugetlb_total_pages, idle_cpu, nr_swap_pages, phys_proc_id, reprogram_timer, swapper_space, sysctl_overcommit_memory, sysctl_overcommit_ratio, sysctl_max_map_count, total_swap_pages, user_get_super, uts_sem, vm_acct_memory, vm_committed_space。

Video4Linux 的API的版本将在2006年7月被官方移除。

owner 字段被从 pci_driver 结构中移除。

SCSI 子系统的一系列定义(Scsi_Device, Scsi_Pointer, and Scsi_Host_Template)被移除。

DMA32 内存区被增加到x86-64体系;它的目的是可以更容易分配4GB下的内存(使用新的GFP_DMA32 标记)。

一个对rcu_barrier() 的调用将阻塞调用的进程,知道所有当前的RCU回调功能完成。


2.6.14(2005年10月27日)

一个新的PHY 抽象层被增加,用于网络驱动。

sk_buff 结构再次被改变;这一改变会强制一个重编译,但不会产生另外的问题。

无线扩展版本19被并入(http://lwn.net/Articles/150384/)。其他的事情有,net_device 结构中的get_wireless_stats()方法不被推荐使用。

klist 的API被改变(http://lwn.net/Articles/150675/)。klist_add_head() 和 klist_add_tail()的参数顺序被保留。当使用klist_init()初始化一个list时,需要提供函数的引用计数。

relayfs虚拟文件系统,增强了高速率的数据传输,在内核和用户空间之间,被并入进来。

kzalloc()被增加,用来获取一块被预先清零的内存(http://lwn.net/Articles/147014/)。

两个新版本的schedule_timeout()被增加(http://lwn.net/Articles/149019/)。

新的TASK_INTERACTIVE 状态标记告诉进程调度器在睡眠进程上不执行通常的那些计算。

SKB可被克隆,使用alloc_skb_fclone()。

一些新的辅助函数被增加,用于映射块I/O请求;详情请看http://lwn.net/Articles/151209/。

securityfs(http://lwn.net/Articles/153366/),一个虚拟文件系统,用于安全模块,被并入。


2.6.13(2005年8月28日)

HZ 常量在内核编译时可被配置。

计时器API现在包括try_to_del_timer_sync(),它产生一个努力,去删除这一计时器;在原子上下文中它可以被安全地调用。

block_device_operations 现在有一个unlocked_ioctl() 成员。

netif_rx()的返回值被改变;现在只返回NETIF_RX_SUCCESS 或 NETIF_RX_DROP。

pci_dma_burst_advice 可被PCI驱动使用,来达到理想的DMA传输的方法。

文本查找API(http://lwn.net/Articles/143447/)被增加。

一个新的内存分配函数kzalloc(),被增加(http://lwn.net/Articles/147014/)。

大量驱动核心的改变(https://lwn.net/Articles/140787/),包括class_simple 接口的移除和新sysfs设备结构的方法的原型。[FR]


2.6.12(2005年6月17日)

cancel_rearming_delayed_work()(http://lwn.net/Articles/126823/)被增加到工作队列API。

传递给usb_bulk_msg() 和 usb_control_msg() 的timeout值现在用毫秒表示代替了jiffies。

rwsem实现中的一个中断禁用spinlock被使用。当中断禁用时,调用任一down_read() 和 down_write() 的变体从来都是不正确的,但现在这种不正确性变小了。

net_device 结构中的字段被重新组织,将会破坏只有二进制形式的驱动。

kref_put() 现在返回一个int值:如果kref实际被释放,则为非零。

kobject_add() 和 kobject_del() 不再产生hotplug事件。如果你需要这些事件,你必须调用kobject_hotplug() 显式地。kobject_register() 和 kobject_unregister()仍然产生hotplug事件。

kobj_map() 不再有一个子系统参数;它使用一个指向互斥信号量的指针。

一个新的函数,sysfs_chmod_file(),允许在存在的sysfs属性上改变权限。

有一个新的sort()函数(http://lwn.net/Articles/127858/),应该被用来创建其他的实现。

一个新的属性(__nocast),被和sparse一起用,来禁用一些显式的cast和找出可能的bug。

io_remap_page_range() 现在不被推荐使用;使用io_remap_pfn_range() 来代替(http://lwn.net/Articles/129480/)。

一些函数被增加,用来和big-endian I/O内存一起工作(http://lwn.net/Articles/132804/)。

synchronize_kernel()(http://lwn.net/Articles/134484/)不被推荐使用。调用者应该使用synchronize_sched() (验证所有的进程是静默的)或synchronize_rcu(验证所有的处理器退出RCU关键段)。

blk_queue_ordered() 的flag参数,被改变,用来表明顺序写应该怎么被设备处理。可能的值是QUEUE_ORDERED_NONE (顺序化是不可能的),QUEUE_ORDERED_TAG(顺序化是强制的,并带有请求的标记),和QUEUE_ORDERED_FLUSH (顺序化用显式的flush命令来完成)。在后一种情况,请求序列有两个新的方法,prepare_flush_fn() 和 end_flush_fn(), 在一个barrier 请求之前或之后被调用。

一个新的函数,valid_signal(),应该被用来测试用户空间的信号数是否有效。

“原始开发者认证”(Developers Certificate of Origin)中,带有“Signed-off-by:”头这样的感谢性的文档被改变(http://lwn.net/Articles/139916/)。新的版本增加了一个条款,记录这些贡献-和相关的信息-是公共的信息,可被重新发布的。


2.6.11(2005年3月2日)

内核的read()和write()调用现在执行访问检查(http://lwn.net/Articles/122579/),在调用驱动,或文件系统相关的,file_operations的方法之前。

bcopy() 函数,在内核主线中不被使用,被移除了。

suspend() 方法的原型,在struct pci_driver 中,被改变(http://lwn.net/Articles/120614/);state参数现在是pm_message_t类型。

rwlock_is_locked() 宏被移除;代替的是,使用read_can_lock() 或 write_can_lock()。有一个新的spin_can_lock() 用于规则的spinlock。

三种等待完成的方法被增加:
wait_for_completion_interruptible(), wait_for_completion_timeout(), 和 wait_for_completion_interruptible_timeout()。

对USB驱动:usb_device_descriptor 和 usb_config_descriptor 结构现在保持所有的字段为little-endian形式。[GKH]

pci_set_power_state() 和 pci_enable_wake() 有新的原型:电源状态现在用pci_power_t类型表示,而不是int。[GKH]

内核信号量补丁(http://lwn.net/Articles/102253/)被并入。结果是,被lock_kernel() 保护的代码成为可取代的。这些改变将不会影响大多数代码,但可能会有意外。

file_operations 现在包含一个 unlocked_ioctl() (http://lwn.net/Articles/119652/)成员。如果这一成员不是NULL,它将优先于 ioctl() 方法调用-并且这一大的内核锁将不再保持。新代码应该使用unlocked_ioctl() ,程序员应该确认合适的锁定被执行过。
有一个新的compat_ioctl() 方法也被调用,如果出现,那是在一个32位进程在一个64位系统上调用ioctl()的时候。

spinlock的运行时初始化,将被转换,从一个分配形式(使用SPIN_LOCK_UNLOCKED),到显式使用spin_lock_init() 。还没有人提到要移除SPIN_LOCK_INIT,但是也要考虑到。如果http://lwn.net/Articles/107269/的实时取代补丁被应用,分配的这种形式将不再可能使用。

debugfs(http://lwn.net/Articles/115405/)被引入;它是一个虚拟文件系统,被内核hacker者使用,在想导出他们代码的调试信息的时候。

sysfs中的二进制属性现在提供mmap()支持;请看这一补丁:http://lwn.net/Articles/119570/。

四级页面表(http://lwn.net/Articles/117749/)被引入。这一改变影响很少的代码,但是,如果你手动要经过页面表树,你需要考虑到新的级别。

socket缓存能从 alloc_skb_from_cache()(http://lwn.net/Articles/117736/)中获取,它使用了一个slab缓存。

一个新的内存分配标记(__GFP_ZERO)被增加;它允许内核代码请求分配的内存已被清零。它是预清零补丁(http://lwn.net/Articles/117881/)的一部分,这一补丁还没被并入内核代码。

Linus重新实现了管道(http://lwn.net/Articles/118750/),使用了一个循环的缓存结构,这将终被变化到一个更通用的形式。

从struct subsystem中移除信号量的工作已经完成。如果你的代码依赖于信号量,好让它有所改变(不是必须的)。

2.6.10(2004年12月24日)

pci_enable_device()的调用是必须的,以使中断过程工作。[GKH]

一个新的函数,pci_dev_present(),能用来决定一个设备是否present,或者没有。[GKH]

pci_save_state()和pci_restore_state()的原型被改变:buffer参数不再需要(空间改在struct pci_dev中分配)。[GKH]

内核构造系统有所改变;内核的makefile体系现在是Kbuild体系。这一改变意味着,突出一个事实,就是内核的makefile与用户空间变化有些不同,如果一些makefiles被重命名的话,改动是小的。

add_timer_on(),sys_lseek(),一系列其他内核函数不再导出到模块。许多驱动核心的函数改为只是GPL方式的导出。

I/O空间写栅栏(http://lwn.net/Articles/103183/)现在被支持。

kunmap_atomic()的原型现在被改变(http://lwn.net/Articles/111226/)。这一改变不影响原有的写代码,但会产生警告,当一个struct page指针因错误传递给那个函数时。

atomic_inc_return()被增加,用来增加一个atomic_t变量值,并返回新值。

用处不多的BIO walking辅助函数(process_that_request_first())被移除。

remap_page_range()函数被改变(http://lwn.net/Articles/104333/)为remap_pfn_range();新的函数使用一个页面帧数来用于物理地址,而不是实际的地址。remap_page_range()现在仍支持。

wake_up_all_sync(),主线源码树中没有使用,被移除。

一个简单的,面向流的环路缓存实现(http://lwn.net/Articles/107314/)被增加。

内核事件机制(http://lwn.net/Articles/107314/)被并入,可以让用户空间得到相关的内核事件。

vfs_permission()被用generic_permission()替换,它对ACL检查有一个可选的回调过程。[MS]


2.6.9(2004年10月18日)

Kprobes(http://www-124.ibm.com/linux/projects/kprobes/)被并入,使其他的调试技术也存在。

spinlock现在实现有些不一致。这一改变将不会影响任何代码。

wait_event_timeout()被增加。

Kobject现在使用kref类型来处理引用计数。大多数代码不会受这一改变影响。

一系列新的访问I/O内存的函数(http://lwn.net/Articles/102232/)被引入。新的函数更清晰,并且是类型安全的,应该更优先于对readb()和类似函数的使用。新的ioport_map()函数可以把I/O端口当做I/O内存一样使用。

NETIF_F_LLTX(http://lwn.net/Articles/101215/)特征,面对net_devices的,告诉了网络子系统,驱动代码执行它自己的锁定,不需要在调用hard_start_xmit()前使用xmit_lock。

dma_declare_coherent_memory()被增加,来允许DMA函数处理内存定位在一个特定的设备上。

msleep_interruptible()被增加。

kref_put()的原型被改变;对release()函数的一个指针现在是需要的。


2.6.8(2004年8月13日)

在file_operations结构中的fcntl()方法,在2.6.6中增加的,被移除。它被用两个方法替换:check_flags()和dir_notify()。

nonseekable_open()(http://lwn.net/Articles/97154/)被增加,表示一个给定的文件是不可以seek的。

wait_event_interruptible_exclusive()被增加。

dma_get_required_mask()(http://lwn.net/Articles/90870/)被增加,作为驱动决定佳的DMA掩码的方法。

模块段信息被增加到/sys/module(http://lwn.net/Articles/90913/),使得更容易使用模块的符号调试器。

VFS的follow_link()方法有一些改变(http://lwn.net/Articles/91959/)。文件系统应该使用新的符号查找方法,这样内核可以终支持一个更好的链接深度。[MS]


文章来源CU社区:http://lwn.net/Articles/2.6-kernel-api/的翻译

分享好友

分享这个小栈给你的朋友们,一起进步吧。

内核源码
创建时间:2020-05-18 13:36:55
内核源码精华帖内容汇总
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~