本文将带您了解关于linuxmodule_init的新内容,另外,我们还将为您提供关于arch-linux–ArchLinux64bitAndroidADB?、arch-linux–在Android设
本文将带您了解关于linux module_init的新内容,另外,我们还将为您提供关于arch-linux – Arch Linux 64bit Android ADB?、arch-linux – 在Android设备上启动原生Arch Linux、arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别、Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报的实用信息。
本文目录一览:- linux module_init
- arch-linux – Arch Linux 64bit Android ADB?
- arch-linux – 在Android设备上启动原生Arch Linux
- arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别
- Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报
linux module_init
就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
其中,init.h 定义了驱动的初始化和退出相关的函数,kernel.h 定义了经常用到的函数原型及宏定义,module.h 定义了内核模块相关的函数、变量及宏。
几乎每个linux驱动都有个module_init(与module_exit的定义在Init.h (/include/linux ) 中)。没错,驱动的加载就靠它。为什么需要这样一个宏?原因是按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如:
void init(void)
{
init_a();
init_b();
}
如果再加入一个初始化函数呢,那么在init_b()后面再加一行:init_c();这样确实能完成我们的功能,但这样有一定的问题,就是不能独 立的添加初始化函数,每次添加一个新的函数都要修改init函数。可以采用另一种方式来处理这个问题,只要用一个宏来修饰一下:
void init_a(void)
{
}
__initlist(init_a, 1);
它是怎么样通过这个宏来实现初始化函数列表的呢?先来看__initlist的定义:
#define __init __attribute__((unused, __section__(".initlist") ))
#define __initlist(fn, lvl) /
static initlist_t __init_##fn __init = { /
magic: INIT_MAGIC, /
callback: fn, /
level: lvl }
请注意:__section__(".initlist"), 这个属性起什么作用呢?它告诉连接器这个变量存放在.initlist 区段,如果所有的初始化函数都是用这个宏,那么每个函数会有对应的一个initlist_t结构体变量存放在.initlist区段,也就是说我们可以在.initlist区段找到所有初始化函数的指针。怎么找到.initlist区段的地址呢?
extern u32 __initlist_start;
extern u32 __initlist_end;
这两个变量起作用了,__initlist_start是.initlist区段的开始,__initlist_end是结束,通过这两个变量我们就可以访问到所有的初始化函数了。这两个变量在那定义的呢?在一个连接器脚本文件里
. = ALIGN(4);
.initlist : {
__initlist_start = .;
*(.initlist)
__initlist_end = .;
}
这两个变量的值正好定义在.initlist区段的开始和结束地址,所以我们能通过这两个变量访问到所有的初始化函数。
与此类似,内核中也是用到这种方法,所以我们写驱动的时候比较独立,不用我们自己添加代码在一个固定的地方来调用我们自己的初始化函数和退出函数,连接器已经为我们做好了。先来分析一下module_init。定义如下:
#define module_init(x) __initcall(x); //include/linux/init.h
#define __initcall(fn) device_initcall(fn)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define __define_initcall(level,fn,id) /
static initcall_t __initcall_##fn##id __used /
__attribute__((__section__(".initcall" level ".init"))) = fn
如果某驱动想以func作为该驱动的入口,则可以如下声明:module_init(func);被上面的宏处理过后,变成 __initcall_func6 __used加入到内核映像的".initcall"区。内核的加载的时候,会搜索".initcall"中的所有条目,并按优先级加载它们,普通驱动程 序的优先级是6。其它模块优先级列出如下:值越小,越先加载。
#define pure_initcall(fn) __define_initcall("0",fn,0)
#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
可以看到,被声明为pure_initcall的最先加载。
module_init除了初始化加载之外,还有后期释放内存的作用。linux kernel中有很大一部分代码是设备驱动代码,这些驱动代码都有初始化和反初始化函数,这些代码一般都只执行一次,为了有更有效的利用内存,这些代码所 占用的内存可以释放出来。
linux就是这样做的,对只需要初始化运行一次的函数都加上__init属性,__init 宏告诉编译器如果这个模块被编译到内核则把这个函数放到(.init.text)段,module_exit的参数卸载时同__init类似,如果驱动被 编译进内核,则__exit宏会忽略清理函数,因为编译进内核的模块不需要做清理工作,显然__init和__exit对动态加载的模块是无效的,只支持 完全编译进内核。
在kernel初始化后期,释放所有这些函数代码所占的内存空间。连接器把带__init属性的函数放在同一个section里,在用完以后,把整个section释放掉。当函数初始化完成后这个区域可以被清除掉以节约系统内存。Kenrel 启动时看到的消息“Freeing unused kernel memory: xxxk freed ”同它有关。
我们看源码,init/main.c中start_kernel是进入kernel()的第一个c函数,在这个函数的最后一行是rest_init();
static void rest_init(void)
{
.....
kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
unlock_kernel();
cpu_idle();
.....
}
创建了一个内核线程,主函数kernel_init末尾有个函数:
/*
* Ok, we have completed the initial bootup, and
* we''re essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
init_post();
这个init_post中的第一句就是free_initmem();就是用来释放初始化代码和数据的。
void free_initmem(void)
{
if (!machine_is_integrator() && !machine_is_cintegrator()) {
free_area((unsigned long)(&__init_begin),
(unsigned long)(&__init_end),
"init");
}
}
接下来就是kernel内存管理的事了。
参考地址:http://blog.csdn.net/citytramper/archive/2006/02/16/600708.aspx
http://blog.csdn.net/citytramper/archive/2006/04/15/664930.aspx
原文链接: http://blog.csdn.net/hanchaoman/article/details/6601483
arch-linux – Arch Linux 64bit Android ADB?
我试图在Arch Linux 64bit上使用Android SDK,但是当我尝试从正确的目录运行ADB时,它说文件不存在,但它就在那里.在你遇到这个问题的Ubuntu上安装ia32-lib但是在Arch Linux中没有.有什么我必须做的.
解决方法:
“无此类文件或目录”消息实际上是指32位可执行文件的加载程序,这是执行32位可执行文件所必需的.有关更详细的说明,请参阅Getting “Not found” message when running a 32-bit binary on a 64-bit system.您需要在Arch Linux上安装32位支持.
遗憾的是,Arch Linux没有一种简单的方法来安装32位支持.目前,您需要通过将这些行添加到pacman.conf来启用[multilib]存储库:
[multilib]
Include = /etc/pacman.d/mirrorlist
有关详细信息,请参阅Wiki上的Arch64 FAQ和Using 32-bit-applications on Arch64.
arch-linux – 在Android设备上启动原生Arch Linux
我有一个galaxy Note 10.1(n8010),我想让它本地启动Arch Linux.我的意思是启动Arch Linux而不是android.我需要的只是改变initramfs,这是我在世界上任何地方都找不到的.我的问题:
>我是否只需要更改initramfs,或者我还需要处理其他事情? (比如内核本身)
> [DONE]我在哪里获得CyanogenMod 10.1的官方initramfs(也许是github)?或者我必须自编译CyanogenMod的内核并从zImage中提取它?
> [可能]我可以在Android数据分区中安装Arch linux root吗? (例如/ data / linux)或者我必须购买SD卡?
>我还需要知道/做什么?
编辑:我发现如何更改initramfs
arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别
在下载gcc for arm的时候,往往会有很多个版本:
这些版本的区别是什么?我该下载哪个版本?
区别无外乎几个:大端 or 小端、ARMv7 or ARMv8、32位 or 64位、裸机 or 嵌入式Linux
multiarch name |
syscall ABI |
instruction set |
endianness |
word size |
description |
spec documents |
aarch64-linux-gnu |
linux |
ARMv8 |
little |
64 |
aarch64 Linux Platform |
AAPCS64 (ARM IHI 005A)1 |
aarch64_be-linux-gnu |
linux |
ARMv8 |
big |
64 |
aarch64 Linux Platform |
AAPCS64 (ARM IHI 005A)1 |
aarch64-linux-gnu_ilp32 |
linux |
ARMv8 |
little |
32 |
aarch64 Linux Platform |
|
aarch64_be-linux-gnu_ilp32 |
linux |
ARMv8 |
big |
32 |
aarch64 Linux Platform |
|
arm-linux-gnu |
linux |
ARMv7 |
little |
32 |
Old ARM ABI |
APCS (ARM DUI 0041 chapter 9)4 |
arm-linux-gnueabi |
linux |
ARMv7 |
little |
32 |
ARM EABI, soft-float |
AAPCS (ARM IHI 0042D)5 |
arm-linux-gnueabihf |
linux |
ARMv7 |
little |
32 |
ARM EABI, hard-float |
AAPCS (ARM IHI 0042D)5 and |
armeb-linux-gnueabi |
linux |
ARMv7 |
big |
32 |
ARM EABI, soft-float |
AAPCS (ARM IHI 0042D)5 |
armeb-linux-gnueabihf |
linux |
ARMv7 |
big |
32 |
ARM EABI, hard-float |
AAPCS (ARM IHI 0042D)5 and |
armv8l-linux-gnueabihf |
linux |
ARMv8 |
little |
32 |
ARMv8 EABI, hard-float |
|
arm-eabi |
Bare-Metal |
ARMv7 |
little |
32 |
ARM EABI, soft-float |
|
armeb-eabi |
Bare-Metal |
ARMv7 |
big |
32 |
ARM EABI, soft-float |
|
aarch64-elf |
Bare-Metal |
ARMv8 |
little |
64 |
ARMv8 EABI, hard-float |
|
aarch64_be-elf |
Bare-Metal |
ARMv8 |
big |
64 |
ARMv8 EABI, hard-float |
|
Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报
开源吞噬世界的趋势下,借助开源软件,基于开源协议,任何人都可以得到项目的源代码,加以学习、修改,甚至是重新分发。关注「开源日报」,一文速览国内外开源大事件吧!
一分钟速览新闻点!
- SUSE 为怀念旧 CentOS 的开发者们发布新发行版——Liberty Linux
- Bootstrap 创始人 Mark otto 谈及自己生病
- 欧盟委员会开源计划办公室启动漏洞赏金
- Google 在 Windows 上发布 beta 版本的 Google Play Games app
- Linux 5.17 使用新的调试功能,便于开发者更能轻松构建内核
- 基于 Chromium 项目的微软 Edge 浏览器大变更
- JetBrains 提供面向开发人员的免费开源字体 Mono
开源大新闻
SUSE 为怀念旧 CentOS 的开发者们发布新发行版——Liberty Linux
自从 2020 年红帽宣布终止 CentOS Linux 的支持,并用 CentOS Stream 取而代之后,RHEL 的替代品便相继涌现。知名 Linux 发行套件供应商 SUSE 带来了全新的 SUSE Liberty Linux 产品。据官方介绍,借助 SUSE Liberty Linux,用户可以通过经过验证的可选管理工具获得值得信赖的支持,这些工具针对混合 Linux 环境进行了优化,包括 Red Hat Enterprise Linux 、CentOS 以及用户所期望的 openSUSE 和 SUSE Linux Enterprise Server。而在一定程度上来看,Liberty Linux 等同于当前的 Red Hat 版本——RHEL 8.5 ,并且与来自 Red Hat 自己的 EPEL 存储库的软件包兼容。
Bootstrap 创始人 Mark otto 谈及自己生病
1 月 20 日,Bootstrap 创始人 Mark otto 发文表示,“2021 年 12 月 5 日,我的心脏病发作,在医院住了两个星期。第一周,我在重症监护室里处于医学上的昏迷状态,以冷冻的方式保存我身心。没有人知道当我醒来时,我是否还是我。”
幸运的是,一周之后,Mark otto 苏醒过来,分享道“好消息是我的心脏有一个新支架,而且我恢复得很好。我一直在慢慢地重新使用 Bootstrap 以确保我仍然可以设计和编码(我可以!),现在我会在网上逗留一段时间后下班休息。”同时,他也希望通过此事能够让更多的人关注自己的健康,“多和你的医生交谈、做更多的检查、了解遗传病史、锻炼身体,尽可能地保持安全和健康。虽然这有些陈词滥调,但它可以很好地挽救你的生命。”
Bootstrap是一个基于 HTML、CSS、JavaScript 的简洁灵活的网站前端框架及组件包,它也是 GitHub 上面 star 次数排名第十二的项目。Star 次数超过 155,000。
欧盟委员会开源计划办公室启动漏洞赏金
欧盟委员会开源计划办公室(EC OSPO)的一组新的漏洞赏金于 1 月 13 日启动,使用 Intigriti 漏洞赏金平台。其中,欧盟委员会开源计划办公室(EC OSPO)总共资助了200,000 欧元,用于再次关注公共服务广泛使用的开源软件的安全性。如在 LibreOffice、LEOS、Mastodon、odoo 和 CryptPad(欧盟公共服务部门使用的开源解决方案)中发现安全漏洞的奖励最高可达 5000 欧元。为他们发现的错误提供代码修复有 20% 的奖金。
Google 在 Windows 上发布 beta 版本的 Google Play Games app
Google 上个月透露要将 Android 游戏带到所有 Windows 平台。现在它正式释出了 beta 版本的 Google Play Games app,目前只对部分地区开放测试。Google 称,Google Play Games app 允许用户在 Windows 台式机或笔记本电脑上浏览、下载和玩部分手游,支持使用键盘和鼠标、在设备之间无缝同步以及与 Google Play Points 集成。该应用暂不支持 Mac。系统要求 Windows 10(v2004),8GB 内存,固态硬盘,20 GB 储存空间,8 核处理器,游戏类显卡(目前市场上的中低端显卡都支持),启用硬件虚拟化。
开源软件专区
Linux 5.17 使用新的调试功能,便于开发者更能轻松构建内核
多年来,Linux 内核支持多种 sanitizers、内存泄漏检测器等功能,这些功能主要用于帮助诊断和解决内核中的缺陷。然而,所有这些调试优化的功能并没有集中在一起,这使系统管理员和开发者在手动配置内核构建时,难以发现这些众多的功能。现在,随着 Linux 5.17 的推出,这种情况正在改变。
Linux 5.17 所做的是引入 debug.config 作为默认的内核构建配置,为调试进行优化。debug.config 将默认启用各种功能,如内核地址消毒器、未定义行为消毒器、KMemLeak,以及许多其他随着时间推移而增加的内核功能,旨在帮助调试或追踪内核问题。因此,只要一个命令,就可以得到官方推荐的内核配置,并启用许多不同的调试功能。
基于 Chromium 项目的微软 Edge 浏览器大变更
近日,微软宣布,从 Edge 96 版本开始,Web 应用将能够在浏览器中使用协议处理程序。最新功能将允许已安装的 Web 应用程序(或 PWA)导航预设或自定义协议。已安装的 Web 应用程序也将能够向操作系统注册为协议处理程序,并在调用特定协议后启动。换句话说,用户可以将网页设置为默认处理程序,比如用户想创建电子邮件,系统将默认打开浏览器中的某个网站。
此外,开发者可以通过注册以 web+ 为前缀的协议来生成 Web 应用程序自定义方案。协议处理程序可用于 Web 应用通信,其中一个应用直接调用另一个应用并通过自定义协议链接传递数据。(小编)
开源工具推荐
JetBrains 提供面向开发人员的免费开源字体 Mono
JetBrains 于近日开源 Mono 字体,其可以作为独立下载提供,并且还被捆绑在所有JetBrains IDE 中。JetBrains Mono 的默认版本带有 OpenType 功能和连字(始终可以在设置中打开和关闭)。如果有开发者的 IDE 不支持 OpenType,也可以使用该字体的特殊版本 — JetBrains Mono NL,其中不包含任何连字。
《新程序员003》正式上市,50 余位技术专家共同创作,云原生和数字化的开发者们的一本技术精选图书。内容既有发展趋势及方法论结构,华为、阿里、字节跳动、网易、快手、微软、亚马逊、英特尔、西门子、施耐德等 30 多家知名公司云原生和数字化一手实战经验!
订阅地址:https://mall.csdn.net/item/92470?utm_source=csdn_news_group
总结
以上是小编为你收集整理的Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
原文地址:https://blog.csdn.net/csdnopensource/article/details/122615511
我们今天的关于linux module_init的分享就到这里,谢谢您的阅读,如果想了解更多关于arch-linux – Arch Linux 64bit Android ADB?、arch-linux – 在Android设备上启动原生Arch Linux、arm-linux-gnueabihf、aarch64-linux-gnu等ARM交叉编译GCC的区别、Bootstrap 创始人 Mark Otto 谈自己生病;替换 RHEL,SUSE 推出 Liberty Linux ; Linux 5.17 使用新调试功能 | 开源日报的相关信息,可以在本站进行搜索。
本文标签: