自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

choumin的专栏

记录一些小点

  • 博客(16)
  • 收藏
  • 关注

原创 在linux下产生core dump文件

1)、通过 kill() 系统调用给进程发送以下信号时,其默认行为是终止进程和产生 core 文件:SIGBUSSIGFPESIGILLSIGIOTSIGQUITSIGSEGVSIGSYSSIGTRAPSIGUNUSEDSIGXCPUSIGXFSZ2)、abort() 会产生core文件3)、raise() 会产生core文件...

2021-01-27 13:36:07 502

原创 多线程中的uid

在内核级别,用户 ID 和 组 ID 是每个线程的属性,然而,POSIX 标准要求同一个进程里的多个线程共享相同的认证信息(credentials)。在 NPTL (Native POSIX Threads Library)线程实现中,通过对某些系统调用进行封装,从而支持了这一要求。这里的封装函数包括 setuid(),它通过信号技术确保了当其中某个线程改变认证信息后,其他所有线程也会跟着改变对应的认证信息。在glibc中,setuid() 最终会调用 __nptl_setxid(),其定义在 npt

2021-01-25 20:09:20 506 1

原创 多线程中的pid

由一个进程创建的多个线程具有相同的 pid,也就是在这些线程中分别调用 getpid(),得到的结果是一样的。这里的 pid 其实是 task struct(进程描述符结构体)中的 tgid,它是线程的 group ID,也是主线程(它创建了子线程)的 PID。而 task struct 中的 pid 其实是线程的 ID, 也可以叫作 tid(thread ID),对于多线程而言,这些 tid 是不同的。借用 stackoverflow 上的一个回答来解释这里面的逻辑,下面这张图形象的描述了多进程和多

2021-01-25 18:18:21 1787

原创 linux中的硬链接和软链接

可以使用 ln 命令创建硬链接和软链接,它的基本用法是:ln [OPTION]... [-T] TARGET LINK_NAMEln [OPTION]... TARGETln [OPTION]... TARGET... DIRECTORYln [OPTION]... -t DIRECTORY TARGET...默认是创建硬链接:$ ln 1.txt 2.txt$ stat 1.txt 文件:1.txt 大小:6 块:8 IO 块:4096

2021-01-23 13:37:17 121 2

原创 gcc中的__attribute__语法

gcc 中的 __attribute__ 可以为变量、函数、标签等指定属性。基本语法:__attribute__ ((attribute-list))1)alias ("target")int var_target;extern int __attribute__ ((alias ("var_target"))) var_alias;为一个对象指定一个别名,其中 var_target 和 var_alias 的类型要一致。2)weakvoid __f () { /* Do s

2021-01-21 18:19:10 773

原创 gcc中为变量和函数指定汇编时名称

在gcc中可以通过 asm() 或者 __asm__() 为变量和函数指定其在汇编代码中的名称int foo asm ("myfoo") = 2;int func (int x, int y) asm ("MYFUNC");int func (int x, int y){/* … */}如下所示,如果不指定的话,变量 foo 的汇编时名称是: foo.1724,$ cat ./main.cint main(void) { static int foo = 5 ;

2021-01-21 18:15:53 409

原创 linux程序启动时glibc的调用流程

ELF 文件头的 e_entry 项指明了入口地址,可以通过 objdump -f 命令查看 ELF 文件头信息,一般来说,入口地址的就是代码段 _start 符号的起始地址,在 _start 中调用了 libc 中的 __libc_start_main(),该函数的大致流程是:1)判断是否是静态链接库,如果是,则调用 _dl_start_user() ,否则调用 __libc_init_first();2)调用 __libc_csu_init();3)调用 main();4)调用 __GI

2021-01-21 13:50:34 1210

原创 GNU C扩展之三元运算符

在 GNU C 扩展中支持这种形式的三元运算符:x ?: y; 它等价于: x ? x : y这两者比较重要的区别是:前者只对表达式 x 进行一次计算,而后者会计算两次,在某些情况下,这种重复计算可能会有副作用:比如:int b = ++a ? ++a : -1;同时,当 x 是一个函数调用时,重复计算还会带来性能的损失,比如:int b = foo() ?: -1; 比 int b = foo() ? foo() : -1; 少调用一次 foo() 函数。在其他语言中也有类似的语法,比如 php

