基本结构
在本章中,我们将了解几乎所有命令式/OOP 语言中最基本和最简单的结构。
全局变量
全局变量在 LLVM IR 中实现起来很简单。
1234567int variable = 21;int main(){ variable = variable * 2; return variable;}
转换为
12345678@variable = global i32 21define i32 @main() { %1 = load i32, i32* @variable ; load the global variable %2 = mul i32 %1, 2 store i32 %2, i32* @variable ; store instruction to write to global variable ret i32 %2}
全局变量以 @ 字符为前缀。 您可以看到,诸如 main 之类的函数也是 LLVM 中的全局变量。 请注意,LLVM 将全局变量视为指针; 因此,在访问全局变量的值时,必须使用 l ...
将高级语言的结构映射到LLVM IR
本文翻译自 Mapping High Level Constructs to LLVM IR,原文连接https://mapping-high-level-constructs-to-llvm-ir.readthedocs.io/en/latest/README.html。
快速入门
在阅读本文档之前,你需要了解以下一些信息。
LLVM IR不是机器码,而是一种介于汇编语言和高级语言之间的一种中间语言。因此,它既具有部分高级语言的特点(如函数和强类型),同时也具有部分汇编语言的特点(如分支和基本块)。
LLVM IR是强类型的,当出现错误的时候会告知用户。
LLVM IR不区分有符号整数和无符号整数。
LLVM IR假设二进制补码有符号整数,因此说 trunc 在有符号和无符号整数上同样适用。
全局符号以 @ 开头。
局部符号以 % 开头。
所有符号都必须声明或者定义。
不要担心 LLVM IR 在表达某些东西时有时会显得有些冗长; 优化器将确保输出得到很好的优化,您经常会看到两个或三个 LLVM IR 指令被合并为一条机器代码指令。
如有疑问,请参阅Language Referen ...
dpdk
叠嶂西驰,万马回旋,众山欲东。正惊湍直下,跳珠倒溅;小桥横截,缺月初弓。老合投闲,天教多事,检校长身十万松。吾庐小,在龙蛇影外,风雨声中。
争先见面重重,看爽气朝来三数峰。似谢家子弟,衣冠磊落;相如庭户,车骑雍容。我觉其间,雄深雅健,如对文章太史公。新堤路,问偃湖何日,烟水濛濛?
辛弃疾《沁园春·灵山齐庵赋时筑偃湖未成》
Linux传统网络驱动流程
数据包到达网卡设备
网卡设备通过DMA将收到的数据放入内存
网卡驱动触发中断,唤醒处理器
驱动软件填充读写缓冲区数据结构
数据报文到达内核的协议栈,进行处理
如果最终应用在内核态,则继续处理数据;如果最终应用在用户态,则需要将数据拷贝到用户态
DPDK的特点
轮询而非中断,采用轮询的方式,避免的中断切换的开销。有利于大吞吐数据的处理。
用户态驱动, 采用了用户态驱动的方式,避免了系统调用和数据的拷贝。
亲和性与独占,线程的调度依赖于内核,可以将特定的任务指定在某个核上工作,从而避免线程间切换的开销以及线程切换造成的缓存缺失。
降低访存开销,使用内存大页来减小页表,从而使得TLB的缺失率降低。
数据对其,cache line等数据结构会 ...
u-boot简明教程
u-boot的编译
首先要下载u-boot的源代码,从这里ftp://ftp.denx.de/pub/u-boot/下载需要的纯净版u-boot源码。下载后解压源码,进入u-boot源码的根目录,执行make distclean命令清除所有配置,然后再执行make xxxx_config命令生成配置,其中xxxx是开发板的名称。配置成功后执行make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-进行编译。
u-boot启动流程
找入口
从Makefile文件中找链接文件,然后从链接文件当中找到入口函数。
tftp配置
服务器端建立在Ubuntu,客户端建立在开发板上。
首先运行命令
1dpkg -s tftpd-hda
确保存在tftp服务器,大部分情况是有的,如果没有,则运行
1sudo apt-get install tftpd-hda
安装tftp服务器。
然后配置tftp服务器,运行命令
1sudo vim /etc/default/tftpd-hda
将文件修改为如下
123456TFTP_USERNAME="tft ...
llvm简明教程
绿树听鹈鴂。更那堪、鹧鸪声住,杜鹃声切。啼到春归无寻处,苦恨芳菲都歇。算未抵、人间离别。马上琵琶关塞黑,更长门、翠辇辞金阙。看燕燕,送归妾。
将军百战身名裂。向河梁、回头万里,故人长绝。易水萧萧西风冷,满座衣冠似雪。正壮士、悲歌未彻。啼鸟还知如许恨,料不啼清泪长啼血。谁共我,醉明月。
辛弃疾《贺新郎·别茂嘉十二弟》
将C程序编译为llvm
输入的c代码:
1234// main.cint main() { return 0;}
生成IR:
命令:
1clang -Xclang -ast-dump -fsyntax-only main.c
结果:
12345678910111213141516171819TranslationUnitDecl 0x248a788 <<invalid sloc>> <invalid sloc>|-TypedefDecl 0x248b020 <<invalid sloc>> <invalid sloc> implicit __int128_t '__i ...
单词接龙
昨夜松边醉倒,问松我醉何如。只疑松动要来扶,以手推松曰去。
辛弃疾《西江月·遣兴》
题目描述
洛谷链接 https://www.luogu.com.cn/problem/U214783
相信大家都玩过成语接龙的游戏,比如说心心相印->印贼做父->父相伤害->… 我们可以将它们拼接起来,如心心相印贼做父相伤害。
为了简化问题,避免处理宽字符,下面我们用英文单词来模拟这一过程。规定如果一个单词aaa的最后一个字符和另一个单词bbb的第一个字符相同,则可以将单词bbb接在单词aaa的后面。且拼接后的结果衔接部分只出现一次,并大写。
比如说单词 abandon 和单词 navie 就可以拼接,因为 abandon 的最后一个字母与 navie 的第一个字母相同,都为n。于是得到拼接后的结果为 abandoNaive 。
下面给出nnn个单词,请判断这些单词是否能够拼接成一个环。要求每个单词都必须使用且只能使用一次。
本题采用spj。spj代码会在最后给出。
输入
第一个数单词个数nnn。
接下来nnn个单词,用空格隔开。
输出
一个字符串,表示拼接后的结果,如果不能 ...
匈奴犯境
忆对中秋丹桂丛,花在杯中,月也杯中。今宵楼上一尊同,云湿纱窗,雨湿纱窗。
浑欲乘风问化工,路也难通,信也难通。满堂唯有烛花红,杯且从容,歌且从容。
辛弃疾《一剪梅·中秋元月》
题目描述
洛谷链接: https://www.luogu.com.cn/problem/U135410
本题采用spj,spj代码在最后给出。
中国某西域重镇遭到了匈奴的入侵,该城池有nnn道城门,于是,匈奴单于将军队分为了nnn个部分,每个部分攻打一个城门。匈奴军队单位时间攻城对城池造成的损失等于攻城的人数。
城内的中国将士力量薄弱,只能坚守,不能出战,守城的主帅向朝廷告急。由于该城池关系到丝绸之路的繁荣,皇帝决定派大军救援。但由于军队的集结和动员需要时间,于是命令附近的城池先派遣一队骑兵来协助,帮助城内的守军坚持到援军的到来。
前来协助的骑兵的力量不足以同时对抗匈奴大军,但面对每个城门下的匈奴攻城部队则有绝对的力量优势。并且由于匈奴轻而不整,贪而无亲,胜不相让,败不相救。于是当前来协助的骑兵歼灭一股攻城力量的时候,其他的攻城力量不会前来救援,而是继续攻城。
假设你是这队前来救援的骑兵的统帅,请你制定出战斗方案 ...
链表排序
晚日寒鸦一片愁。柳塘新绿却温柔。若教眼底无离恨,不信人间有白头。
肠已断,泪难收。相思重上小红楼。情知已被山遮断,频倚阑干不自由。
辛弃疾《鹧鸪天·代人赋》
题目描述
leetcode链接: https://leetcode-cn.com/problems/insertion-sort-list/
简而言之,就是对链表进行排序
示例1
输入:[4,2,1,3]
输出:[1,2,3,4]
示例2
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]
链表定义以及接口函数签名
rustcppjava
123456789101112131415161718192021#[derive(PartialEq, Eq, Clone, Debug)]pub struct ListNode { pub val: i32, pub next: Option<Box<ListNode>>}impl ListNode { #[inline] fn new(val ...
逆序对
帘外雨潺潺,春意阑珊。罗衾不耐五更寒。梦里不知身是客,一晌贪欢。
独自莫凭栏,无限江山。别时容易见时难。流水落花春去也,天上人间。
题目描述
leetcode链接: https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
示例
输入: [7,5,6,4]
输出: 5
数据范围
0≤数组长度≤500000 \leq 数组长度 \leq 50000
0≤数组长度≤50000
具体实现
rustcpp
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849impl Solution { pub fn reverse_pairs_2(nums: &mut [i32]) -> i32 ...
翻转对
唱彻《阳关》泪未干,功名馀事且加餐。浮天水送无穷树,带雨云埋一半山。
今古恨,几千般,只应离合是悲欢。江头未是风波恶,别有人间行路难!
辛弃疾《鹧鸪天·送人》
题目描述
leetcode链接: https://leetcode-cn.com/problems/reverse-pairs/
给定一个数组 numsnumsnums ,如果 i<ji < ji<j 且 nums[i]>2∗nums[j]nums[i] > 2*nums[j]nums[i]>2∗nums[j] 我们就将 (i,j)(i, j)(i,j) 称作一个重要翻转对。
你需要返回给定数组中的重要翻转对的数量。
示例1
输入:[1,3,2,3,1]
输出:2
示例2
输入:[2,4,3,5,1]
输出:3
问题分析
本题宜采用分治算法。对于数组numsnumsnums,将其分为两半,不妨令左半段为leftleftleft,右半段为rightrightright。
最终结果为leftleftleft、rightrightright中的翻转对数量之和,加上横跨leftleftleft ...