
Linux-Unix
jasonxty
这个作者很懒,什么都没留下…
展开
-
确保数据写到磁盘上
翻译自:https://lwn.net/Articles/457667/在一个完美的世界,没有操作系统崩溃,停电或者磁盘故障,程序员不需要为这些临界状况而担心。不幸的是,这些错误出现的可能性比我们期待的要常见的多。这个文档的目的是描述数据从应用到存储走过的路径,主要关注数据缓存,然后提供一个最佳的实践方式来确保数据可以保存到稳定的存储上面,从而保证在不良事件发生的时候数据不在路径上丢失。我们主要关心C语言,尽管所有提到的系统调用应该可以相当简单的翻译成其它语言。I/O缓存为了从数据完整性的角度进翻译 2021-07-28 10:03:35 · 423 阅读 · 0 评论 -
怎样写出更快的C程序
由于存储器的设计和语言的存储安排,一个具有良好局部性的程序往往可以更快的执行。——总结自《深入理解计算机系统》局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。总之,编写高速缓存友好的代码涉原创 2016-11-22 22:14:54 · 394 阅读 · 0 评论 -
理解程序调用以及由此引出的缓冲区攻击问题
在阅读《深入理解计算机系统》第三章,程序的机器级表示的时候,解开了以前学习C语言的时候的一些疑惑,在这里稍做记录。程序在调用另一个程序的时候涉及下面的这个数据结构——栈帧,这个数据结构是实现整个过程的关键。调用者程序调用(call指令)另一个被调用者程序的时候,首先调用者程序将将当前程序计数器的值(下一条指令的地址)保存(push)在栈帧中,再跳转到被调用者程序。然后被调用者程序保存原来的帧指针(原创 2016-12-03 15:01:22 · 391 阅读 · 0 评论 -
动态链接共享库
在讲动态链接时,不得不先复习一下静态链接。 像Unix ld程序这样的静态连接器以一组可重定位目标文件和命令行参数作为输入,生成一个完全连接的可以加载和运行的可执行目标文件作为输出。为了构造可执行文件,连接器必须完成两个任务。1.符号解析 目标文件定义和引用符号。符号解析的目的是将每个符号引用刚好和一个符号定义联系起来。2.重定位 编译器和汇编器生成从地址0开始的代码和数据结构。链接器通过把每原创 2016-12-13 19:14:22 · 1355 阅读 · 0 评论 -
Linux串口分析,基于新唐NUC970系列(上)
参考https://blog.youkuaiyun.com/coding__madman/article/details/51457181https://blog.youkuaiyun.com/coding__madman/article/details/51484155http://www.wowotech.net/tty_framework/tty_concept.html《UNIX环境高级编程》《ARM Linux...原创 2018-03-28 19:39:46 · 3652 阅读 · 0 评论 -
从NFS启动Linux并挂载根文件系统
要搞嵌入式NFS确实必不可少,否则每次都要重启烦都烦死。这里总结在NFS建立过程中遇到的几个问题。总的来说这篇文章是总体上准确的介绍了如何建立下面记录几个遇到的问题VFS: Cannot open root device “nfs” or unknown-block(0,255) 原因是启动了内核的ip自动配置,但是没有dhcp支持(比如路由器)。VFS: Cannot open roo原创 2017-02-20 10:18:42 · 3981 阅读 · 0 评论 -
mac下用qemu编译执行linux/kernel
主要参考使用 qemu 搭建内核开发环境 - 离小木 - 博客园主要涉及以下几个点:virtualbox6.1下运行ubuntu server 18.04,然后打开ssh server,用于mac主机访问。否则virtualbox那个屏幕不能自动缩放真是辣眼睛。因为需要一个linux来编译kernel,直接在mac上编译估计没那么容易。sudo apt-get install openssh-server主机配置port forwarding。在虚拟机上下载linux k.原创 2022-01-03 15:48:44 · 2074 阅读 · 7 评论 -
compiler-gcc.h:104:30: fatal error: linux/compiler-gcc5.h: No such file or directory
这是kernel module编译的时候遇到的gcc兼容性问题可以通过#pragram message去打印一些预编译信息。(遇到问题,解决问题的关键是理性的观察分析问题,提出假设和尝试解决)In file included from include/linux/compiler.h:48:0, from include/linux/stddef.h:4, from include/linux/posix_types.h:4,...原创 2021-09-03 09:38:37 · 813 阅读 · 0 评论 -
linux 无buffer输出
stdbuf -o0 -e0 script -c "python hehe.py" | tee -a /diag/logs/haha.log原创 2021-07-20 16:36:55 · 209 阅读 · 0 评论 -
通过swig将C/C++代码暴露给python
入门http://www.swig.org/Doc3.0/Introduction.html#Introduction可以通过include头文件的方式去定义.i文件。这样大大方便了.i文件的书写。实验发现函数可以不用加extern。%module example原创 2021-05-08 13:41:34 · 755 阅读 · 0 评论 -
makefile中的:=
1、“=” make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:x = foo y = $(x) bar x = xyz在上例中,y的值将会是xyz bar,而不是foo bar。 2、“:=” “:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后...转载 2021-04-16 14:16:47 · 7017 阅读 · 3 评论 -
How exactly does __attribute__((constructor)) work?
https://stackoverflow.com/questions/2053029/how-exactly-does-attribute-constructor-work今天看mtk的sdk,看到很多没有初始化的函数,就在想啥时候初始化的。记得以前有看到过这个功能。所以重温一下,大概这是共享库初始化的一般方法。所以搜索了一下,https://blog.youkuaiyun.com/absurd/article/details/928972发现果然是。...原创 2021-04-14 08:51:53 · 121 阅读 · 0 评论 -
ssh提示输入密码,尽管已经做了ssh-copy-id
因为我和同事共享文件的时候改变了home目录下的文件的权限造成https://unix.stackexchange.com/questions/4484/ssh-prompts-for-password-despite-ssh-copy-id原创 2021-04-01 11:05:56 · 178 阅读 · 0 评论 -
Linux用户态驱动的理解
主要总结自《User-Space Device Drivers in Linux: A First Look》和https://www.linuxidc.com/Linux/2018-06/152846.htm参考:https://www.quora.com/What-is-the-difference-between-user-space-and-kernel-space-device-drivers-in-Linuxhttps://stackoverflow.com/questions/15原创 2021-03-09 11:02:39 · 3100 阅读 · 2 评论 -
两种不同的用户空间PCI ram space mmap方法
/sys/bus/pci/device/[device address]/resource0https://burgers.io/pci-access-without-a-driverint fd = open("/sys/bus/pci/devices/0000:04:00.0/resource0", O_RDWR | O_SYNC);void* base_address = (void*)0xf7300000;size_t size = 128 * 1024; // 128Kvoid*原创 2021-03-08 22:00:41 · 1112 阅读 · 0 评论 -
/proc/bus/pci/devices字段解析
每个PCI设备一行:总共18个字段,每个字段之间是\t。第一个字段是,总线设备功能,总线是前8位,后8位是设备(前5位)和功能(后3位)。第二个字段是,vendor(前16位)和device(后16位)。第三个字段是,中断号第4-10个字段是bar0-bar6以及flag信息。第11-17个字段是bar0-bar6的长度。第18个字段是设备名称,optional内核代码更准确:static int show_device(struct seq_file *m, v.原创 2021-03-08 14:09:12 · 2308 阅读 · 0 评论 -
Linux查看线程状态
ps -T -p <pid>andtop -H -p <pid>原创 2021-03-07 22:07:46 · 629 阅读 · 0 评论 -
可否不重启更新动态链接库?
https://stackoverflow.com/questions/10001013/update-shared-libraries-without-restarting-processeshttps://stackoverflow.com/questions/7767325/replacing-shared-object-so-file-while-main-program-is-running从目前来看貌似不大行。只能通过dlopen系列函数倒是可以。其根本原因是什么?需要重新阅读CSAPP原创 2021-03-04 15:52:06 · 513 阅读 · 1 评论 -
man 2 semget 翻译
名字:semget - 获得一个System V信号量集合识别符概要:#include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>int semget(key_t key, int nsems, int semflg);描述:semget()系统调用返回和参数key关联的System V信号量集合标识符。如果key的值是IPC_PRIVATE或者还没有信号量集合和key关联,并翻译 2021-02-23 20:42:53 · 154 阅读 · 0 评论 -
mcelog: failed to prefill DIMM database from DMI data & mcelog: mcelog server already running
这个错误由重复启动mcelog引起[logs]# > /var/log/mcelog[logs]# ps -aux |grep mcelogroot 14760 0.0 0.0 4976 140 ? Ss 05:12 0:00 /diag/bin/mcelog --daemonroot 16890 0.0 0.0 11288 1008 pts/0 S+ 06:17 0:00 grep mcelog[logs]# ki原创 2021-02-23 14:38:28 · 1345 阅读 · 2 评论 -
**** stack smashing detected ***
环境:linux C程序顺利跑完却报了**** stack smashing detected ***原因在这里有讨论:https://blog.youkuaiyun.com/vevenlcf/article/details/51861712debug的时候有点困难,实际stack overflow出现的时候程序还是正确的运行了。感觉主要还是要知道哪里的stack size是运行时确定的但是在写程序的时候却写了固定的stack size。这样方便debug。写程序的时候也要注意动态size数据使用的原创 2021-02-08 14:29:44 · 376 阅读 · 0 评论 -
利用mmap /dev/mem 读写Linux内存
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。以下是我写的一个sample#include<stdio.h>#include<unistd.h>#include<sys/mman.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>.转载 2021-01-14 15:17:25 · 424 阅读 · 0 评论 -
Bash ${^^}和${,,}
${^^}将值都转换成大写${,,}将值都转换成小写原创 2020-12-08 15:20:09 · 1122 阅读 · 0 评论 -
Linux Kernel Fundamentals: Chapter 4, Examing Linux Kernel Source Code
1. 抓取kernel源码2. 在源码里面make cscope和make tags.3. 测试vi编辑器的ctags功能a. 在Linux kernel下面查询一个叫做sys_open()的函数。如果先找到的是宏定义,那么做:tn去找它的下一个定义,直到你找到这个函数的定义。b. sys_open()函数会调用其它函数。移动光标到其中一个函数,然后按下Ctrl-]。发生了什么?c. 按下Ctrl-T。发生了什么?d. 使用:tag命令查询tag atomic_inc。使用:tn命令原创 2020-11-27 17:56:34 · 111 阅读 · 0 评论 -
Linux Kernel Fundamentals: Chapter 3, Working with Loadable Kernel Modules
在这一章的作业里面,我们创建一个可以加载的模块,做一些可加在模块的实验,创建和使用模块参数。你需要root权限。你需要安装Linux kernel开发包。在Ubuntu上面,一般在linux-headers-$(uname -r)。有一个连接到这个kernel目录(里面有Makefile子目录等等),叫做/lib/modules/$(uname -r)/build。如果build不存在或者是一个坏的链接,那么你需要自己安装。我们写kernel代码,糟糕的事情可能发生。所以最好在虚拟机里面做作业。原创 2020-11-18 13:23:57 · 124 阅读 · 0 评论 -
Linux kernel fundamentals: Chapter2, Booting
1. 运行dmesg,查看是否每个输出行都有[0.1234]这样形式的时间戳。重启,从你的系统console中断GRUB并添加选项apic=debug到kernel行。继续启动,启动完毕后,登录并且查看dmesg是否有不一样的地方。里面是否有更多的apic输出?使用https://wiki.centos.org/HowTos/Grub2或者其它合适的发行版,做一个定制的GRUB记录和你当前内核的记录一样,但是有以下的不同:标题为Custom Linux Boot Entry Experiment. 添原创 2020-11-17 12:24:28 · 134 阅读 · 0 评论 -
Linux kernel fundamentals: Chapter1, Surveying the Linux Kernel
1. 如何查看Linux系统的内核版本?tianyxu@love_server1:~$ uname -aLinux love_server1 5.4.0-52-generic #57~18.04.1-Ubuntu SMP Thu Oct 15 14:04:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux2. 如何查看当前系统所用kernel的kernel文件大小?tianyxu@love_server1:/boot$ ls -lh vmlinuz-5.原创 2020-11-11 08:47:19 · 145 阅读 · 0 评论 -
Virtualbox用NAT网络组建虚拟机局域网
要组一个局域网的初衷是为了试一下syslog的功能。但是工作关系可能没有时间试了。。。1. 网络需求网络需求就是实现,virtualbox中两个虚拟机,一个Ubuntu server18.04,一个Ubuntu18.04,然后两个虚拟机可以相互通信,两个虚拟机都可以访问外网。然后因为我习惯于通过ssh访问Ubuntu server所以需要主机可以ssh访问Ubuntu server18.04。2. virtualbox网络选择https://www.virtualbox.org/manu原创 2020-09-26 09:21:17 · 1278 阅读 · 0 评论 -
VirtualBox Ubuntu18.04 NAT 无法访问外网
很奇怪,自从用了VPN之后,虚拟机NAT就无法访问外网。首先是Google各种信息,但是还是没有找到好的解决方案。但是在搜索的过程中,还是在https://blog.youkuaiyun.com/dkfajsldfsdfsd/article/details/79403343这篇文章中找到了思路。首先尝试ping外网IP,发现可以ping通,初步断定应该是DNS服务有问题。这个时候就想到要想办法修改DNS服务器,看看能不能修复。经过一番google发现https://www.hi-linux.原创 2020-09-24 16:49:11 · 1193 阅读 · 0 评论 -
man 2 gettimeofday 翻译
名字gettimeofday, settimeofday - get / set time概要#include <sys/time.h>int gettimeofday(struct timeval *tv, struct timezone *tz);int settimeofday(const struct timeval *tv, const struct timezone *tz);glibc需要的特征测试宏(查看 feature_test_macros(7)):翻译 2020-05-11 16:18:30 · 348 阅读 · 0 评论 -
man 3 system 翻译
名字system 执行一个shell命令概要#include <stdlib.h>int system(const char *command);描述system()库函数用fork(2)创建一个子进程,这个子进程通过execl(3)执行command指定的shell命令:execl("/bin/sh", "sh", "-c", command, (char*) 0);system()会在命令结束之后返回。在执行命令的过程中,对于调用system()的进程翻译 2020-05-09 15:51:54 · 302 阅读 · 0 评论 -
Linux处理git diff尾部的^M
背景在vim里面复制了两行。git diff看的时候发现尾部有^M。vim可以通过vi -b查看尾部的换行符。经了解这是因为windows用CR LF来换行,而Linux用LF来换行。我应该是打开了之前用windows的编辑的文件。解决方法vim打开,set ff=unix就可以删除所有尾部的^M。https://kb.iu.edu/d/acux...原创 2020-02-14 14:11:04 · 854 阅读 · 0 评论 -
CPU load average VS CPU usage in top command
Load average means the number of tasks in running state in last 1, 5 and 15 minutes.CPU usage tell you that state percentages in relatively very short time.原创 2020-01-15 14:01:09 · 180 阅读 · 0 评论 -
Ctrl+z挂起进程后如何恢复
1. Ctrl+z挂起进程2. jobs查看被挂起的进程的作业号3. bg恢复某个job到后台4. fg恢复某个job到前台原创 2019-11-03 15:18:42 · 3107 阅读 · 1 评论 -
Linux 内核源码中likely()和unlikely()
这两个宏在内核中定义如下:<linux/compiler> #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)复制代码这里的__built_expect()函数是gcc(version >= 2.96)的内建函数,提供给程序...转载 2019-07-25 17:17:50 · 190 阅读 · 0 评论 -
Linux I/O函数(beta)
在学习使用C语言的时候,我们总会遇到各种各样的输入输出函数。fopen,open,read,write,scanf,printf等等。那么到底什么时候应该用什么,我么该如何选择呢,我之前总是有疑问。在认真学习了《csapp》《apue》之后,总算是有点眉目了。下面做一个记录。首先明确一下什么是输入输出,输入输出是在主存和外部设备之间拷贝数据的过程。输入输出是相对主存而言的。在编写C语言程序的时候,原创 2017-01-03 16:06:18 · 503 阅读 · 0 评论 -
异常控制流
之前学习微机原理的时候,总感觉没什么东西。除了中断和寻址有点意思。但是概念还是没有理清楚,感觉什么都是中断。。。最近看了《深入理解计算机系统》,引入异常控制流(Exceptional control flow)的概念, 从而对计算机中各种“中断”有了层次上的理解。总结如下。定义:异常控制流通过改变程序的执行序列来对系统和应用的行为做出反应。异常控制流发生在计算机系统的各个层次。在硬件层,硬件检测原创 2016-12-22 11:14:52 · 429 阅读 · 0 评论 -
什么是shell命令
我们一直通过命令在shell中执行程序或者漫游系统。那么到底命令是什么呢?《TLCL》里面总结了。shell命令总的来说是下面四种形式之一:An executable program like all those files we saw in /usr/bin. Within this category, programs can be compiled binaries such as pr原创 2016-11-27 14:52:16 · 1637 阅读 · 0 评论 -
Unix编程之size_t、ssize_t
转自lmx并在实践的基础上稍有改动。 对于赶时间的朋友,只看第一段就好了。 首先,我非常肯定以及确定的告诉你ssize_t是有符号整型,在32位机器上等同于int,在64位机上等同于long int,有没有注意到,它和long数据类型有啥区别?其实就是一样的。size_t就是无符号型的ssize_t,也就是unsigned long/unsigned int(在32位下),不同的编译器或系统可能转载 2016-11-08 16:14:53 · 1802 阅读 · 0 评论 -
浮点数
最近在学习Linux必然逃不开C语言,在格式化输入输出的时候遇到%f和%g。通过查阅《深入理解计算机系统》,总结如下。二进制小数先说下十进制小数dmdm−1…d1d0.d−1d−2…d−nd_md_{m-1}\ldots d_1d_0.d_{-1}d_{-2}\ldots d{-n}其中每个十进制数的取值范围是0-9。这个表示法描述的数值dd定义如下: d=∑i=−nm10i∗did=\sum_{原创 2016-11-20 15:06:57 · 522 阅读 · 0 评论