2021-01-21 08:46:04 214 1

原创 glibc中vdso系统调用的定义

为了新增一个 vdso 系统调用,需要同时修改内核和glibc。glib支持多种体系结构和操作系统,在gblic中新增一个vdso系统调用,需要在对应体系结构目录下新增一个包含该系统调用的.c文件,比如 ./sysdeps/unix/sysv/linux/x86/gettimeofday.c 文件,它定义了 gettimeofday() 这个系统调用的 vdso 版本的调用流程,内容如下所示:#include <sys/time.h>#ifdef SHARED# include.

2021-01-20 15:20:47 518

原创 vdso原理学习

首先,借用一张图来说明 vdso 的原理,下面是描述 vdso 在 arm64 上的工作原理:总的来说,vdso 分为用户态部分和内核态部分。vdso 用户态部分提供 __vdso_xxx() 接口(或者是 __kernel_xxx() 接口,如上图所示),这些接口由glibc 调用并将结果返回给用户程序,它们的实现也比较简单,就是读取 vdso_data 里面的内容并进行简单处理,然后将结果返回给 glibc。vdso_data 是一个结构体,这个数据结构也...

2021-01-20 13:59:56 3972

原创 机器学习在卫星数据降尺度研究中的应用

2013年4月份,Bristol 大学的学者在 Water Resources Management 上发表了一篇论文(Machine Learning Techniques for Downscaling SMOS Satellite Soil Moisture Using MODIS Land Surface Temperature for Hydrological Application),该论文利用机器学习 和 MODIS-LST 对 SMOS 卫星土壤水数据进行降尺度。...

2021-01-17 23:52:19 1874

原创 DxeMain中driver的加载流程

1、创建 gEfiFirmwareVolumeBlockProtocolGuid 类型的 Protocol 实例在 ./MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c 文件的第 487 行调用了 FwVolBlockDriverInit() 函数,其定义在 MdeModulePkg/Core/Dxe/FwVolBlock/FwVolBlock.c 中:EFI_STATUSEFIAPIFwVolBlockDriverInit ( IN EFI_HANDLE

2021-01-12 08:48:31 1008

原创 使用指定C库编译程序

在 gcc 中可以通过参数指定程序在编译、链接过程中用到的 C 库,例如,我们想要使用的C库在 /root/test_lib/ 目录下$ ll /root/test_lib/total 2288-rwxr-xr-x 1 root root 163312 Jan 8 22:05 ld-2.17.so-rwxr-xr-x 1 root root 2156240 Jan 8 22:05 libc-2.17.so-rwxr-xr-x 1 root root 19248 Jan 8 22:0

2021-01-08 22:11:26 435

原创 x86中vdso数据段的初始化及更新和使用

1、vdso 数据段的初始化1)数据段的定义:vdso 数据段由内核进行声明和定义,其中,在链接脚本 arch/x86/entry/vdso/vdso-layout.lds.S 里指定了 vdso 的数据段的名称和位置,相关内容如下:SECTIONS { vvar_start = . - 3 * PAGE_SIZE; vvar_page = vvar_start; #define EMIT_VVAR(name, offset) vvar_ ## name = vvar_p

2021-01-08 18:19:10 984

原创 链接脚本中的SECTIONS定义

链接脚本用来指定目标文件生成输出文件时的规则,其中,必不可少的命令是:SECTIONS,它精确控制了输入段在输出文件中的顺序、位置和所在段。下面是在 SECTIONS 命令中定义一个段的完整语法:SECTIONS { ... secname start BLOCK(align) (NOLOAD) : AT ( ldadr ) { contents } >region :phdr =fill ... }其中,secname 和 contents

2021-01-06 22:54:29 2641

原创 make中的替换引用

make中的替换引用功能 可以对变量的取值进行替换操作,它的基本用法是:$(var:a=b)该操作将 $(var) 变量中每个以 'a' 为后缀的单词替换为以 'b' 为后缀的单词。例如,执行下面的替换后,变量 bar 的内容是:'a.c b.c l.a c.c'foo := a.o b.o l.a c.obar := $(foo:.o=.c)另外一种替换引用的形式类似于patsubst() 函数:foo := a.o b.o l.a c.obar := $(foo:%..

2021-01-06 22:03:13 732

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除