当前位置:首页 » 操作系统 » linux内核api

linux内核api

发布时间: 2023-07-19 09:23:20

A. linux内核api man手册怎么建立

1. man
man,即 manunal,是 UNIX 系统手册的电子版本。根据习惯,UNIX 系统手册通常分为不同的部分(或小节,即 section),每个小节阐述不同的系统内容。目前的小节划分如下:

命令:普通用户命令
系统调用:内核接口
函数库调用:普通函数库中的函数
特殊文件:/dev 目录中的特殊文件
文件格式和约定:/etc/passwd 等文件的格式
游戏。
杂项和约定:标准文件系统布局、手册页结构等杂项内容
系统管理命令。
内核例程:非标准的手册小节。便于 Linux 内核的开发而包含
其他手册小节:

B. Linux进程的调度

上回书说到 Linux进程的由来 和 Linux进程的创建 ,其实在同一时刻只能支持有限个进程或线程同时运行(这取决于CPU核数量,基本上一个进程对应一个CPU),在一个运行的操作系统上可能运行着很多进程,如果运行的进程占据CPU的时间很长,就有可能导致其他进程饿死。为了解决这种问题,操作系统引入了 进程调度器 来进行进程的切换,轮流让各个进程使用CPU资源。

1)rq: 进程的运行队列( runqueue), 每个CPU对应一个 ,包含自旋锁(spinlock)、进程数量、用于公平调度的CFS信息结构、当前运行的进程描述符等。实际的进程队列用红黑树来维护(通过CFS信息结构来访问)。

2)cfs_rq: cfs调度的进程运行队列信息 ,包含红黑树的根结点、正在运行的进程指针、用于负载均衡的叶子队列等。

3)sched_entity: 把需要调度的东西抽象成调度实体 ,调度实体可以是进程、进程组、用户等。这里包含负载权重值、对应红黑树结点、 虚拟运行时vruntime 等。

4)sched_class:把 调度策略(算法)抽象成调度类 ,包含一组通用的调度操作接口。接口和实现是分离,可以根据调度接口去实现不同的调度算法,使一个Linux调度程序可以有多个不同的调度策略。

1) 关闭内核抢占 ,初始化部分变量。获取当前CPU的ID号,并赋值给局部变量CPU, 使rq指向CPU对应的运行队列 。 标识当前CPU发生任务切换 ,通知RCU更新状态,如果当前CPU处于rcu_read_lock状态,当前进程将会放入rnp-> blkd_tasks阻塞队列,并呈现在rnp-> gp_tasks链表中。 关闭本地中断 ,获取所要保护的运行队列的自旋锁, 为查找可运行进程做准备 。

2) 检查prev的状态,更新运行队列 。如果不是可运行状态,而且在内核态没被抢占,应该从运行队列中 删除prev进程 。如果是非阻塞挂起信号,而且状态为TASK_INTER-RUPTIBLE,就把该进程的状态设置为TASK_RUNNING,并将它 插入到运行队列 。

3)task_on_rq_queued(prev) 将pre进程插入到运行队列的队尾。

4)pick_next_task 选取将要执行的next进程。

5)context_switch(rq, prev, next)进行 进程上下文切换 。

1) 该进程分配的CPU时间片用完。

2) 该进程主动放弃CPU(例如IO操作)。

3) 某一进程抢占CPU获得执行机会。

Linux并没有使用x86 CPU自带的任务切换机制,需要通过手工的方式实现了切换。

进程创建后在内核的数据结构为task_struct , 该结构中有掩码属性cpus_allowed,4个核的CPU可以有4位掩码,如果CPU开启超线程,有一个8位掩码,进程可以运行在掩码位设置为1的CPU上。

Linux内核API提供了两个系统调用 ,让用户可以修改和查看当前的掩码:

1) sched_setaffinity():用来修改位掩码。

2) sched_getaffinity():用来查看当前的位掩码。

在下次task被唤醒时,select_task_rq_fair根据cpu_allowed里的掩码来确定将其置于哪个CPU的运行队列,一个进程在某一时刻只能存在于一个CPU的运行队列里。

在Nginx中,使用了CPU亲和度来完成某些场景的工作:

worker_processes      4;

worker_cpu_affinity 0001001001001000;

上面这个配置说明了4个工作进程中的每一个和一个CPU核挂钩。如果这个内容写入Nginx的配置文件中,然后Nginx启动或者重新加载配置的时候,若worker_process是4,就会启用4个worker,然后把worker_cpu_affinity后面的4个值当作4个cpu affinity mask,分别调用ngx_setaffinity,然后就把4个worker进程分别绑定到CPU0~3上。

worker_processes      2;

worker_cpu_affinity 01011010;

上面这个配置则说明了两个工作进程中的每一个和2个核挂钩。

C. linux系统内核数据

正如图中看到的一样,存在着两种WiFi设备,具体是哪一类要看IEEE802.11标准的MLME如何实现。



如果直接通过硬件实现,那么设备就是硬MAC(fullMAC)设备;如果通过软件的方式实现,那么设备就是软MAC(softMAC)设备。现阶段大部分无线设备都是软件实现的软MAC设备。


通常我们把Linux内核无线子系统看成两大块:cfg80211和mac80211,它们连通内核其他模块和用户空间的应用程序。


