Linux
文章平均质量分 80
Roland_Sun
职业旅程:Engineer->Senior Engineer->QA Manager->Project Manager->Senior Staff Engineer
展开
-
如何在拷贝文件时保留SELinux上下文
如果要在拷贝一个文件的时候保留其SELinux的上下文,有一个非常简单的方法,直接在拷贝的时候可以加上--preserve=context参数就可以了:cp --preserve=context <Source> <Dest>不过这样做有一个要求,就是当前的Linux内核必须已经激活了对SELinux的支持。如果很不幸没有打开的话,cp命令会报错:当然了,把当前Linux内核上对SELinux的支持打开就可以解决问题了。不过不是所有场景都可以打开对SELinux的支原创 2021-01-26 19:41:40 · 6520 阅读 · 1 评论 -
Linux内核同步原语之信号量(Semaphore)
static inline int __sched __down_common(struct semaphore *sem, long state, long timeout){ struct semaphore_waiter waiter; list_add_tail(&waiter.list, &sem->wait_list); waiter.task = current; waiter.up = false; for (;;) { if...原创 2020-07-30 20:38:34 · 8864 阅读 · 1 评论 -
Linux内核同步原语之原子操作(Atomic)
原子操作原创 2020-07-28 08:50:24 · 18493 阅读 · 0 评论 -
Arm64内存屏障
smp_load_acquire()forces a read of a location in memory (in much the same way asACCESS_ONCE()), but it ensures that the read happens before any subsequent reads or writes. smp_store_release()writes a value back to memory, ensuring that the write h...原创 2020-07-22 09:05:13 · 13315 阅读 · 2 评论 -
Linux内核中的READ_ONCE和WRITE_ONCE宏
#define __READ_ONCE(x, check) \({ \ union { typeof(x) __val; char __c[1]; } __u; \ if (check) \ __read_once_size(&(x), __u.__c, sizeof(x)); \ else \ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ smp...原创 2020-07-16 16:26:44 · 16957 阅读 · 7 评论 -
Linux内核同步原语之自旋锁(Spin Lock)
在Linux内核代码中,大量使用了自旋锁。自旋锁不会让原创 2020-07-15 14:35:44 · 9837 阅读 · 1 评论 -
内存屏障简介
为了限制性能下降,CPU被设计成在从内存中获取数据的同时,可以执行其他指令和内存引用。这明显会导致指令和内存引用乱序执行,并导致严重的混乱仅仅在两个CPU之间或者CPU与设备之间存在需要交互的可能性时,才需要内存屏障。任何代码只要能够保证没有这样的交互,这样代码就不必使用内存屏障。但是,不使用内存屏障不代表不使用同步机制。重排序问题无时无刻不在发生,源自三种场景:编译器编译时的优化 处理器执行时的乱序优化 缓存同步顺序(导致可见性问题)...原创 2020-06-30 18:01:30 · 16277 阅读 · 6 评论 -
Linux时间子系统之Tick广播层(Tick Broadcast)
test reserve原创 2020-06-18 15:20:39 · 9706 阅读 · 4 评论 -
Linux时间子系统之Tick模拟层(Tick Sched)
在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,struct tick_sched { struct hrtimer sched_timer; unsigned long check_clocks; enum tick_nohz_mode nohz_mode; unsigned int inidle : 1; unsigned int tick_stopped : 1; unsigned int idle_active : 1; unsigned原创 2020-06-05 16:28:08 · 12117 阅读 · 0 评论 -
Linux时间子系统之高分辨率定时器层(HR Timer)
在前面介绍定时器层的文章中我们已经知道了在Linux内核中已经存在了一个管理定时器的通用框架。不过它也有很多不足,最大的问题是其精度不是很高。哪怕底层的定时事件设备精度再高,定时器层的分辨率只能达到Tick级别,按照内核配置选项的不同,在100Hz到1000Hz之间。但是,原有的定时器层由于实现教早,应用广泛,如果完全替换掉会引入大量代码改动。因此,Linux内核又独立设计出了一个叫高精度定时器层(High Resolution Timer)的框架,可以为我们提供纳秒级的定时精度,以满足对精确时间有迫切需求原创 2020-05-28 20:24:22 · 11355 阅读 · 0 评论 -
Linux时间子系统之时间维护层(Time Keeper)
struct timekeeper { struct tk_read_base tkr_mono; struct tk_read_base tkr_raw; u64 xtime_sec; unsigned long ktime_sec; struct timespec64 wall_to_monotonic; ktime_t offs_real; ktime_t of...原创 2020-05-19 15:14:56 · 11029 阅读 · 0 评论 -
Linux时间子系统之时间的表示
为了实现以上功能,Linux 实现了多种与时间相关但用于不同目的的数据结构。1)jiffies和jiffies_64内核用jiffies_64全局变量记录系统自启动以来经过了多少次Tick。它的声明如下(代码位于kernel/time/timer.c中):__visible u64 jiffies_64 __cacheline_aligned_in_smp = INITIAL_JIFFIES;EXPORT_SYMBOL(jiffies_64);可以看出来jiffies_64被定义成了6原创 2020-05-11 14:56:46 · 7835 阅读 · 1 评论 -
Linux时间子系统之定时器层(Timer)
定时器层是基于Tick层之上的,精度比较低,struct timer_list { /* * All fields that change during normal runtime grouped to the * same cacheline */ struct hlist_node entry; unsigned long expires; void (...原创 2020-05-08 16:13:33 · 11565 阅读 · 5 评论 -
Linux时间子系统之时钟源层(Clock Source)
struct clocksource { u64 (*read)(struct clocksource *cs); u64 mask; u32 mult; u32 shift; u64 max_idle_ns; u32 maxadj;#ifdef CONFIG_ARCH_CLOCKSOURCE_DATA struct arch_clocksource_data archda...原创 2020-04-26 17:58:55 · 12937 阅读 · 0 评论 -
Linux时间子系统之Tick层
所谓Tick设备,也称作滴答设备,就Tick设备在Linux时间子系统中用tick_device结构体表示(代码位于kernel/time/tick-sched.h中):struct tick_device { struct clock_event_device *evtdev; enum tick_device_mode mode;};可以看出来,它仅仅是对定时事件设备(Cl...原创 2020-04-23 20:08:58 · 10140 阅读 · 0 评论 -
Linux时间子系统之定时事件层(Clock Events)
几乎所有的计算机系统中都会存在一个所谓的定时设备,经过设置后,在某个固定的时间或某个相对的时间间隔后,达到触发条件,发送中断给处理器。系统中的每一种实际的定时事件设备都由一个叫做clock_event_device的结构体变量表示(代码位于include/linux/clockchips.h):struct clock_event_device { void (*event_han...原创 2020-04-21 17:51:18 · 10015 阅读 · 0 评论 -
在Ubuntu18.04下编译树莓派4B的Arm64内核
make modules是编译模块,很多驱动还有功能在选的时候选成M的都是modules,不过直接make,不加任何参数,就是make all,包含make modules。不用额外加此make,但是在安装的时候make install只是安装bzimage,Systemmap。没有把modules安装好,还要额外的make modules_install,把模块放到/lib/modules文件夹...原创 2020-04-07 17:02:54 · 3443 阅读 · 1 评论 -
Arm64下Linux内核Image头的格式
Linux对于Arm64架构,其编译出来的内核默认是不支持压缩的;而对于Arm32版本来说,默认支持内核解压的操作(代码位于arch/arm/boot/compressed目录下,可是arm64目录下没有对应的代码)。如果实在想压缩内核,也可以在bootloader里面解压好后放到内存中指定的位置。struct arm64_image_header { __le32 code0; __l...原创 2020-04-03 11:44:10 · 3830 阅读 · 0 评论 -
在Ubuntu18.04下编译OpenJFX8(包含webkit)
1)下载源代码第一步当然是下载源代码,需要安装mercurial,在Ubuntu上可以直接使用apt安装:sudo apt install mercurial然后可以使用hg命令下载到最新的openjfx8的代码:hg clone http://hg.openjdk.java.net/openjfx/8u-dev/rt2)配置编译环境首先,编译OpenJFX8必须要依赖...原创 2019-12-04 10:15:15 · 2306 阅读 · 0 评论 -
如何在C或C++代码中嵌入ARM汇编代码
大家知道,用C或者C++等高级语言编写的程序,会被编译器编译成最终的机器指令。这中间,编译器会对代码自动进行优化。但是,这种优化往往不一定非常高效。所以,出于性能优化的目的,对非常关键的代码,任然需要直接用汇编指令编写。并且在C和C++中,是无法直接对寄存器进行操作的,如果要实现的功能需要频繁与底层硬件打交道,也需要用汇编指令编写。GCC编译器支持直接在C或者C++代码中,嵌入ARM汇原创 2015-01-20 17:40:07 · 13442 阅读 · 7 评论 -
GNU C++的符号改编机制介绍
众所周知,强大的C++相较于C增添了许多功能。这其中就包括类、命名空间和重载这些特性。对于类来说,不同类中可以定义名字相同的函数和变量,彼此不会相互干扰。命名空间可以保证在各个不同名字空间内的类、函数和变量名字不会互相影响。而重载可以保证即使在同一个命名空间内的同一个类中,函数名字也可以相同,只要参数不一样就可以。这样的设计方便了程序开发者,不用担心不同开发者都定义相同名字的函数的问题。但原创 2015-01-28 17:28:07 · 6763 阅读 · 2 评论 -
GDB常用命令
远程调试有时候需要调试的程序并不在本机上,GDB是支持远程调试的,具体命令如下:(gdb)target remote IP:PORT这时,本机的GDB客户端可以远程连接到被调试机器上,对程序进行调试。当然,前提是在远端的机器上,必须要启动好GDB服务端程序。运行程序如果是用GDB把程序加载起来,而不是attach到一个已经运行的进程上的话,默认情况下程序是不会运行的,可以通过以原创 2015-01-06 16:12:32 · 16515 阅读 · 4 评论 -
如何监控Linux文件系统(inotify功能介绍)
inotify机制是Linux内核2.6.13以后支持的一个新的特性,功能是监视文件系统的变化。当监视到文件系统发生任何变化以后,相应的应用程序可以得到通知。inotify可以监视单个文件或甚至是某个目录的变化。要启用inotify机制对文件或目录进行监控,一般需要顺序调用以下几个API:1)inotify_init最开始要创建一个inotify实例,这是通过调用inotify_ini原创 2015-03-25 17:31:40 · 3481 阅读 · 0 评论 -
Ubuntu升级内核后启动VirtualBox虚拟机报错NS_ERROR_FAILURE
今天升级了一下Ubuntu的内核,貌似一切都比较顺利.但尝试打开VirtualBox里面以前创建好的一个Windows 8.1虚拟机的时候,突然报错:感觉一头雾水,难道辛辛苦苦创建的虚拟机就这么不能用了?查阅了好久之后,发现原来是VirtualBox的内核驱动没有成功被加载.原因应该就是刚刚升级了内核.解决的办法也很简单,直接执行下面的命令就行了:sudo /etc/init.原创 2015-10-08 16:47:52 · 5427 阅读 · 0 评论 -
Linux下如何指定某一类型程序用特定程序打开(通过binfmt_misc)
在Windows平台上,可以绑定拥有特定扩展名的文件,使用特定的程序打开。比如,PDF文件就使用Acrobat Reader打开。这样做确实极大的方便了用户的使用体验。其实,在Linux平台上,也提供了类似的功能,甚至从某种意义上来说更加的强大。Linux的内核从2.6开始就引入了一个叫做Miscellaneous Binary Format(binfmt_misc)的机制,可以通过要打开文件原创 2015-11-27 14:23:49 · 9918 阅读 · 1 评论 -
Unix域套接字(Unix Domain Socket)介绍
在Linux系统中,有很多进程间通信方式,套接字(Socket)就是其中的一种。但传统的套接字的用法都是基于TCP/IP协议栈的,需要指定IP地址。如果不同主机上的两个进程进行通信,当然这样做没什么问题。但是,如果只需要在一台机器上的两个不同进程间通信,还要用到IP地址就有点大材小用了。其实很多人并不一定知道,对于套接字来说,还存在一种叫做Unix域套接字的类别,专门用来解决这个问题。其API原创 2015-12-16 15:48:40 · 33479 阅读 · 2 评论 -
Linux中mprotect()函数的用法
mprotect()函数修改在内存映像上的保护模式。函数原型:#include #include int mprotect(const void *start, size_t len, int prot);mprotect把自start开始的内存区的保护模式修改为prot指定的值,如果执行成功返回0,如果执行失败,mprotect返回-1,并且设置errno变量。原创 2014-06-23 16:12:31 · 53455 阅读 · 3 评论 -
链接脚本解析
每一个链接器都需要链接脚本来将不同的对象文件链接成最终的可执行文件。如果不特别指定的话,链接器程序本身自带了一个默认的链接脚本,可以通过一下命令获得这个默认的脚本:ld --verbose一般情况来说,默认的链接脚本就够用了,大多数人也不会自己专门编写链接脚本。不过,如果你是编写内核或者固件程序的话,默认的链接脚本有时候就会显得不够用了,需要自己编写。可以用-T参数来告知连接器,使原创 2020-04-08 15:18:38 · 1574 阅读 · 0 评论 -
Ubuntu系统下如何导入根证书
这几天在摆弄Ubuntu系统,想要抓包就装了个Charles,但本机的HTTPS包是抓不到的,因为没有把Charles的根证书导入CA,而且Charles自带的导证书的功能在Ubuntu下好像不工作。没办法,只能自己手动添加了。搞了半天发现Ubuntu系统中都没有一个好用的GUI工具可以方便的添加根证书。只有通过命令行进行操作,在此记录一下。首先,将要导入的证书拷贝到一个特定目录下:s原创 2017-04-11 10:45:25 · 19160 阅读 · 0 评论 -
Linux中waitpid()函数的用法
在Linux中waitpid函数的主要用途是原创 2014-06-18 17:05:41 · 82489 阅读 · 6 评论