特别指出,cfg80211在内核空间提供配置管理服务,内核与应用层通过nl80211实现配置管理接口。需要记住的是,


硬MAC设备和软MAC设备都需要cfg80211才能工作。而mac80211只是一个驱动API,它只支持软件实现的软MAC设备。


接下来,我们主要关注软MAC设备。


Linux内核无线子系统统一各种WiFi设备,并处理OSI模型中最底层的MAC、PHY两层。


若进一步划分,MAC层可以分为MAC高层和MAC底层。前者负责管理MAC层无线网络的探测发现、身份认证、关联等;


后者实现MAC层如ACK等紧急操作。大部分情况下,硬件(如无线适配器)处理大部分的PHY层以及MAC底层操作。Linux子系统实现大部分的MAC高层回调函数。


2模块间接口


从图一中我们可以看出,各个模块之间分界线很清晰,并且模块间相互透明不可见。模块之间一般不会相互影响。


举个例子,我们在WiFi设备驱动做修改(如,打补丁、添加新的WiFi驱动等),这些变更并不会影响到mac80211模块,


所以我们根本不用改动mac80211的代码。再如,昆明北大青鸟http://www.kmbdqn.cn/建议添加一个新的网络协议理论上是不用修改套接字层以及设备无关层代码。一般情况下,内核通过一系列的函数指针实现各层之间相互透明。


D. Linux内核API完全参考手册的内容简介

linux作为源码开放的操作系统已经广泛应用于计算机与嵌入式设备,因此学会linux内核开发与编程显得越来越重要。本书以最新的linux内核版本2.6.30为依据,对常用的内核api作了系统分析和归纳,设计了典型实例并对开发场景进行了详细讲解。本书中分析的内核api模块包括:内核模块机制api、进程管理内核api、进程调度内核api、中断机制内核api、内存管理内核api、内核定时机制api、内核同步机制api、文件系统内核api和设备驱动及设备管理api。
本书立足linux内核api分析,深入实践,内容翔实,读者可以从低起点进行高效的内核分析与编程实践。本书可作为高等院校计算机、电子、信息类大学生及研究生进行linux操作系统学习和编程的教材或参考书,也可作为linux开发人员和广大linux编程开发爱好者的参考用书。

E. linux下netlink的使用简介

Netlink套接字是用以实现 用户进程 内核进程 通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。

在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。

一般来说用户空间和内核空间的通信方式有三种: /proc、ioctl、Netlink 。而前两种都是单向的,而Netlink可以实现双工通信。

Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言,具有以下优点:

Netlink协议基于BSD socket和 AF_NETLINK 地址簇,使用32位的端口号寻址,每个Netlink协议通常与一个或一组内核服务/组件相关联,如 NETLINK_ROUTE 用于获取和设置路由与链路信息、 NETLINK_KOBJECT_UEVENT 用于内核向用户空间的udev进程发送通知等。

用户态应用使用标准的 socket API有sendto(),recvfrom(), sendmsg(), recvmsg()。

Netlink通信跟常用UDP Socket通信类似, struct sockaddr_nl 是netlink通信地址,跟普通 socket struct sockaddr_in 类似。

netlink_kernel_create内核函数用于创建内核socket与用户态通信

首先将编译出来的Netlink内核模块插入到系统当中(insmod netlink_test.ko),然后运行应用程序,可以看到如下输出:

F. linux 系统api 和kernel api 一样么

linux kernel只提供一种叫系统调用给应用程序,linux系统提供了glibc这样的函数库专门封装了内核提供的系统调用,所以应用程序的开发就直接调用glibc库提供的库函数就可以了。

注:1、linux系统包括linux kernel、glibc库等。
2、因为应用程序调用系统调用是通过汇编指令完成的,所以才有了glibc的封装,简化了应用开发的难度。

kernel中提供的系统调用处理函数
sys_socket、sys_open、sys_close、sys_read、sys_write等
glibc中对应的是
socket、open、close、read、write等

glibc中的socket函数就是调用了int $0x80这条汇编指令,从而使cpu切换到内核态,执行sys_socket这个函数的。
函数调用流程:
socket->int $0x80->sys_socket。

现在2.6版本的内核提供了300多个系统调用:

glibc的下载地址:
http://ftp.gnu.org/gnu/glibc/
linux kernel的下载地址:

http://www.kernel.org/pub/linux/kernel/

热点内容
netcore编译前执行代码 发布:2025-03-16 03:05:17 浏览:475
饥荒联机版服务器搭建程序 发布:2025-03-16 02:55:18 浏览:684
win7如何访问共享 发布:2025-03-16 02:55:14 浏览:37
centosphp升级 发布:2025-03-16 02:42:04 浏览:52
绝地求生体验服为什么服务器已满了 发布:2025-03-16 02:42:03 浏览:706
服务器电脑机房是干嘛的 发布:2025-03-16 02:30:47 浏览:489
龙贝格算法c语言 发布:2025-03-16 02:26:28 浏览:102
c语言字符串读入 发布:2025-03-16 02:21:23 浏览:478
python爬虫开发环境 发布:2025-03-16 02:19:55 浏览:627
androidondestory 发布:2025-03-16 02:12:49 浏览:863